8. 比较下面代码,分别综合出什么,可能出现什么问题
module dff_en(I_en, I_data, I_clock, O_data);
input I_clock;
input I_en;
input I_data;
output O_data;
reg R_data;
assign O_data = R_data;
always @(I_clock)
begin
if (I_en == 1) R_data <= I_data;
end
endmodule
有以下告警(用synplify综合)
(1) Incomplete sensitivity list - assuming completeness
(2) Referenced variable I_en is not in sensitivity list
(3) Referenced variable I_data is not in sensitivity list
(4) Latch generated from always block for signal
如果改always @(I_clock)为always @(posedge I_clock)就可以避免,并产生一个带使能的DFF
9. 下面逻辑有没有问题?
module dff_en(I_reset1, I_reset2, I_data, I_clock, O_data);
input I_clock;
input I_reset1;
input I_reset2;
input I_data;
output O_data;
reg R_data;
assign O_data = R_data;
always @(negedge I_reset1 or posedge I_clock) // 敏感变量I_reset2在时钟
begin
if (I_reset1 == 0) R_data <= 0;
else if (I_reset2 == 0) R_data <= 1;
else R_data <= I_data;
end
endmodule
综合时不会有告警,产生一个带复位和置位的DFF,最好改always @(negedge I_reset1 or posedge I_clock)为always @(negedge I_reset1 or negedge I_reset2 or posedge I_clock)
10.逻辑综合结果是什么?
module mux2s1(I_sel, I_a, I_b, O_c, O_d)
input I_sel, I_a, I_b;
output O_c, O_d;
reg R_c;
reg R_d;
assign O_c = R_c;
assign O_d = R_d;
always @(I_sel, I_a, I_b)
begin
case (I_sel)
1'b0: R_c = I_a; // 综合出latch
1'b1: R_d = I_b; // latch
endcase
end
endmodule
该逻辑将产生锁存器。
11.下面代码综合结果是什么?
module dff_sys(I_clock, I_data, O_data);
input I_clock, I_data;
output O_data;
reg R_b, R_c, R_d;
always @(posedge I_clock)
begin
R_c = R_b;
R_b = I_data;
R_d <= R_c;
end
endmodule
module dff_sys(I_clock, I_data, O_data);
input I_clock, I_data;
output O_data;
reg R_b, R_c, R_d;
always @(posedge I_clock)
begin
R_c = R_b;
R_d <= R_c;
R_b = I_data;
end
endmodule
两段逻辑都没有任何区别,综合电路如下,这也说明了non-block语句的特点 |