System verilog 带或(| |)的Systemverilog属性含义未按预期工作?

System verilog 带或(| |)的Systemverilog属性含义未按预期工作?,system-verilog,system-verilog-assertions,System Verilog,System Verilog Assertions,我正在尝试编写sytemverilog断言,以确定时钟周期(140MHz),任意+或-值为0.001ns,在这个systemverilog属性中,使用了“或”运算符(| |)来表示+/-偏差/时间周期的变化,但输出不符合预期,有人能解释这一情况的确切原因吗?,对于clk_prd的任何值,断言都会被断言,这与预期不符,还请说明这方面的最佳解决方案是什么 下面的代码片段 module clock_gen(); timeunit 1ns; timeprecision 100ps;

我正在尝试编写sytemverilog断言,以确定时钟周期(140MHz),任意+或-值为0.001ns,在这个systemverilog属性中,使用了“或”运算符(| |)来表示+/-偏差/时间周期的变化,但输出不符合预期,有人能解释这一情况的确切原因吗?,对于clk_prd的任何值,断言都会被断言,这与预期不符,还请说明这方面的最佳解决方案是什么

下面的代码片段

module clock_gen();
    timeunit 1ns;
    timeprecision 100ps;  
    bit clk;
    realtime clk_prd =1000/340.0ns; //2.9411764
    //realtime clk_prd =1000/140.0ns; //7.1428571
    property SVA_clk(real clk_prd);
      time current_time;
      (('1,current_time=$realtime) |=> 
        (clk_prd <= $realtime-(current_time - 0.001ns)) ||
        (clk_prd >= $realtime-(current_time + 0.001ns))); 
    endproperty

    assert_period:assert property (@(posedge clk)SVA_clk(clk_prd))
      $display("clk pass : %0t ",$realtime); 
    else
      $warning("clk fail : %0t",$realtime);
    initial forever #7.1428 clk=!clk; 
    initial begin 
      repeat(15) @(posedge clk); 
      $finish; 
    end
    endmodule : clock_gen
预期产量

clk fail : 213 
clk fail : 355 
clk fail : 497 
clk fail : 639 
clk fail : 781 
clk fail : 923 
clk fail : 1065 
clk fail : 1207 
clk fail : 1349 
clk fail : 1491 
clk fail : 1633 
clk fail : 1775 
clk fail : 1917  

(请参阅)

您的代码存在许多问题

  • 对于写入的代码,
    timeprecision
    应为
    1ps
  • current\u time
    应声明为
    realtime
  • 您的时钟生成器周期为14.2,但您应该编写
    #(7.1428ns/2)
  • 您可以将
    +/-
    反转,也可以将
    =
    反转

  • 我想你把逻辑表达式搞乱了。您是否正在检查
    cllk_prd-0.01
    clk_prd+0.01
    之间的差异?@Serge这是为了检查时钟可以偏离的可接受范围,因为#(7.1428ns/2)被您设置为0.1ns的时间精度截断。(100ps)非常感谢您提供的详细信息@daveI仍然不明白为什么时间精度应该是1ps,而要求的是3位精度,您能详细说明一下吗?感谢您指出问题所在,按照第1点、第2点、第3点进行更改(不应错过),并将第4点替换为或(| |)为&&,之后它将按预期工作。@Emman time被四舍五入到
    timeprecision
    的精度。如果设置为100ps,则7.1428ns四舍五入为7.1ns。如果设置为1ps,则7.1428ns四舍五入为7.143ns。您的检查器正在查找±0.001ns(又称±1ps)的余量。因此,您的时间精度必须为1ps或更小。
    clk fail : 213 
    clk fail : 355 
    clk fail : 497 
    clk fail : 639 
    clk fail : 781 
    clk fail : 923 
    clk fail : 1065 
    clk fail : 1207 
    clk fail : 1349 
    clk fail : 1491 
    clk fail : 1633 
    clk fail : 1775 
    clk fail : 1917