始终阻止而不是分配,在FPGA中模拟

时间:2016-02-09 18:52:22

标签: verilog fpga

我正在尝试在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段显示器。 谢谢。

1 个答案:

答案 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);综合工具可以找出正确的敏感度列表。)