Menu
Coddy logo textTech

テストベンチとは

CoddyのVerilogジャーニー「基礎」セクションの一部 — レッスン 73/90。

テストベンチは、別のモジュールをテストするために使用される特別なVerilogモジュールです。これは、設計に入力を提供し、出力が正しいかどうかを確認します。

なぜテストベンチが必要なのですか?

モジュールを作成する際、それが正しく動作することを確認する必要があります。テストベンチを使用すると、以下のことが可能になります:

  • モジュールにさまざまな入力値を適用する
  • 出力を観察する
  • 出力が期待通りか確認する
  • 手動テストなしでこれを自動的に行います

テストベンチ vs デザインモジュール

 デザインモジュールテストベンチ
目的ハードウェアを実装するデザインモジュールをテストする
ポートの有無あり(入力および出力)なし(自己完結型)
論理合成可能か?はいいいえ(シミュレーションのみ)

シンプルなテストベンチの例

module testbench;              // ポートはありません!

  // 入力と出力は、テスト対象のモジュール(DUT)から取得します。
  reg a, b;                    // 入力用のreg
  wire c;                      // 出力用のwire
  

  // これはモジュールのインスタンス化です — and_gateモジュールのコピーを作成し、dutと名付けます
  and_gate dut (               // DUTをインスタンス化
    .a(a),
    .b(b),
    .c(c)
  );

  // これは、テスト対象モジュールの入力にテスト値を適用するinitialブロックです。
  initial begin                // テスト値を適用
    a = 0; b = 0; #10;
    a = 0; b = 1; #10;
    a = 1; b = 0; #10;
    a = 1; b = 1; #10;
    $finish;
  end
endmodule

キーポイント

  • テストベンチにはポートがありません
  • reg は変化する信号(DUTへの入力)に使用されます
  • wire はDUTからの信号(出力)に使用されます
  • テスト対象のモジュールは DUT (Design Under Test) と呼ばれます
  • $finish はシミュレーションを終了します

以降のレッスンでは、スティミュラスの作成、結果の表示、およびその他のテストベンチ機能について説明します。

challenge icon

チャレンジ

ANDゲートのモジュールが与えられています。あなたのタスクは、そのテストベンチに不足している部分を追加することです。

行うべきこと:

テストベンチに以下の部分を追加してください:

  1. 入力 ab に対して reg を宣言する
  2. 出力 c に対して wire を宣言する
  3. and_gatedut という名前でインスタンス化し、ポートを接続する

チートシート

テストベンチは、別のモジュール(DUT - Design Under Test:検証対象)をテストするために使用されるVerilogモジュールです。これにはポートがなく、シミュレーション専用です。

module testbench;              // ポートなし!

  reg a, b;                    // 入力用のreg(変化する信号)
  wire c;                      // DUT出力用のwire

  and_gate dut (               // DUTをインスタンス化
    .a(a),
    .b(b),
    .c(c)
  );

  initial begin                // テスト値を適用
    a = 0; b = 0; #10;
    a = 1; b = 1; #10;
    $finish;                   // シミュレーション終了
  end
endmodule
  • initial ブロック内で駆動される信号(DUTへの入力)には reg を使用します
  • DUTから出力される信号(出力)には wire を使用します
  • $finish はシミュレーションを終了させます

自分で試してみよう

module and_gate (
  input a,
  input b,
  output c
);
  assign c = a & b;
endmodule

module testbench;
  
  // タスク 1: 入力 a と b の reg を宣言する
  
  
  // タスク 2: 出力 c の wire を宣言する
  

  // タスク 3: and_gate を dut という名前でインスタンス化する
  // .a(a), .b(b), .c(c) を接続する


  initial begin
    a = 0; b = 0; #10 $display("%d & %d = %d", a, b, c);
    a = 0; b = 1; #10 $display("%d & %d = %d", a, b, c);
    a = 1; b = 0; #10 $display("%d & %d = %d", a, b, c);
    a = 1; b = 1; #10 $display("%d & %d = %d", a, b, c);
    $finish;
  end
endmodule
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

基礎のすべてのレッスン