[Verilog 문법] 5.2 시스템 태스크

YUN·2026년 1월 23일

디지털 회로 설계

목록 보기
18/20

시스템 태스크

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

출력 태스크

예시

(1) $display

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에서 사용하는 포맷 지정자는 아래와 같다.

(2) $write

initial begin
    $write("A");
    $write("B");
    $write("C\n");
end

출력은 아래와 같다.

ABC

$write은 $display와 다르게 줄바꿈이 없다는 특징이있다.

(3) $monitor

$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;    // 모니터링 중지

(4) strobe

그 시간의 모든 업데이트 후의 최종 값을 출력한다.

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 이 존재한다.

(1) 예시-$finish, $stop

initial begin
    #1000;
    $finish;    // 시뮬레이션 종료
end

initial begin
    #500;
    $stop;      // 시뮬레이션 일시정지 (디버거로 전환)
end

위와 같이 시뮬레이션 제어 태스크를 활용할 수 있다.

$finish에는 여러가지 옵션이 존재한다.

$finish;      // 또는 $finish(1)
$finish(0);   // 메시지 없이 종료
$finish(1);   // 시간과 위치 출력
$finish(2);   // 시간, 위치, 메모리/CPU 통계

(2) 예시 - $time

시간 관련 태스크에는 $time이 존재한다.

initial begin
    #100;
    $display("$time = %0d", $time);         // 정수 시간
    $display("$stime = %0d", $stime);       // 32비트 시간
    $display("$realtime = %0f", $realtime); // 실수 시간
end

파일 입출력 태스크

(1) 파일 쓰기 : $fwrite, $fdisplay

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 은 줄바꿈이 존재하지 않는다.

(2) 파일 읽기 : $readmemh, $readmemb

$readmemh, $readmemb는 파일에 있는 데이터를 읽어서 메모리 배열(reg/logic unpacked array) 에

채워 넣는 시스템 태스크이다.

  • $readmemh : 파일의 값이 16진수(hex) 로 적혀있음
  • $readmemb : 파일의 값이 2진수(bin) 로 적혀있음

와 같은 차이가 존재한다.

파형 덤프 태스크

파형 덤프(waveform dump) 태스크는 시뮬레이션 중 신호 변화를 파일로 기록해서, 나중에 GTKWave/Verdi 같은 뷰어로 파형을 눈으로 확인할 수 있게 해주는 시스템 태스크

관련해서 자세한 사항은 사용할 일이 있을때 공부해봐야겠다.

기타 유용한 태스크

  • $random : 32bit signed 랜덤 값
  • $random %100 : 0~99범위 랜덤 값
  • $urandom :32bit unsigned 랜덤 값
  • $urandom_range(10, 0): 0~10 범위 랜덤 값
profile
안녕하세요. 전자공학부 학부생의 공부 기록입니다.

0개의 댓글