Menu
Coddy logo textTech

スティミュラスの作成

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 を追加するシミュレーションを停止するため
challenge icon

チャレンジ

ORゲートのモジュールが与えられています。あなたのタスクは、不足しているスティミュラス(入力信号)と結果を表示するための $display 文を追加することです。

行うべきこと:

4つの入力の組み合わせ(00, 01, 10, 11)すべてをテストするためのスティミュラスを追加します。

  1. 各行で、xy の値を設定します
  2. 遅延のために #10 を追加します
  3. 結果を表示するために $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;
end

Forループ – すべての入力の組み合わせをテストします:

integer i;
initial begin
  for (i = 0; i < 4; i = i + 1) begin
    {a, b} = i; #10;
  end
  $finish;
end

Repeatループ – スティミュラスをN回繰り返します:

repeat (10) begin
  #10 a = ~a;
end

Foreverループ – クロックのような連続的な信号に使用します:

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
quiz icon腕試し

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

基礎のすべてのレッスン