Systemverilog断言信号在模拟期间至少出现1次

时间:2018-05-30 09:05:24

标签: verilog system-verilog system-verilog-assertions

我在尝试编写这个断言时遇到了一个问题。我试图在信号B为真之后断言信号A必须至少为1的情况。

我写的断言如下:

example  : assert property(
       @(posedge clk) disable iff(reset)
       A |-> ##[0:$] B[->1]) else `uvm_error(....)

问题是,如果在B为真之后模拟信号A期间永远不为真,则不执行uvm_error。我预计它会被执行,模拟会报告消息:

example: started at xxxxxxps not finished

即使模拟到达终点,似乎断言也没有完成。

我在谷歌中查了一下,有一个类似的问题: Assertion to check for the toggle (0->1) of a signal

我也试过使用strong()操作,它也没有帮助。

如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

不幸的是,您的解决方案取决于您使用的模拟器。我尝试了四个,每个都有不同的行为。

我认为你的解决方案是:

  example3  : assert property(
       @(posedge clk) disable iff(reset)
    A |-> s_eventually B)
    else 
      $error("%t - Assertion example3 failed", $time);

基于它在两个模拟器上工作以及我对SVA的理解。在一个模拟器上,操作块中的$error语句实际上已被执行,消息" Assertion example3 failed"被展示;在另一个中显示一般错误消息。

s_代表" strong"。断言意味着B必须在模拟结束之前的某个时间发生。

这是MCVE。如果你包含这样的东西,你的问题会更容易回答。

module M;

  bit stop;  bit clk; initial while (!stop) #5 clk = ~clk;

  bit A, B;

  initial begin
    #20 A = 1;
    #10 A = 0;
    // #10 B = 1;
    #10 B = 0;
    #50 stop = 1;
  end

  example1  : assert property(
       @(posedge clk)
    A |-> B[->1]) 
    else 
      $error("%t - Assertion example1 failed", $time);

  example2  : assert property(
       @(posedge clk)
    A |-> eventually [0:7] B)
    else 
      $error("%t - Assertion example2 failed", $time);

  example3  : assert property(
       @(posedge clk)
    A |-> s_eventually B)
    else 
      $error("%t - Assertion example3 failed", $time);

   final
     $display("Finished!");

endmodule

https://www.edaplayground.com/x/2RtF