我试图在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 和
使用上面的代码逻辑进行赋值,而不是始终阻塞。
上面的代码会产生锁存器吗?在这种情况下,它会产生一个锁存器吗?使用这两种代码会有什么延迟吗?
PS我们正在尝试创建一个2位二进制乘法器,它输出到一个7段显示。谢谢。
发布于 2016-02-09 19:15:12
当一个或多个通过条件语句的路径未被分配时,就会产生锁存。例如:
reg [1:0] a;
reg b;
always@(*)
case (a)
0: b=0;
1: b=0;
2: b=1;
endcase将生成一个锁存器,因为我没有涵盖a=3的情况。您可以通过显式地覆盖每一种情况(就像您所做的那样)或使用default案例来避免这种情况。
对于赋值语句,这取决于您如何设置它们的格式,但是您不太可能意外地推断锁锁。例如,如果您使用三元操作(即assign b = a? 1:0;),则将推断出if的两部分。
至于延迟,大小写和赋值应该创建相同的netlist,所以它们应该产生相似或相同的结果,只要它们在逻辑上是相同的。
(顺便指出,使用always@(*)__而不是always @ (a1,a0,b1,b0)__是一个很好的实践;合成工具可以计算出正确的灵敏度列表。)
https://stackoverflow.com/questions/35299935
复制相似问题