Creating Stimulus
CoddyのVerilogジャーニー「基礎」セクションの一部。レッスン 74/90。
Stimulus とは、設計が正しく動作するかをテストするために適用する input の値を指します。inputs を変更して outputs を観察することで、設計が期待どおりに動作することを検証できます。
機械をテストするようなものだと考えてみてください。さまざまなボタン(stimulus)を押して、何が起こるか(outputs)を観察します。優れたstimulusを作成することは、testbenchを書くうえで不可欠な部分です。
たとえば、次のtestbenchのstimulusを見てみましょう:
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: Forever ループ
クロックのような連続信号に便利です。
initial begin
clk = 0;
forever #5 clk = ~clk;
end重要なルール
| ルール | 説明 |
|---|---|
| stimulus の代入の間に遅延を使用する | #10 によって DUT が応答する時間を確保できます |
stimulus 信号には reg を使用する | 時間の経過とともに変化するため |
最後に Add $finish を追加する | シミュレーションを停止するため |
チャレンジ
ORゲートモジュールが与えられています。結果を出力するために、不足している刺激と$displayステートメントを追加するのがあなたの課題です。
行うこと:
4つすべての入力の組み合わせ(00、01、10、11)をテストする刺激を追加します。
- 各行で、
xとyの値を設定します - 遅延として
#10を追加します - 結果を出力するために
$displayを追加します
次のような<strong>$display</strong>にします:
$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このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
基礎のすべてのレッスン
4Operators Part 1
Arithmetic OperatorsModulo OperatorComparison OperatorsRecap - Simple MathBitwise Operators7Assign And Gates
Continuous AssignmentAssign With OperatorsBuilt In Gate PrimitivesAND OR NOT GatesXOR XNOR GatesRecap - Logic Gate Circuit10Decision Making
If StatementIf - ElseRecap - Simple ComparatorCase StatementCasex And CasezRecap - ALU Design5Operators Part 2
Logical OperatorsReduction OperatorsShift OperatorsConcatenation OperatorConditional OperatorRecap - Operator Challenge14Testbench Basics
What Is A TestbenchCreating StimulusDisplay And MonitorDumpfile And DumpvarsUsing System TasksRecap - Full Testbench3Number System
Binary RepresentationSized NumbersUnsized NumbersNegative NumbersSpecial Values X And ZRecap - Number Formats6Modules
Module StructureInput And Output PortsInout PortsModule InstantiationPort Mapping By NamePort Mapping By OrderRecap - Build A Module9Procedural Blocks
Always BlockInitial BlockSensitivity ListBlocking AssignmentNon Blocking AssignmentRecap - Always vs Initial15Traffic Light Controller
Defining The StatesState Machine Logic自分で練習してみよう: Verilogオンラインコンパイラ