シーケンスのtriggered
プロパティを使用するアサーションがいくつかあります。これは、「Xが起きたとき、Yがいつか過去に起こったことがある」というフォームのプロパティをチェックするのに便利です。アサーションで 'sequence.triggered'を使用するときのリセット認識
簡単な例を見てみましょう:a
は3サイクル前に高く、b
は2サイクル前に高いものであった場合は三つの信号、a
、b
とc
、c
を考えると
が高いだけ行くことを許されています。これは満たし、このプロパティをトレースです:
:はこれをチェックすることができるようにするには、我々はヘルパー(クロックさ)c
が合法である点で一致している必要がありシーケンスを必要とするだろう
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;
期待がリセット以降前にアクティブであった、ということであろう10の場合、以前に起きた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...
シーケンスは、リセットの発生のために一致しません。
これは明らかに機能しますが、それはより多くの労力を必要とし、リセットはスコープごとに制御されるのではなく、シーケンス/プロパティの不可欠な部分になる必要があります。この場合、disable iff
に近いリセット認識を達成するための他の方法はありますか?
を..どのようなアサーションが評価されているかを知り、このようにリセット認識を実装することができます。 –
少し混乱します。 two_cycles_after_a_and_b中のrst_nは、rst_nがシーケンスa ## 1 b ## 2 1全体にわたって有効でなければならないことを意味するか?シーケンスは一致しないでしょうか? – noobuntu
@noobuntuはい。つまり、そのサイクルのいずれかでリセットが表示されない場合にのみシーケンスが一致することを意味します。 –