工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Industrial programming >> Verilog

信頼性の高いRTL検証のためのVerilogシミュレーション技術

Verilogはハードウェア記述言語であり、設計者がRTL設計をシミュレートしてロジックゲートに変換できるようにする要件はありません。では、なぜシミュレートする必要があるのでしょうか?

シミュレーションは、設計に異なる入力刺激を異なるタイミングで適用し、RTLコードが意図した通りに振る舞うかどうかをチェックする技法です。本質的に、シミュレーションは設計の堅牢性を検証するためのよく実践される技法です。これは、製造されたチップが現実世界でどのように使用され、さまざまな入力にどう反応するかにも似ています。

例えば、上記の設計は、クロックと信号の入力を持つポジティブエッジ検出器を表し、これらが定期的に評価されて出力peが得られます。シミュレーションにより、関連信号のタイミング図を表示して、Verilogでの設計記述が実際にどのように振る舞うかを理解できます。

さまざまなEDA企業が、設計へのさまざまな入力に対する出力を解析できるシミュレータを開発しています。Verilogは離散イベント実行モデルの観点から定義されており、異なるシミュレータはユーザーに一貫した結果セットを提供するために異なるアルゴリズムを自由に使用できます。Verilogコードは複数のプロセスとスレッドに分割され、シミュレーションの過程で異なる時間に評価される可能性があります。これについては後で触れます。

例

testbenchと呼ばれるtbは設計モジュールを保持するコンテナです。ただし、この例では設計インスタンスを使用していません。特定の時間に特定の値を代入できる2つの変数または信号があります。clkはテストベンチ内で生成されるクロックを表します。これはalways文によって、クロックの値を5nsごとに交互に切り替えることで行われます。initialブロックには、両信号に異なる値を異なる時間に代入する一連の文が含まれます。

module tb;
  reg clk;
  reg sig;
  
  // クロック生成
  // プロセスは時間0nsで開始し、5nsごとにループ
  always #5 clk = ~clk;
  
  // Initialブロック: プロセスは時間0nsで開始
  initial begin
    // このシステムタスクは、信号値が変わるたびに出力
    $monitor("Time = %0t clk = %0d sig = %0d", $time, clk, sig);
    
    // 刺激とも呼ばれ、単純に変数に異なる値を
    // シミュレーション「遅延」後に代入
    sig = 0;
    #5 clk = 0;  // 時間5nsでclkに0を代入
    #15 sig = 1; // 時間20nsでsigに1を代入 (#5 + #15)
    #20 sig = 0; // 時間40nsでsigに0を代入 (#5 + #15 + #20)
    #15 sig = 1; // 時間55nsでsigに1を代入
    #10 sig = 0; // 時間65nsでsigに0を代入
    #20 $finish; // 時間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はassign文(プロセス)によって更新される
  // a, b, cのいずれかが変化 -> 更新イベント
endmodule

Verilogをリフレッシュして例を見る!

イベントキューの領域

Verilogイベントキューは論理的に5つの領域に分割され、イベントはこれらのいずれかに追加できます。ただし、削除できるのはアクティブ領域からのみです。

イベント 説明
Active 現在のシミュレーション時間で発生し、任意の順序で処理可能
Inactive 現在のシミュレーション時間で発生するが、すべてのアクティブイベント完了後に処理
Nonblocking 以前の時点で評価されたが、代入はアクティブおよび非アクティブイベント完了後の現在のシミュレーション時間で実行
Monitor すべてのアクティブ、非アクティブ、ノンブロッキングイベント完了後に処理
Future 将来のシミュレーション時間で発生

シミュレーションサイクルとは、すべてのアクティブイベントが処理されることです。標準はいくつかのケースを除いて特定のスケジューリング順序を保証します。例えば、begin-endブロック内の文は出現順序でのみ実行されます。

module tb;
  reg [3:0] a;
  reg [3:0] b;
  initial begin
    // 文は適切なシミュレーション時間で順次実行される
    a = 5; // 時間0nsでaに5を代入
    b = 2; // 同じシミュレーションステップ(時間0ns)でbに2を代入
    #10 a = 7; // シミュレーションが10nsに進むとaに7を代入
  end
endmodule

イベントキューは、bへの代入がaへの代入の後に起こるべきことを定義しています。

Verilog

  1. Verilogマスター:デジタル回路設計のための完全チュートリアル
  2. Verilog連結マスター:実践ガイド
  3. Verilog代入文の理解:種類、構文、ベストプラクティス
  4. Verilogブロッキング代入とノンブロッキング代入:違いを徹底解説
  5. Verilog関数のマスター:効率的なRTL設計のために
  6. Verilogタスクの理解:関数との違い、構文、使用法
  7. Verilog `ifdef:条件付きコンパイルの解説
  8. Verilogスケジューリングセマンティクスの理解:タイミング、イベント、実行順序
  9. Verilogクロックジェネレータ:設計と実装ガイド
  10. Verilog表示タスクのマスター:効率的なデバッグとログ出力
  11. Verilog数学関数のマスター:効率的なハードウェア設計のために