Sampled value system functions
信号の変化や値の取得を行うシステムファンクション群です。$sampled ( <信号> ) | 信号値を取得 |
$rose ( <信号> ) | 立ち上がりの判定 |
$fell ( <信号> ) | 立ち下がりの判定 |
$stable ( <信号> ) | 無変化の判定 |
$changed ( <信号> ) | 変化の判定 |
$past ( <信号> [, <遡るクロック数>]) | 過去の信号値を取得 |
$sampled は値を取得するだけです。存在理由がよく分かりません。
$rose, $fell, $stable, $changed は1つ前のクロックエッジ時の値とを比較して判定します。x, z も変化の対象になります。例えば、$fell は x → 0 や z → 0 の変化にも反応します。
$past は指定したサイクル数分遡って値を取得することができます。<遡るクロック数> を省略した場合は 1 と見なされます。
■ サンプル
/* a と b が同じタイミングで立ち上がること */
property p1;
@(posedge clock) $rose(a) |-> $rose(b);
endproperty
SVA_P1 : assert property(p1);
/* a が 0 のとき b が変化しないこと */
property p1;
@(posedge clock) ~a |=> $stable(b);
endproperty
SVA_P1 : assert property(p1);
↑具体的には AXI4 interface の Ready 信号が落ちているときに Data が変化しないこと 等の使い方ができます。 /* a の立下りを検出したとき 1 サイクル前の b の値が 0 であること */
property p1;
@(posedge clock) $fell(a) |-> $past(b, 1) == 0;
endproperty
SVA_P1 : assert property(p1);
Bit vector system functions
多ビット信号の状態や、x, z を含むかどうかを判定するシステムファンクション群です。$countbits ( <信号>, <値>) | 指定した値(0、1、x、z)の数を取得 |
$countones ( <信号> ) | 1 の数を取得 |
$onehot ( <信号> ) | 信号がワンホットであることを判定 |
$onehot0 ( <信号> ) | 信号がワンホットもしくは ALL 0 であること判定 |
$isunknown ( <信号> ) | 信号に x,z を含むかどうかを判定 |
■サンプル
/* a [3:0] に含まれる 1 の数が 2つ以下であること */
property p1;
@(posedge clock) $countbits(a[3:0], 1) <= 2;
endproperty
SVA_P1 : assert property(p1);
Assertion control tasks
アサーションの有効/無効をコントロールするタスク群です。module 内で initial や task 等で記載することが多いかと思います。$asserton [(<階層の深さ> [, <基準階層>])] | アサーションを有効化 |
$assertoff [(<階層の深さ> [, <基準階層>])] | アサーションを無効化 |
$assertkill [(<階層の深さ> [, <基準階層>])] | アサーションを無効化 (強制終了) |
<階層の深さ> は 0 と 0 以外で意味合いが異なります。
0 :基準階層以下を全て
0以外:基準階層以下から指定した深さまで (1 設定時は基準階層のみ)
<階層の深さ> を省略した場合は 0 となります。
<基準階層> は省略した場合は最上位階層(テストベンチのトップ階層)となります。
VCS を使っている人は $dumpvars や $fsdbDumpvars と同じ使い方と思っていただければ大丈夫だと思います。(多分...)
Assertion control tasks には $asserton, $assertoff, $assertkill の他にも以下のようなタスクがありますが省略します。
$assertpasson |
$assertpassoff |
$assertfailon |
$assertfailoff |
$assertnonvacuouson |
$assertvacuousoff |
$assertcontrol |
■サンプル
initial で $assertoff を使う場合を例として、図を使って説明します。グレーになっている箇所が無効化対象のモジュールになります。
initial $assertoff(); // 最上位階層以下の階層を全て無効化
$assertoff(0); または $assertoff(0, top); としても同じ結果となります。↓
initial $assertoff(1); // 最上位階層から 1階層無効化
↓ initial $assertoff(2); // 最上位階層から 2階層無効化
↓ initial $assertoff(0, top.aaa); // top.aaa 以下の階層を全て無効化
↓ initial $assertoff(1, top.aaa); // top.aaa から 1 階層無効化
↓また、特定のアサーションのみを指定したい場合は、以下のように設定します。
initial $assertoff(0, top.aaa.bbb.<ラベル名>);
0 件のコメント:
コメントを投稿