0

変数の現在の値が「1」であるかどうかを確認したい場合、変数の前の値は「0」である必要があります。System Verilog アサーションで $past を使用しています。ここでは、cal_frame_mode=1 かどうかを確認しています。これは、前の値の cal_frame_mode=0 です。私のコードは以下です。ただし、アサーションの失敗が見られます。波形をチェックインすると、正しく動作しています。アサーションは、最初のチェックの 2 クロック後にフラグを立てます。1 クロック サイクルだけチェックした後、このアサーションを停止するにはどうすればよいですか?

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

##22 クロック待つことを意味します。デフォルトの$pastは、現在のクロックから 1 クロック前の式の値を調べます (デフォルトでは、これはプロパティで定義されたクロックです)。したがって:

(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 クロックに対して 1 に等しいものを##2除外することだと思います。cal_frame_modeその場合、より良い解決策は前件に$changeorを追加することです。これは、変更された現在の値が 1 の!$stable場合にのみチェックが実行されるものです。cal_frame_mode

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

アサーションIEEE Std 1800-2012で文書化されています 。 _ _ _
$sample$rose$fell$stable$changed$past
|->|=>

于 2016-07-01T19:01:30.260 に答える