Creating Stimulus
Coddy Verilog 여정의 기초 섹션에 포함된 레슨. 90개 중 74번째.
Stimulus는 설계가 올바르게 작동하는지 테스트하기 위해 적용하는 입력값을 의미합니다. 입력을 변경하고 출력을 관찰하면 설계가 예상대로 동작하는지 확인할 수 있습니다.
기계를 테스트하는 것처럼 생각해 보세요. 다양한 버튼(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각 stimulus가 적용된 다음, 다음 stimulus 전에 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: 순차 할당
자극을 생성하는 가장 간단한 방법입니다. 지연을 두고 값을 하나씩 할당합니다.
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를 사용하세요 | 시간이 지남에 따라 변경되기 때문입니다 |
끝에 $finish를 Add하세요 | 시뮬레이션을 중지하기 위해서입니다 |
챌린지
OR 게이트 모듈이 주어집니다. 결과를 출력할 수 있도록 누락된 자극과 $display 문을 추가하는 것이 과제입니다.
해야 할 일:
네 가지 입력 조합(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 컴파일러