verilog検証プラットフォームテクニック(競争を避ける方法)

2262 ワード

verilog検証プラットフォームテクニック(競争を避ける方法)
1.0の時点でリセットします.2.クロックを後にリセットする.シミュレーションクロック4を作成する.無効なタイミングでのインセンティブの入力
1.0の時点でリセットします.
0時点でブロック付与値を使用してリセットを有効にする(Aen)ことは、競合条件を引き起こす可能性があります.なぜですか.すべてのプロセスブロックが0の時点でアクティブ化されるからである.initialブロックがalwaysブロックの前にアクティブ化されると、alwaysブロックはリセットが有効であることを認識しない.次のposedge clkまたは次のリセットが有効になるまでの例:Race condition while asserting reset at time 0
initial begin
    ret_n = 0;
    ...
end
always@(posedge clk or negedge rst_n)

実際、IEEE Verilog規格は明確に説明されていないが、ほとんどのVendorのVerilogシミュレータは、initialブロックを起動する前に、まずすべてのalwaysブロックをアクティブにする.これは、initalブロックのリセット信号が実行される前に、alwaysブロックがリセット信号のために準備されていることを意味する(リセットの到来を待つ).しかし、設計者は、このようなアクティブ化順序に依存すべきではない(initialブロックはalwaysブロックの後にアクティブ化される).この競合条件を回避するための簡単な方法は、最初のリセット信号を0の時点で有効にするには、非ブロック付与を使用することである.リセットに非ブロック付与を使用すると、リセット信号が0時点で最後に強制的に実行され、すべてのalwaysブロックがアクティブになり、リセット信号が0時点で変更されるとalwaysブロックがリセットを実行する例:No race condition while asserting reset at time 0
initial begin
    ret_n <= 0;
    ...
end
always@(posedge clk or negedge rst_n)

2.クロックはその後リセット
もう1つの競合回避方法は、シミュレータが1~2クロックサイクルを開始した後、リセットをクロック無効エッジで有効にすることです.なぜなら、実際のハードウェアで電気的にリセットしたときのように、開始前のいくつかのクロックサイクル不定状態(Unknown)を無視するのが一般的です.
3.シミュレーションクロックの作成
多くの人は、次のようなコードを使用してクロックを作成することがよくあります.ここでは、initialブロックとalwaysブロックの例の2つのプロセスブロックを使用しています.一般的なクロック生成方法です.
reg clk;
initial clk= I'b0;
always #50 clk =~clk;

しかし、クロックを生成することは、本来、初期値を付与し、一定時間間隔で0と1の間で問題を回転させる順序であるため、0時点で最初のクロック付与に非ブロック付与を使用する形式で書くことが望ましい.0時点でnegedge clkに敏感なプロセスブロックをトリガするためである.例:より良いクロック生成方法
reg clk;
initial begin
    clk <= 0;
    forever (#`cycle/2) clk =~clk;
end

4.無効なタイミングでのインセンティブ入力
励起コードでは、固定された#遅延を使用するのではなく、クロックに沿って入力にできるだけ無効な値を割り当てるのは、検証プラットフォームを作成するのに良いポリシーです.固定遅延の使用には欠点があるため、エンジニアが他の周波数を試みる場合は、固定遅延を使用するすべてのコードを変更する必要があります.しかし、クロック無効を使用して励起を変更する検証プラットフォームに沿って他の周波数を試みる場合は、変更する必要は少ない.