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

Always block instead of assign, simulated in 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      

将上述代码逻辑与分配一起使用,而不是始终阻塞。

上面的代码会产生latch吗?在什么情况下它会产生一个闩锁?使用2个代码会有延迟差异吗?

PS 我们正在尝试创建一个 2 位二进制乘法器,它输出到 7 段显示器。 谢谢。

当通过条件语句的一条或多条路径未分配时,会生成锁存器。例如:

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 的两半。

至于延迟,case 与 assign 应该创建相同的网表,因此它们应该产生相似或相同的结果,前提是它们在逻辑上是相同的。

(附带说明,最好使用 always@(*),而不是 always @ (a1,a0,b1,b0);综合工具可以计算出正确的敏感度列表。)