スティミュラスの作成
CoddyのVerilogジャーニー「基礎」セクションの一部 — レッスン 74/90。
スティミュラスとは、設計が正しく動作するかどうかをテストするために適用する入力値のことを指します。入力を変更し、出力を観察することで、設計が期待通りに動作することを確認できます。
機械をテストするようなものだと考えてください。さまざまなボタン(スティミュラス)を押し、何が起こるか(出力)を観察します。優れたスティミュラスを作成することは、テストベンチを作成する上で不可欠な要素です。
例えば、次のテストベンチ内のスティミュラスを見てみましょう:
module testbench;
reg a, b;
wire c;
and_gate dut (
.a(a),
.b(b),
.c(c)
);
initial begin
// ここからスティミュラス開始
// テストケース 1: 両方の入力が 0
a = 0; b = 0; #10;
// テストケース 2: a=0, b=1
a = 0; b = 1; #10;
// テストケース 3: a=1, b=0
a = 1; b = 0; #10;
// テストケース 4: 両方の入力が 1
a = 1; b = 1; #10;
// ここでスティミュラス終了
$finish;
end
endmodule各スティミュラスが印加され、次のスティミュラスの前に10時間単位(#10)待機します。これにより、DUTが出力を生成するための時間が確保されます。
刺激(Stimulus)を作成する方法
| 手法 | 最適な用途 | 例 |
|---|---|---|
| 逐次代入 | 単純なテスト | a = 0; b = 0; #10; |
| Forループ | 全組み合わせのテスト | for (i = 0; i < 4; i++) |
| Repeatループ | パターンの繰り返し | repeat (10) #5 clk = ~clk; |
| Foreverループ | 継続的な信号 | forever #5 clk = ~clk; |
方法 1: 逐次代入
スティミュラスを作成する最も簡単な方法です。遅延を伴いながら値を一つずつ代入します。
initial begin
a = 0; b = 0; #10;
a = 0; b = 1; #10;
a = 1; b = 0; #10;
a = 1; b = 1; #10;
$finish;
end方法 2: forループ
すべての可能な入力の組み合わせをテストしたい場合に便利です。
integer i;
initial begin
for (i = 0; i < 4; i = i + 1) begin
{a, b} = i;
#10;
end
$finish;
endこれは 00、01、10、11 をテストします。
手法 3: Repeat ループ
同じスティミュラスを何度も繰り返す場合に便利です。
initial begin
a = 0; b = 1;
repeat (10) begin
#10 a = ~a;
end
$finish;
end手法 4: Foreverループ
クロックのような連続的な信号に便利です。
initial begin
clk = 0;
forever #5 clk = ~clk;
end重要なルール
| ルール | 説明 |
|---|---|
| 刺激(スティミュラス)の代入の間に遅延を使用する | #10 はDUTが応答するための時間を確保します |
刺激信号には reg を使用する | 時間の経過とともに変化するため |
最後に $finish を追加する | シミュレーションを停止するため |
チャレンジ
ORゲートのモジュールが与えられています。あなたのタスクは、不足しているスティミュラス(入力信号)と結果を表示するための $display 文を追加することです。
行うべきこと:
4つの入力の組み合わせ(00, 01, 10, 11)すべてをテストするためのスティミュラスを追加します。
- 各行で、
xとyの値を設定します - 遅延のために
#10を追加します - 結果を表示するために
$displayを追加します
$display は次のように記述してください:
$display("%d %d | %d", x, y, z);チートシート
スティミュラス(Stimulus)とは、テストベンチにおいてDUT(Design Under Test:テスト対象デバイス)が正しく動作するかを検証するために適用される入力値のことです。
スティミュラスを作成する方法
逐次代入(Sequential assignments) – 最も単純なアプローチです:
initial begin
a = 0; b = 0; #10;
a = 0; b = 1; #10;
$finish;
endForループ – すべての入力の組み合わせをテストします:
integer i;
initial begin
for (i = 0; i < 4; i = i + 1) begin
{a, b} = i; #10;
end
$finish;
endRepeatループ – スティミュラスをN回繰り返します:
repeat (10) begin
#10 a = ~a;
endForeverループ – クロックのような連続的な信号に使用します:
initial begin
clk = 0;
forever #5 clk = ~clk;
end重要なルール
- スティミュラス信号には
regを使用します(時間の経過とともに値が変化するため) - DUTが応答できるように、代入の間に遅延(例:
#10)を追加します $finishでシミュレーションを終了させます
自分で試してみよう
module or_gate (
input x,
input y,
output z
);
assign z = x | y;
endmodule
module testbench;
reg x, y;
wire z;
or_gate dut (
.x(x),
.y(y),
.z(z)
);
initial begin
$display("x y | z");
$display("---------");
// TODO: 0 0 の入力刺激と表示を追加
// TODO: 0 1 の入力刺激と表示を追加
// TODO: 1 0 の入力刺激と表示を追加
// TODO: 1 1 の入力刺激と表示を追加
$finish;
end
endmoduleこのレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。