0

我想检查变量的当前值是否为“1”,那么变量的先前值应该为“0”。我在系统 Verilog 断言中使用 $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);
4

1 回答 1

5

##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或添加到先行词,这仅在更改且当前值为 1!$stable时才执行检查。cal_frame_mode

$changed(cal_frame_mode) && (cal_frame_mode==3'b001) |-> $past(cal_frame_mode)==3'b000;

断言记录在IEEE Std 1800-2012 § 16 Assertions
§ 16.9.3采样值函数描述$sample, $rose, $fell, $stable,$changed$past详细
§ 16.12.6含义描述|->|=>

于 2016-07-01T19:01:30.260 回答