在系统Verilog断言中使用$ past

时间:2016-07-01 18:27:36

标签: system-verilog system-verilog-assertions

我想检查变量的当前值是否为'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);

1 个答案:

答案 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|->