Systemverilog 断言信号在仿真期间至少出现 1 次为真

Systemverilog assertion a signal is true at least 1 occurence during the simulation

我在尝试编写此断言时遇到了问题。我试图断言信号 B 必须至少在信号 A 为真后出现 1 次为真。

我写的断言如下:

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

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

example: started at xxxxxxps not finished

模拟到最后似乎断言还没有结束。

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

我也试过用strong()操作,也没用。

如何解决这个问题?

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

我认为你的解决方案是这样的:

  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