我想检查变量的当前值是否为“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);
##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
和$past
§16.12.6含义描述|->
和|=>