Verilog シミュレーション
Verilog はハードウェア記述言語であり、設計者が RTL 設計を論理ゲートに変換できるようにシミュレートする必要はありません。では、シミュレートする必要があるのは何でしょうか?
シミュレーションは、RTL コードが意図したとおりに動作するかどうかを確認するために、さまざまなタイミングでさまざまな入力スティミュラスをデザインに適用する手法です。基本的に、シミュレーションは、設計の堅牢性を検証するためのよく知られた手法です。また、製造されたチップが現実の世界でどのように使用され、さまざまな入力にどのように反応するかにも似ています。
たとえば、上記の設計は、出力 pe を見つけるために周期的な間隔で評価される入力クロックと信号を持つポジティブ エッジ検出器を表しています。 示されているように。シミュレーションにより、関連する信号のタイミング図を表示して、Verilog の設計記述が実際にどのように動作するかを理解できます。
シミュレータを開発している EDA 企業がいくつかあります 設計へのさまざまな入力に対する出力を把握することができます。 Verilog は、離散イベントで定義されます 実行モデルと異なるシミュレーターは異なるアルゴリズムを自由に使用して、ユーザーに一貫した結果セットを提供します。 Verilog コードは複数のプロセスとスレッドに分割され、後で触れるシミュレーションのさまざまな時点で評価される場合があります。
例
tb と呼ばれるテストベンチは、設計モジュールを保持するコンテナーです。ただし、この例ではデザイン インスタンスを使用していません。 2 つの 変数 があります またはシグナル 特定の時間に特定の値を割り当てることができます。 clk は、テストベンチ内で生成されるクロックを表します。これは always
によって行われます 5nsごとにクロックの値を交互に変更することでステートメントを作成します。 initial
ブロックには、異なる時間に両方のシグナルに異なる値を割り当てる一連のステートメントが含まれています。
module tb;
reg clk;
reg sig;
// Clock generation
// Process starts at time 0ns and loops after every 5ns
always #5 clk = ~clk;
// Initial block : Process starts at time 0ns
initial begin
// This system task will print out the signal values everytime they change
$monitor("Time = %0t clk = %0d sig = %0d", $time, clk, sig);
// Also called stimulus, we simply assign different values to the variables
// after some simulation "delay"
sig = 0;
#5 clk = 0; // Assign clk to 0 at time 5ns
#15 sig = 1; // Assign sig to 1 at time 20ns (#5 + #15)
#20 sig = 0; // Assign sig to 0 at time 40ns (#5 + #15 + #20)
#15 sig = 1; // Assign sig to 1 at time 55ns (#5 + #15 + #20 + #15)
#10 sig = 0; // Assign sig to 0 at time 65ns (#5 + #15 + #20 + #15 + #10)
#20 $finish; // Finish simulation at time 85ns
end
endmodule
シミュレーターは、上記のテストベンチの実行後に次の出力を提供します。
シミュレーションログncsim> run Time = 0 clk = x sig = 0 Time = 5 clk = 0 sig = 0 Time = 10 clk = 1 sig = 0 Time = 15 clk = 0 sig = 0 Time = 20 clk = 1 sig = 1 Time = 25 clk = 0 sig = 1 Time = 30 clk = 1 sig = 1 Time = 35 clk = 0 sig = 1 Time = 40 clk = 1 sig = 0 Time = 45 clk = 0 sig = 0 Time = 50 clk = 1 sig = 0 Time = 55 clk = 0 sig = 1 Time = 60 clk = 1 sig = 1 Time = 65 clk = 0 sig = 0 Time = 70 clk = 1 sig = 0 Time = 75 clk = 0 sig = 0 Time = 80 clk = 1 sig = 0 Simulation complete via $finish(1) at time 85 NS + 0
シミュレーション波形とは?
シミュレーションにより、デザインとテストベンチの信号を波形にダンプし、RTL デザインの機能を解析およびデバッグするためにグラフィカルに表示できます。以下に示す波形は、EDA ツールから取得したもので、時間に対する各信号の進行を示しており、前に示したタイミング図と同じです。
変数またはネットの値のすべての変更は、更新イベントと呼ばれます .プロセスは更新イベントに敏感です これらのプロセスは、更新イベントが発生するたびに評価され、評価イベントと呼ばれます。 .複数のプロセスが任意に評価される可能性があるため、イベント キューと呼ばれるもので変更の順序を追跡する必要があります。 .
当然、それらはシミュレーション時間順に並べられています。キューに新しいイベントを配置することをスケジューリングと呼びます .シミュレーション時間は、シミュレートされている回路にかかる実際の時間をモデル化するためにシミュレータによって維持される時間値を参照するために使用されます。上記の例の時間値は、ナノ秒 ns
で示されています。 タイミング図で。
module des;
wire abc;
wire a, b, c;
assign abc = a & b | c; // abc is updated via the assign statement (process) whenever a, b or c change -> update event
endmodule
Verilog を更新して例を見てください!
イベント キュー内のリージョン
Verilog イベント キューは、論理的に 5 つの領域に分割されており、イベントはどの領域にも追加できます。ただし、アクティブな領域からのみ削除できます。
イベント | 説明 |
---|---|
アクティブ | 現在のシミュレーション時間に発生し、任意の順序で処理できます |
無効 | 現在のシミュレーション時間に発生しますが、すべてのアクティブなイベントが完了した後に処理されます |
ノンブロッキング | 以前に評価されましたが、アクティブおよび非アクティブなイベントが完了した後の現在のシミュレーション時間に割り当てが行われます |
モニター | すべてのアクティブ、非アクティブ、および非ブロッキング イベントが完了した後に処理されます |
未来 | 将来のシミュレーション時間に発生 |
シミュレーション サイクルでは、すべてのアクティブなイベントが処理されます。標準では、いくつかのケースを除いて、特定のスケジューリング順序が保証されています。たとえば、begin-end ブロック内のステートメントは、出現順にのみ実行されます。
module tb;
reg [3:0] a;
reg [3:0] b;
initial begin // Statements are executed one after the other at appropriate simulation times
a = 5; // At time 0ns, a is assigned 5
b = 2; // In the same simulation step (time 0ns), b is assigned 2
#10 a = 7; // When simulation advances to 10ns, a is assigned 7
end
endmodule
イベントキュー b への割り当てを定義します a への割り当て後に発生する必要があります .
Verilog