Inter & Intra Delay 与 Verilog 中的 Blocking & NBA 混淆
Inter & Intra Delay Confusion with Blocking & NBA in Verilog
这是代码。
module temp();
bit a;
bit w_inter_nonblocking, x_inter_blocking, y_intra_blocking, z_intra_nonblocking;
always @ (a)
begin
$display("@%0t : Blocking x_inter_blocking", $time());
#7 x_inter_blocking = a;
end
always @ (a)
begin
$display("@%0t : Nonblocking w_inter_nonblocking", $time());
#7 w_inter_nonblocking <= a;
end
always @ (a)
begin
$display("@%0t : Nonblocking z_intra_nonblocking", $time());
z_intra_nonblocking <= #7 a;
end
always @ (a)
begin
$display("@%0t : Blocking y_intra_blocking", $time());
y_intra_blocking = #7 a;
end
initial
forever #5 a = $random();
initial
#150 $finish();
// initial
// #40 disable karan;
initial
begin
$dumpvars(0, temp);
$dumpfile("temp.vcd");
end
endmodule
这里是对应的打印语句和波形。
@10 : Nonblocking z_intra_nonblocking
@10 : Blocking x_inter_blocking
@10 : Nonblocking w_inter_nonblocking
@10 : Blocking y_intra_blocking
@40 : Nonblocking z_intra_nonblocking
@40 : Blocking x_inter_blocking
@40 : Nonblocking w_inter_nonblocking
@40 : Blocking y_intra_blocking
@45 : Nonblocking z_intra_nonblocking
@55 : Nonblocking z_intra_nonblocking
@55 : Blocking x_inter_blocking
@55 : Nonblocking w_inter_nonblocking
@55 : Blocking y_intra_blocking
@60 : Nonblocking z_intra_nonblocking
@70 : Nonblocking z_intra_nonblocking
@70 : Blocking x_inter_blocking
@70 : Nonblocking w_inter_nonblocking
@70 : Blocking y_intra_blocking
@75 : Nonblocking z_intra_nonblocking
@80 : Nonblocking z_intra_nonblocking
@80 : Blocking x_inter_blocking
@80 : Nonblocking w_inter_nonblocking
@80 : Blocking y_intra_blocking
@85 : Nonblocking z_intra_nonblocking
@90 : Nonblocking z_intra_nonblocking
@90 : Blocking x_inter_blocking
@90 : Nonblocking w_inter_nonblocking
@90 : Blocking y_intra_blocking
@95 : Nonblocking z_intra_nonblocking
@105 : Nonblocking z_intra_nonblocking
@105 : Blocking x_inter_blocking
@105 : Nonblocking w_inter_nonblocking
@105 : Blocking y_intra_blocking
@110 : Nonblocking z_intra_nonblocking
@115 : Nonblocking z_intra_nonblocking
@115 : Blocking x_inter_blocking
@115 : Nonblocking w_inter_nonblocking
@115 : Blocking y_intra_blocking
@130 : Nonblocking z_intra_nonblocking
@130 : Blocking x_inter_blocking
@130 : Nonblocking w_inter_nonblocking
@130 : Blocking y_intra_blocking
@135 : Nonblocking z_intra_nonblocking
@140 : Nonblocking z_intra_nonblocking
@140 : Blocking x_inter_blocking
@140 : Nonblocking w_inter_nonblocking
@140 : Blocking y_intra_blocking
如您所见,只有带非阻塞分配的 Intra Delay 提供延迟输出,其余所有 delays/assignments 提供不同的输出。
我知道 Inter/Intra 延迟之间的区别,但是似乎 always 块不会在替代事件上触发(延迟 #7
,如果任何信号变化发生 < #7
延迟)。然而,NBA 的 Intra Delay 总是阻止正确触发。
有人可以帮我吗?
always @(expression) statement
并不意味着每次 expression
更改时都执行 statement
。这意味着等待 expression
改变,执行 statement
,然后重复返回等待 expression
改变。
问题是当表达式在执行语句的过程中发生变化时,变化丢失了。您只能等待在您开始等待 之后发生的变化。
这和我之前回答的 是同一个问题。
这是代码。
module temp();
bit a;
bit w_inter_nonblocking, x_inter_blocking, y_intra_blocking, z_intra_nonblocking;
always @ (a)
begin
$display("@%0t : Blocking x_inter_blocking", $time());
#7 x_inter_blocking = a;
end
always @ (a)
begin
$display("@%0t : Nonblocking w_inter_nonblocking", $time());
#7 w_inter_nonblocking <= a;
end
always @ (a)
begin
$display("@%0t : Nonblocking z_intra_nonblocking", $time());
z_intra_nonblocking <= #7 a;
end
always @ (a)
begin
$display("@%0t : Blocking y_intra_blocking", $time());
y_intra_blocking = #7 a;
end
initial
forever #5 a = $random();
initial
#150 $finish();
// initial
// #40 disable karan;
initial
begin
$dumpvars(0, temp);
$dumpfile("temp.vcd");
end
endmodule
这里是对应的打印语句和波形。
@10 : Nonblocking z_intra_nonblocking
@10 : Blocking x_inter_blocking
@10 : Nonblocking w_inter_nonblocking
@10 : Blocking y_intra_blocking
@40 : Nonblocking z_intra_nonblocking
@40 : Blocking x_inter_blocking
@40 : Nonblocking w_inter_nonblocking
@40 : Blocking y_intra_blocking
@45 : Nonblocking z_intra_nonblocking
@55 : Nonblocking z_intra_nonblocking
@55 : Blocking x_inter_blocking
@55 : Nonblocking w_inter_nonblocking
@55 : Blocking y_intra_blocking
@60 : Nonblocking z_intra_nonblocking
@70 : Nonblocking z_intra_nonblocking
@70 : Blocking x_inter_blocking
@70 : Nonblocking w_inter_nonblocking
@70 : Blocking y_intra_blocking
@75 : Nonblocking z_intra_nonblocking
@80 : Nonblocking z_intra_nonblocking
@80 : Blocking x_inter_blocking
@80 : Nonblocking w_inter_nonblocking
@80 : Blocking y_intra_blocking
@85 : Nonblocking z_intra_nonblocking
@90 : Nonblocking z_intra_nonblocking
@90 : Blocking x_inter_blocking
@90 : Nonblocking w_inter_nonblocking
@90 : Blocking y_intra_blocking
@95 : Nonblocking z_intra_nonblocking
@105 : Nonblocking z_intra_nonblocking
@105 : Blocking x_inter_blocking
@105 : Nonblocking w_inter_nonblocking
@105 : Blocking y_intra_blocking
@110 : Nonblocking z_intra_nonblocking
@115 : Nonblocking z_intra_nonblocking
@115 : Blocking x_inter_blocking
@115 : Nonblocking w_inter_nonblocking
@115 : Blocking y_intra_blocking
@130 : Nonblocking z_intra_nonblocking
@130 : Blocking x_inter_blocking
@130 : Nonblocking w_inter_nonblocking
@130 : Blocking y_intra_blocking
@135 : Nonblocking z_intra_nonblocking
@140 : Nonblocking z_intra_nonblocking
@140 : Blocking x_inter_blocking
@140 : Nonblocking w_inter_nonblocking
@140 : Blocking y_intra_blocking
如您所见,只有带非阻塞分配的 Intra Delay 提供延迟输出,其余所有 delays/assignments 提供不同的输出。
我知道 Inter/Intra 延迟之间的区别,但是似乎 always 块不会在替代事件上触发(延迟 #7
,如果任何信号变化发生 < #7
延迟)。然而,NBA 的 Intra Delay 总是阻止正确触发。
有人可以帮我吗?
always @(expression) statement
并不意味着每次 expression
更改时都执行 statement
。这意味着等待 expression
改变,执行 statement
,然后重复返回等待 expression
改变。
问题是当表达式在执行语句的过程中发生变化时,变化丢失了。您只能等待在您开始等待 之后发生的变化。
这和我之前回答的