$로 시작하며, 시뮬레이션 제어와 디버깅에 사용된다

initial begin
$display("Hello Verilog");
$display("Decimal: %d", 255);
$display("Hex: %h", 255);
$display("Binary: %b", 8'b1010);
$display("Time: %t", $time);
end
출력은 아래와 같다.
Hello Verilog
Decimal: 255
Hex: ff
Binary: 00001010
Time: 0
$display에서 사용하는 포맷 지정자는 아래와 같다.

initial begin
$write("A");
$write("B");
$write("C\n");
end
출력은 아래와 같다.
ABC
$write은 $display와 다르게 줄바꿈이 없다는 특징이있다.
$monitor는 값 변경시 자동으로 출력하는 기능이다.
initial begin
$monitor("Time=%0t a=%b b=%b sum=%b",
$time, a, b, sum);
end
initial begin
a = 0; b = 0;
#10 a = 1;
#10 b = 1;
#10 a = 0;
end
출력은 아래와 같다.
Time=0 a=0 b=0 sum=0
Time=10 a=1 b=0 sum=1
Time=20 a=1 b=1 sum=0
Time=30 a=0 b=1 sum=1
추가로, monitor는 기능을 켜거나 끌 수 있다.
$monitoron; // 모니터링 시작
$monitoroff; // 모니터링 중지
그 시간의 모든 업데이트 후의 최종 값을 출력한다.
reg [7:0] count;
always @(posedge clk)
count <= count + 1;
always @(posedge clk) begin
$display("display: count=%d", count);
$strobe("strobe: count=%d", count);
end
출력하면 아래와 같은 결과가 나온다.
display: count=0
strobe: count=1
시뮬레이션 제어 태스크에는 $finish와 $stop, $time 이 존재한다.
initial begin
#1000;
$finish; // 시뮬레이션 종료
end
initial begin
#500;
$stop; // 시뮬레이션 일시정지 (디버거로 전환)
end
위와 같이 시뮬레이션 제어 태스크를 활용할 수 있다.
$finish에는 여러가지 옵션이 존재한다.
$finish; // 또는 $finish(1)
$finish(0); // 메시지 없이 종료
$finish(1); // 시간과 위치 출력
$finish(2); // 시간, 위치, 메모리/CPU 통계
시간 관련 태스크에는 $time이 존재한다.
initial begin
#100;
$display("$time = %0d", $time); // 정수 시간
$display("$stime = %0d", $stime); // 32비트 시간
$display("$realtime = %0f", $realtime); // 실수 시간
end
integer file_handle;
initial begin
file_handle = $fopen("output.txt", "w");
if (file_handle == 0) begin
$display("Error: Cannot open file");
$finish;
end
$fwrite(file_handle, "Header Line\n");
$fwrite(file_handle, "Data: %d\n", 100);
$fwrite(file_handle, "Hex: %h\n", 8'hAB);
$fclose(file_handle);
end
파일 모드에는 w(쓰기), a(추가) ,r(읽기) 이 있다.
$fwrite와 $fdisplay의 차이는 무엇일까?
둘 다 파일로 출력하는 기능을하지만,
$fdisplay 는 줄바꿈이 존재하고
$fwrite 은 줄바꿈이 존재하지 않는다.
$readmemh, $readmemb는 파일에 있는 데이터를 읽어서 메모리 배열(reg/logic unpacked array) 에
채워 넣는 시스템 태스크이다.
와 같은 차이가 존재한다.
파형 덤프(waveform dump) 태스크는 시뮬레이션 중 신호 변화를 파일로 기록해서, 나중에 GTKWave/Verdi 같은 뷰어로 파형을 눈으로 확인할 수 있게 해주는 시스템 태스크
관련해서 자세한 사항은 사용할 일이 있을때 공부해봐야겠다.