テストベンチとは
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はシミュレーションを終了します
以降のレッスンでは、スティミュラスの作成、結果の表示、およびその他のテストベンチ機能について説明します。
チャレンジ
ANDゲートのモジュールが与えられています。あなたのタスクは、そのテストベンチに不足している部分を追加することです。
行うべきこと:
テストベンチに以下の部分を追加してください:
- 入力
aとbに対してregを宣言する - 出力
cに対してwireを宣言する and_gateをdutという名前でインスタンス化し、ポートを接続する
チートシート
テストベンチは、別のモジュール(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
endmoduleinitialブロック内で駆動される信号(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このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。