我正在尝试在Verilog中编码和合成。有时我仍然对使用Verilog作为典型的C类编程语言感到困惑,我试图理解两个不同代码之间是否存在差异:
always @ (a1,a0,b1,b0)
begin
case ({a1,a0,b1,b0})
4'b0000 : s= 7'b1110111 ;
4'b0001 : s= 7'b1110111 ;
....
....
4'b1110 : s= 7'b0101111 ;
4'b1111 : s= 7'b1111010 ;
endcase
end
和
使用上面的代码逻辑和assign,而不是总是阻塞。
上面的代码会生成一个锁存器吗?在哪种情况下它会生成一个锁存器?使用2个代码之间会有任何延迟差异吗?
PS我们正在尝试创建一个2位二进制乘法器,输出到7段显示器。 谢谢。
答案 0 :(得分:3)
通过条件语句的一个或多个路径未分配时生成锁存器。例如:
reg [1:0] a;
reg b;
always@(*)
case (a)
0: b=0;
1: b=0;
2: b=1;
endcase
会生成一个锁存器,因为我没有覆盖a = 3的情况。你可以通过明确地覆盖每个案例(就像你看到的那样)或使用default
案例来避免这种情况。
对于assign语句,它取决于你如何格式化它们,但你不太可能意外地推断出一个锁存器。例如,如果您进行三元操作(即assign b = a? 1:0;
),则会推断出if
的两半。
至于延迟,案例与分配应该创建相同的网表,因此如果它们在逻辑上相同,它们应该产生相似或相同的结果。
(作为旁注,最好使用always@(*)
,而不是always @ (a1,a0,b1,b0)
;综合工具可以找出正确的敏感度列表。)