刺激信号の作成
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が出力を生成する時間が確保されます。
刺激を作成する方法
| 方法 | 最適な用途 | 例 |
|---|---|---|
| 逐次代入 | シンプルなテスト | a = 0; b = 0; #10; |
| Forループ | すべての組み合わせのテスト | for (i = 0; i < 4; i++) |
| Repeatループ | パターンの繰り返し | repeat (10) #5 clk = ~clk; |
| Foreverループ | 連続信号 | forever #5 clk = ~clk; |
方法 1:順次代入
刺激を作成する最も簡単な方法です。遅延を入れながら、値を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:無限ループ
クロックのような連続信号に便利です。
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);自分で試してみよう
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このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
基礎のすべてのレッスン
自分で練習してみよう: Verilogオンラインコンパイラ