Display와 Monitor
Coddy Verilog 여정의 기초 섹션에 포함된 레슨 — 90개 중 75번째.
$display와 $monitor는 시뮬레이션 정보를 출력하는 데 사용되는 시스템 태스크입니다. 이들은 설계 내부에서 어떤 일이 일어나고 있는지 확인하는 데 도움을 줍니다.
$display
$display는 실행되는 순간 메시지를 한 번 출력합니다.
구문:
$display("message", variables);예제:
initial begin
$display("Simulation started");
#10;
$display("Time 10");
#10;
$display("Time 20");
end출력:
Simulation started
Time 10
Time 20$monitor
$monitor는 변수 중 어느 하나라도 변경될 때마다 자동으로 메시지를 출력합니다.
구문:
$monitor("message", variables);예제:
initial begin
a = 0; b = 0;
$monitor("Time %0t: a=%b, b=%b", $time, a, b);
#10 a = 1;
#10 b = 1;
#10 a = 0;
end출력:
Time 0: a=0, b=0
Time 10: a=1, b=0
Time 20: a=1, b=1
Time 30: a=0, b=1$display vs $monitor
| $display | $monitor | |
|---|---|---|
| 출력 시점 | 실행 시 한 번 | 변수 값이 변할 때마다 |
| 출력 횟수 | 호출한 횟수만큼 | 지속적으로 (변경될 때까지) |
| 용도 | 헤더, 테스트 메시지 | 변화하는 신호 추적 |
일반적인 형식 지정자
| 지정자 | 의미 | 예시 |
|---|---|---|
%b | 2진수 | $display("%b", a); |
%d | 10진수 | $display("%d", count); |
%h | 16진수 | $display("%h", data); |
%t | 시간 | $display("%t", $time); |
%0t | 시간 (공백 없음) | $display("%0t", $time); |
%s | 문자열 | $display("%s", "Hello"); |
중요 규칙
| 규칙 | 설명 |
|---|---|
$display는 한 번 출력합니다 | 헤더 및 최종 결과에 적합합니다 |
$monitor는 값이 변경될 때 출력합니다 | 신호 관찰에 적합합니다 |
하나의 $monitor만 활성화됩니다 | 마지막 설정이 이전 설정을 덮어씁니다 |
중지하려면 $finish를 사용하세요 | 그렇지 않으면 시뮬레이션이 영원히 실행될 수 있습니다 |
챌린지
이 테스트벤치에 누락된 $display와 $monitor 문을 추가하세요.
수행할 작업:
- 헤더를 출력하기 위해
$display를 추가하세요: "Testing OR Gate" - 신호가 변경될 때마다 시간, x, y, z를 출력하도록
$monitor를 추가하세요. 형식: "Time %0t: x=%b, y=%b, z=%b" - 마지막에 "Test complete"를 출력하도록
$display를 추가하세요.
치트 시트
$display는 실행될 때 한 번 출력하며, $monitor는 포함된 변수 중 어느 하나라도 변경될 때마다 자동으로 출력합니다.
$display("message", variables);
$monitor("message", variables);예제:
initial begin
$display("Simulation started");
$monitor("Time %0t: a=%b, b=%b", $time, a, b);
#10 a = 1;
#10 b = 1;
end일반적인 형식 지정자(format specifiers):
%b— 이진수 (Binary)%d— 십진수 (Decimal)%h— 십육진수 (Hexadecimal)%t/%0t— 시간 (패딩 포함/미포함)%s— 문자열 (String)
주요 규칙:
- 한 번에 하나의
$monitor만 활성화됩니다. 마지막에 선언된 것이 이전의 것들을 덮어씁니다. - 시뮬레이션을 중단하려면
$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
// TODO: $display 헤더 "Testing OR Gate" 추가
// TODO: 시간, x, y, z를 추적하기 위한 $monitor 추가
// 형식: "Time %0t: x=%b, y=%b, z=%b"
// 자극(stimulus) 적용
x = 0; y = 0; #10;
x = 0; y = 1; #10;
x = 1; y = 0; #10;
x = 1; y = 1; #10;
// TODO: $display "Test complete" 추가
$finish;
end
endmodule이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.