triggered
シーケンスのプロパティを使用するアサーションがいくつかあります。これは、「X が発生した場合、Y は過去に発生したに違いない」という形式のプロパティをチェックするのに役立ちます。
簡単な例を見てみましょう:
3 つの信号 、および が与えられa
たb
場合、3 サイクル前に High であり、2 サイクル前に High であった場合にのみc
、c
High になることが許可されます。これは、このプロパティを満たすトレースです。a
b
c
これを確認できるようにするには、 aが有効なポイントで一致するヘルパー (クロック付き) シーケンスが必要です。
sequence two_cycles_after_a_and_b;
@(posedge clk)
a ##1 b ##2 1;
endsequence
次に、このシーケンスをアサーションで使用できます。
c_two_cycles_after_a_then_b : assert property (
c |-> two_cycles_after_a_and_b.triggered )
$info("Passed");
このアサーションはほとんどの場合問題なく機能しますが、リセットを処理するときはうまくいかなくなります。
と の間のクロック サイクルで正確にアクティブになるリセット信号もあるとしb
ますc
。
この場合の素朴なアプローチは、アサーションの外側、default disable iff
節の内側にリセット認識を実装することです。
default disable iff !rst_n;
c
リセットは の前にアクティブだったので、前にa ##1 b
発生した はカウントされず、アサーションが失敗することが予想されます。ただし、シーケンスの評価はリセットとは無関係であるため、これは起こりません。
この動作を実現するには、シーケンスをリセット対応にする必要があります。
sequence two_cycles_after_a_and_b__reset_aware;
@(posedge clk)
rst_n throughout two_cycles_after_a_and_b;
endsequence
アサーションはリセット対応バージョンを使用する必要があります。
c_two_cycles_after_a_then_b__reset_aware : assert property (
c |-> two_cycles_after_a_and_b__reset_aware.triggered )
$info("Passed");
two_cycles...
リセットの発生によりシーケンスが一致しないため、2 番目のアサーションは実際に失敗します。
これは明らかに機能しますが、より多くの労力が必要であり、スコープごとに制御するのではなく、リセットをシーケンス/プロパティの不可欠な部分にする必要があります。この場合、を使用することに近いリセット認識を実現する他の方法はありますdisable iff
か?