System verilog $past在系统Verilog断言中的使用
我想检查变量的当前值是否为“1”,然后变量的上一个值应为“0”。我在系统Verilog断言中使用$pass。在这里,我检查如果cal_frame_mode=1,那么它是cal_frame_mode的上一个值=0。我的代码如下。然而,我看到断言失败了。当我检查波形时,它的行为是正确的。断言标记第一次检查后的2个时钟。如何在只检查一个时钟周期后停止此断言System verilog $past在系统Verilog断言中的使用,system-verilog,system-verilog-assertions,System Verilog,System Verilog Assertions,我想检查变量的当前值是否为“1”,然后变量的上一个值应为“0”。我在系统Verilog断言中使用$pass。在这里,我检查如果cal_frame_mode=1,那么它是cal_frame_mode的上一个值=0。我的代码如下。然而,我看到断言失败了。当我检查波形时,它的行为是正确的。断言标记第一次检查后的2个时钟。如何在只检查一个时钟周期后停止此断言 property p_NOP_2_RX_CAL; @(posedge clk) (cal_frame_mode==3'b001) |-&g
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
表示等待两个时钟。默认值$pass
查看表达式的值,该表达式从当前时钟返回一个时钟(默认情况下,这是属性中定义的时钟)。因此:
(cal_frame_mode==3'b001) |-> ##2 $past(cal_frame_mode)==3'b000;
相当于:
(cal_frame_mode==3'b001) |-> ##1 cal_frame_mode==3'b000;
您需要的是:(校准帧模式==3'b001)|->$pass(校准帧模式)==3'b000
但是我猜你之所以有##2
是为了过滤掉校准帧模式
等于两个时钟的1。如果是这样,那么更好的解决方案是添加$change
或$稳定
到先行项,这是仅当校准帧模式
更改且当前值为1时才执行的检查
$changed(cal_frame_mode) && (cal_frame_mode==3'b001) |-> $past(cal_frame_mode)==3'b000;
断言记录在§16断言中§16.9.3采样值函数详细描述了
$sample
,$rose
,$fall
,$stable
,$changed
和$pass
§16.12.6含义描述了|->
和|=>
#2
表示等待两个时钟。默认值$pass
查看表达式的值,该表达式从当前时钟返回一个时钟(默认情况下,这是属性中定义的时钟)。因此:
(cal_frame_mode==3'b001) |-> ##2 $past(cal_frame_mode)==3'b000;
相当于:
(cal_frame_mode==3'b001) |-> ##1 cal_frame_mode==3'b000;
您需要的是:(校准帧模式==3'b001)|->$pass(校准帧模式)==3'b000
但是我猜你之所以有##2
是为了过滤掉校准帧模式
等于两个时钟的1。如果是这样,那么更好的解决方案是添加$change
或$稳定
到先行项,这是仅当校准帧模式
更改且当前值为1时才执行的检查
$changed(cal_frame_mode) && (cal_frame_mode==3'b001) |-> $past(cal_frame_mode)==3'b000;
断言记录在§16断言中§16.9.3采样值函数详细描述了
$sample
,$rose
,$fall
,$stable
,$changed
和$pass
§16.12.6含义描述了
|->
和|=>
谢谢你,格雷格,这很有帮助。@Samss77,谢谢你最好放弃投票和/或接受答案。这样做还可以帮助其他回答相同问题的人找到最佳答案,而无需阅读和尝试所有提交的答案(假设有人添加答案)。谢谢你,格雷格,这很有帮助。@Samss77,最好放弃投票和/或接受答案。这样做还可以帮助其他有相同问题的人找到最佳答案,而无需阅读并尝试所有提交的答案(假设有人添加了答案)。