2

非同期リセットを使用した広告フリップフロップの簡単な例を見てみましょう。

q は、クロックの次のエッジで d で更新する必要があります。これは、単純な含意演算子アサーションで記述できます。

ただし、アサーションでリセット動作をキャプチャする方法。私はいくつかをフォローしようとしました

assert @(posedge rst) (1'b1 |-> !Q);

assert @(posedge rst) (1'b1 ##0 !Q);

これらのアサーションは両方とも失敗します。最初の次のポーズエッジがないためだと思いますか?

assert @(posedge clk) ($rose(rst) |-> !Q);

パスしますが、フリー ランニング クロックが必要で、クロックの 2 つのエッジ間でアサートされます (最初の意図した動作ではありません)。

 assert #0 (not (rst & Q));

私の理解では、これは正しい即時アサーションですが、波形ビューアーでこれが成功または失敗することはわかりません。さらに、最後のタイプのアサーションについてはカバーを書くことができないと思います。

4

1 に答える 1

2

Qが更新される前にサンプリングされるため、アサーションは失敗します。サンプリングは、シミュレーターのスケジューラーの早い段階で、トリガー イベントの LHS で発生します。Qスケジューリング順序で後のリアクティブ領域で更新されます。

これを修正する簡単な方法は、SystemVerilog のような小さな遅延を追加すること1stepです。rst最小パルス幅チェックの一部として機能するチェック条件を入れることをお勧めします。

wire #(1step) rst_delay = rst;
assert @(posedge rst_delay) (1'b1 |-> rst && !Q);

SDF 注釈または人為的な遅延を使用するなど、reset-to-q 遅延を使用してシミュレートしている場合は、オフセットを に追加しrst_delayます。

wire #(r2q+1step) rst_delay = rst;
assert @(posedge rst_delay) (1'b1 |-> rst && !Q);
于 2014-02-13T00:33:55.753 に答える