我现在被一段Verilog代码搞糊涂了,它的那种测试阻塞或非阻塞分配的特性结合了延迟模型。
代码在EDA游乐场下面
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我想知道为什么总是@(x,y)不是在时隙2和4触发的。
发布于 2014-10-17 12:11:09
你把x,y,z声明为1位。因此,当设置为2时,您只能得到2'b10的LSB (位0)。
如果您只是测试延迟建模,那么使用整数而不是reg。
integer x,y,z;您现在应该会看到高于1的值。这是EDA游乐场上的一个更新的示例。
如果我把你的显示器更新为显示器
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 @* beginhttps://stackoverflow.com/questions/26417206
复制相似问题