阻止/阻止延迟

时间:2014-10-17 02:58:55

标签: verilog

我现在对一段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)。

1 个答案:

答案 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