我想检查变量的当前值是否为'1',然后变量的先前值应为'0'。我在System Verilog Assertions中使用$ past。在这里,我检查cal_frame_mode = 1,然后它是cal_frame_mode = 0的先前值。我的代码如下。但是,我看到断言失败了。当我检查波形时,它的行为正确。断言标志在第一次检查后2个时钟。如何在检查一个时钟周期后停止此断言?。
property p_NOP_2_RX_CAL;
@(posedge clk)
(cal_frame_mode==3'b001) |-> ##2 $past(cal_frame_mode)==3'b000;
endproperty
assert_nop2cal : assert property(p_NOP_2_RX_CAL);
答案 0 :(得分:2)
##2
表示等待两个时钟。默认值$past
查看从当前时钟返回的表达式的值(默认情况下,这是属性中定义的时钟)。因此:
(cal_frame_mode==3'b001) |-> ##2 $past(cal_frame_mode)==3'b000;
相当于:
(cal_frame_mode==3'b001) |-> ##1 cal_frame_mode==3'b000;
你想要的是:(cal_frame_mode==3'b001) |-> $past(cal_frame_mode)==3'b000;
但我猜你有##2
的原因是过滤cal_frame_mode
等于两个时钟。如果是这样,那么更好的解决方案是向前提添加$change
或!$stable
,这仅在cal_frame_mode
更改且当前值为1时执行检查。
$changed(cal_frame_mode) && (cal_frame_mode==3'b001) |-> $past(cal_frame_mode)==3'b000;
断言记录在IEEE Std 1800-2012§16断言中
§16.9.3采样值函数描述$sample
,$rose
,$fell
,$stable
,$changed
和{{1}详细的
§16.12.6含义描述$past
和|->