我现在对一段Verilog代码感到困惑,它对阻塞或非阻塞分配功能的测试与Delay模型相结合。
代码低于EDA Playground:
module cl_tb;
reg x,y,z;
initial begin
x = 2;
#4;
y <= #9 x;
x = 1;
#50 $stop;
end
initial begin
$monitor("%0t,%d,%d,%d",$time,x,y,z);
end
always @(x,y) begin
z = # 2 x+y;
end
endmodule
根据Verilog分层事件的手工计算,我可以得到结果 时间:X值,Y值,Z值低于:
0: 2,x,x
2: 2,0,2
4: 1,0,2
6: 1,0,1
13: 1,2,1
15: 1,2,3
然而,模拟结果是:
0,0,x,x
4,1,x,x
13,1,0,x
15,1,0,1
我想知道为什么永远不会在时间段2和4触发@(x,y)。
答案 0 :(得分:2)
您已将x,y,z声明为1位。所以当设置为2时,你只能获得2'b10的LSB(第0位)。
如果你只是测试延迟建模,那么使用整数而不是reg。
integer x,y,z;
您现在应该看到高于1的值。EDA playground上的更新示例。
如果我将显示器更新为显示器
initial begin
forever begin
$display("%3t: %2d, %2d, %2d",$realtime, x, y, z);
#2;
end
end
我在#2
没有得到相同的结果,但是如果我们将循环延迟更改为#1
,它看起来像是按预期工作。我试图强制使用`timescale
,但这并不能解决问题。
# KERNEL: 0: 2, 0, 0
# KERNEL: 1: 2, 0, 0
# KERNEL: 2: 2, 0, 2 //<-- update at time 2
注意:自动灵敏度列表有助于最大限度地减少RTL与门模拟不匹配。
always @(a,b) begin
成为
always @* begin