始终阻塞而不是分配,在 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)
;综合工具可以计算出正确的敏感度列表。)
我正在尝试在 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)
;综合工具可以计算出正确的敏感度列表。)