使用或(||)的Systemverilog属性含义是否按预期工作?

时间:2017-07-25 12:35:25

标签: system-verilog system-verilog-assertions

我正在尝试用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 pass : 213 
clk pass : 355 
clk pass : 497 
clk pass : 639 
clk pass : 781 
clk pass : 923 
clk pass : 1065 
clk pass : 1207 
clk pass : 1349 
clk pass : 1491 
clk pass : 1633 
clk pass : 1775 
clk pass : 1917 

预期输出

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  

(来自link

1 个答案:

答案 0 :(得分:1)

您的代码存在很多问题

  1. timeprecision应该在1ps中,代码为
  2. current_time应声明为realtime
  3. 您的时钟生成器周期为14.2,但您应该已写入#(7.1428ns/2)
  4. 您要么+/-撤消,要么<=/>=撤消。