为什么icarus verilog不遵守规定时间?

为什么icarus verilog不遵守规定时间?,verilog,system-verilog,icarus,Verilog,System Verilog,Icarus,我对“指定”的理解是,它控制从输入到输出的传播延迟 所以 我希望下面的代码显示“o”在118时变化,即当“b”变化时,108后的10个时间单位 但“b”变化被纳入115,即a变化后的10个单位 >A T= 0 a 0 b 0 o x >B T= 0 a 0 b 0 o x O T= 10 a 0 b 0 o 0 >A T= 105 a 1 b 0 o 0 >B T= 108 a 1 b 1 o 0

我对“指定”的理解是,它控制从输入到输出的传播延迟

所以

我希望下面的代码显示“o”在118时变化,即当“b”变化时,108后的10个时间单位 但“b”变化被纳入115,即a变化后的10个单位

>A T=   0  a  0  b  0  o  x
>B T=   0  a  0  b  0  o  x
 O T=  10  a  0  b  0  o  0
>A T= 105  a  1  b  0  o  0
>B T= 108  a  1  b  1  o  0
 O T= 115  a  1  b  1  o  2
我本以为

>A T=   0  a  0  b  0  o  x
>B T=   0  a  0  b  0  o  x
 O T=  10  a  0  b  0  o  0
>A T= 105  a  1  b  0  o  0
>B T= 108  a  1  b  1  o  0
 O T= 115  a  1  b  1  o  1
 O T= 118  a  1  b  1  o  2
我是否误解了“指定”

=========

更新

两种选择似乎都是我所期望的 见下文和

有没有更好的方法让单个输入到输出的传播延迟发挥作用

顺便说一句,这个问题实际上是一个更复杂的用例的一部分,这个问题的动机是。 我正在创建一个74HCT151的定时模型,希望定时准确,因为我希望生成发布的定时所暗示的解决问题


我是否应该为此单独提出一个问题?

指定路径延迟有两种形式;并联
a=>o
和全连接
a*>o
。并行连接与写入
A[0]=>o[0]
A[1]=>o[1]
相同。没有来自
a[0]=>o[1]
的路径,与
b[0]=>o[1]
的路径相同

在您的测试用例中,您正在更改
a[0]
b[0]
,但是
o[1]
正在更改,因为没有路径,所以存在0延迟。另外,第30.7节说

两个连续的计划转换在时间上比 模块路径延迟被视为脉冲。默认情况下,模块上的脉冲 路径输出被拒绝

这就是为什么
o
直接从
0
转到
2
的原因。您需要使用完全连接

顺便说一句,在将
=>
更改为
*>
时,我无法让Icarus Verilog登录以匹配您的结果或给我正确的结果,但所有其他模拟器都工作正常


更新
您的选项1过滤输入故障。如果
a
b
的故障少于10个时间单位,则这些故障将被过滤掉。您的选项2将通过所有输出故障,即使是0个延迟故障。如果你想进行真实的脉冲过滤,你必须使用
指定
路径延迟和
$PATHPULSE
,显然iverilog没有正确执行。

嗨,请尝试一下-我做了更改,但结果相同。。。edaplayde.com/x/eBUYSee我的更新。EDAPlaygroud上的所有4个商用模拟器都正确实现了路径延迟。艾维洛格没有。谢谢戴夫。我不确定你所说的“0脉冲延迟”是什么意思,但似乎我能做的对小故障敏感的最好方法是使用第二种方法?如果你有耐心的话,你介意看看这个…-这是我问题的原始背景。
module check(a,b,o);
  output wire [1:0] o;
  input [1:0]  a,b;

specify
    ( a => o ) = 10;
    ( b => o ) = 10;
endspecify

  assign o = a + b;

  always @ (a)
    $display (">A T=%4t  a %2d  b %2d  o %2d ", $time, a, b, o);
  always @ (b)
    $display (">B T=%4t  a %2d  b %2d  o %2d ", $time, a, b, o);
  always @ (o)
    $display (" O T=%4t  a %2d  b %2d  o %2d ", $time, a, b, o);

endmodule

module test;

  wire [1:0] o;
  logic [1:0] a,b;

  check t1(.a,.b,.o);


  initial begin
    a = 0;
    b = 0;
  end
  initial begin
    #105 a = 1;
  end
  initial begin
    #108 b = 1; // I EXPECT o TO CHANGE AS 108+10 BUT IT CHANGES AT 115
  end

endmodule
module check(a,b,o);
  output reg [1:0] o;
  input [1:0]  a,b;

  // OPTION 1 - put the delays on the individual wires
  wire #10 a_delayed = a;
  wire #10 b_delayed = b;
  assign o = a_delayed + b_delayed;

  
  // OPTION 2
  // Use non-blocking with RHS delay as per https://www-inst.eecs.berkeley.edu/~cs152/fa06/handouts/CummingsHDLCON1999_BehavioralDelays_Rev1_1.pdf
  //  always @* 
  //    o <= #10 a + b;
  
  always @ (a)
    $display (">A T=%4t  a %2d  b %2d  o %2d ", $time, a, b, o);
  always @ (b)
    $display (">B T=%4t  a %2d  b %2d  o %2d ", $time, a, b, o);
  always @ (o)
    $display (" O T=%4t  a %2d  b %2d  o %2d ", $time, a, b, o);

endmodule
>A T=   0  a  0  b  0  o  x 
>B T=   0  a  0  b  0  o  x 
 O T=  10  a  0  b  0  o  0 
>A T= 105  a  1  b  0  o  0 
>B T= 108  a  1  b  1  o  0 
 O T= 115  a  1  b  1  o  1 
 O T= 118  a  1  b  1  o  2