我对Verilog有点陌生。我知道在时钟进程中,我们应该使用非阻塞分配,而在非时钟进程中,我们应该使用阻塞分配。
当我阅读别人的代码时,我遇到了这段代码。
reg iowrb_int,iowrb_met;
reg iordb_int,iordb_met;
always@(*)
begin
iowrb_int <= iowrb_met;
iordb_int <= iordb_met;
iowrb_met <= iowr_bar;
iordb_met <= iord_bar;
end
我真的不确定上面的代码!我认为它没有进行任何注册,对吗?在always @(*)语句中具有非阻塞性意味着什么吗?
在always @(*)语句中使用阻塞与非阻塞有什么区别吗?
最佳答案
主要区别在于:
阻塞赋值在下一个赋值之前执行,即它阻塞了下一条语句的执行。
非阻塞分配是并行执行的,即它们不会阻塞其后的语句的执行。
假设a = 2和b = 3然后是非阻塞分配:
a <= 4;
b <= a;
得出a = 4和b = 2-赋值前a的值
但
a = 4;
b = a;
阻塞分配完成后,将得出a = 4和b = 4-a的值。
与组合逻辑相比,将变量综合到寄存器(锁存器或触发器)的方法取决于Always模块的敏感度列表。它不依赖于阻塞分配或非阻塞分配。
例如:
always @(*) begin
if (enable)
q = d;
end
这将导致D锁存,因为在enable == 0时未指定对q的分配,因此需要记住最后一次分配。
而
always @(*) begin
if (enable)
q = d;
else
q = f;
end
这将导致多路复用(组合逻辑),因为在两种启用情况下都指定了对q的分配,因此q无需记住任何内容。