问题描述
所以我记得当断言触发时,断言中的数据信号来自时钟边沿之前。
我想在我的断言中添加一个有用的错误消息,让用户知道出了什么问题,但是当 $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
。稍后当您开始运行回归并获得覆盖率报告时,您会感谢我。