Menu
Coddy logo textTech

Stimulus 생성

Coddy Verilog 여정의 기초 섹션에 포함된 레슨 — 90개 중 74번째.

Stimulus는 디자인이 올바르게 작동하는지 테스트하기 위해 적용하는 입력 값을 의미합니다. 입력을 변경하고 출력을 관찰함으로써 디자인이 예상대로 동작하는지 확인할 수 있습니다.

기계를 테스트하는 것과 같다고 생각해보세요. 여러 가지 버튼(stimulus)을 누르고 어떤 일이 일어나는지(outputs) 지켜보는 것입니다. 좋은 자극(stimulus)을 생성하는 것은 테스트벤치(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가 출력을 생성할 수 있는 시간을 제공합니다.

Stimulus 생성 방법

방법용도예시
순차적 할당 (Sequential assignments)단순 테스트a = 0; b = 0; #10;
For 루프모든 조합 테스트for (i = 0; i < 4; i++)
Repeat 루프반복 패턴repeat (10) #5 clk = ~clk;
Forever 루프지속적인 신호forever #5 clk = ~clk;

방법 1: 순차적 할당

자극(stimulus)을 생성하는 가장 간단한 방법입니다. 지연 시간(delay)과 함께 값을 하나씩 할당합니다.

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: 반복 루프

동일한 자극을 여러 번 반복하는 데 유용합니다.

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 assignments) 사이에 지연 사용#10은 DUT가 응답할 시간을 제공합니다
자극 신호에 reg 사용시간에 따라 값이 변하기 때문입니다
마지막에 $finish 추가시뮬레이션을 중지하기 위함입니다
challenge icon

챌린지

OR 게이트 모듈이 주어집니다. 여러분의 작업은 누락된 자극(stimulus)과 결과를 출력하기 위한 $display 문을 추가하는 것입니다.

수행할 작업:

네 가지 입력 조합(00, 01, 10, 11)을 모두 테스트하기 위한 자극을 추가하세요:

  1. 각 줄에서 xy의 값을 설정합니다.
  2. 지연 시간을 위해 #10을 추가합니다.
  3. 결과를 출력하기 위해 $display를 추가합니다.

<strong>$display</strong>는 다음과 같아야 합니다:

$display("%d %d | %d", x, y, z);

치트 시트

자극(Stimulus)은 올바른 동작을 검증하기 위해 테스트벤치에서 DUT에 적용되는 입력 값입니다.

자극을 생성하는 방법

순차적 할당(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실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

기초의 모든 레슨