sva 事件调度与 $display/uvm_error

问题描述

所以我记得当断言触发时,断言中的数据信号来自时钟边沿之前。

我想在我的断言中添加一个有用的错误消息,让用户知道出了什么问题,但是当 $display() 发生时,数据已经改变了。

例如,当发生就绪/有效握手时,只要 data=0,下面的断言就会失败。但是,如果断言触发时巧合有数据的上升沿,则打印的 $display 将显示 data=1。

  default clocking CLK @(posedge clk);
  endclocking
  //Assertion triggers an error if data is not = 1 when new data is clocked into the DUT.
  POS_DATA: assert property ((ready & valid) |-> data) else $display("[%t] POS_DATA fail data:%d",$time,data);

有没有更好的方法来编码这个断言?

创建了一个 EDAPlayground Example,看起来所有模拟器都在做同样的事情,所以似乎是我的错。

解决方法

您需要做的就是添加$sampled(data)

POS_DATA: assert property ((ready & valid) |-> data) else $error(" POS_DATA fail data:%d",$sampled(data));

您应该使用 $error 而不是 $display。稍后当您开始运行回归并获得覆盖率报告时,您会感谢我。