第8回:アサーション(その④)
第8回目もアサーションです。 これまでアサーションについて、「アサーションとは」、「即時アサーション」、「並列アサーション」の3回のひとり言でした。
今回がアサーション最終回で、他に話しておきたいひとり言をまとめました。

アサーションの一時停止の方法
アサーションの一時停止や再開のためのシステムタスクが用意されており、シナリオやタスク内から以下のシステムタスクを叩くことで一時停止や再開を制御できます。

※第一引数の数字は、階層の深さを指す。1は指定階層のみ。2は指定階層と一つ下の階層まで、0は最終階層まで
※引数なしに「$assertoff;」等と記述した場合は、全てのアサーションが対象となります。
以降は、考え方や記述例の覚書になります。 これまでの「ひとり言」の内容をどう使っていくかを記載します。




上記の他、アクセスがないときに選択信号がALL-0であることを検証したほうがよく、その場合の記述は例えば以下のようになります。

今回の場合アクセス期間以外を示すpselの反転を発火条件とし、検証内容を選択信号がALL-0であることとしています。
【応答信号のアサーション】※ここではAPBのリクエスト信号であるPSELに対する応答信号のPREADYの確認


【カウンタのカウント動作】


カウントイネーブルへのHライト後、カウントクロックにてイネーブルを2段受けしたのち、カウント動作を開始。
イネーブルの2段受けの後、カウントしていることを検証しています。
イネーブルのクロック載せ替えを含めた検証の例です。
【カウンタのカウント停止動作】

カウントイネーブルへのLライト後、カウントクロックにてイネーブルを2段受けしたのち、カウント停止。イネーブルの2段受けの後、カウント停止していることを検証しています。
【カウンタのカウントクリア動作】

カウントクリアレジスタにHをライト後、クリアレジスタをカウントクロックで2段受け、クリアパルスが生成されたタイミングでカウンタがクリアされることを検証しています。
※今回のような動作完了後0に戻るレジスタの場合、以下のようなアサーションを付加すればより良いことになります。

機能(アサーションの)カバレッジについて
並列アサーションを用いているとき、以下のように記述することで、アサーションの機能カバレッジを取得できます。

上記のようにassertの文字をcoverに置き換えることで機能カバレッジを取得できます。
上記の場合、1CLKパルスを検証するアサーションをcoverに置き換えているため、1CLKパルス動作が実行されたかという観点のカバレッジとなります。
assert property ( @(posedge clk) (A)|-> ##1 (B);
cover property ( @(posedge clk) (A)|-> ##1 (B); ★A→Bの動作を検出したい場合。
cover property ( @(posedge clk) (A)|-> 1’b1; ★Aの発生だけを検出すればいい場合。
Aを実行したとき、Bの動作を確認する検証において、Aの動作を実行していることを検出するためのcover記述を使用することで、目的のシナリオで目的の動作を実行できた事を確認できます。
※回路修正などによりタイミングが変更となったなどの影響でAが発生しなくなっているなど。
※この場合は目的のシナリオでのみ実行することが重要です。
(通常のカバレッジであれば、全シナリオの動作結果をマージするため、別のシナリオで動いていてもOKになります)
※Aの動作がなかったからアサーションの検証が実行されずにPASSしてしまったことを気づくための仕組みにできます。シナリオ改修後、Aの動作を実現してもBの動作が行われずアサーション側がFAILした等につながります。
「アサーション」のひとり言 完