Menu

Verilog $dumpfile과 $dumpvars: VCD 파형 만들기

testbench에 VCD 파형 출력을 추가하는 법 - $dumpfile, $dumpvars, 스코프 선택, 그리고 결과 파일을 GTKWave 또는 브라우저 에디터에서 보는 법.

이 페이지에는 실행 가능한 에디터가 있습니다 - 편집하고 실행하면 결과를 바로 볼 수 있습니다.

실제로 원하는 파형

$display는 텍스트를 출력합니다. 빠른 점검에는 괜찮지만, timing 문제가 있는 카운터를 디버깅하거나 멈춘 상태 머신을 보는 순간 그림 이 필요합니다: 시간 위에 그려진 전압, 스크롤 가능, zoom 가능, 어떤 전이에든 떨어뜨릴 수 있는 커서.

그 그림이 VCD 파일 입니다 - "value change dump", 원래 Verilog 사양에서 IEEE가 표준화한 텍스트 형식. 현대 시뮬레이터는 모두 쓸 수 있고, 현대 파형 뷰어는 모두 읽을 수 있습니다. 만드는 비용은 testbench 두 줄입니다.

두 줄

initial 블록 안 - 보통 자극을 담은 블록과 같은 - 에 다음을 추가합니다.

$dumpfile("dump.vcd");
$dumpvars(0, test);
  • $dumpfile 은 출력 파일 이름을 정합니다. 어떤 경로든 가능; 디렉터리가 없으면 시뮬레이터의 작업 디렉터리에 놓입니다.
  • $dumpvars(0, test) 는 "test 스코프와 모든 하위 스코프의 모든 신호를 무제한 깊이로 기록하라"는 뜻입니다.

설정의 전부입니다. 시뮬레이션을 실행하면 GTKWave나 브라우저 에디터의 Waveform 탭에서 열 수 있는 dump.vcd를 얻습니다.

완전한 예시

실행하세요. Waveform 탭이 이제 세 신호 - clk, reset, count - 를 전체 시뮬레이션 시간에 걸쳐 보여 줍니다. 어떤 지점에든 커서를 떨어뜨려 그 시간의 신호 값을 읽을 수 있습니다. 단일 클럭 사이클을 드래그-zoom해서 살펴볼 수 있습니다.

$dumpvars의 첫 인자가 하는 일

$dumpvars(depth, scope)scope와 그것이 포함하는 모든 sub-instance를 walking하며 depth 레벨 깊이까지 신호를 기록합니다. depth 값.

  • 0 - 무제한. scope와 모든 중첩 서브모듈의 모든 신호 기록.
  • 1 - scope에 직접 선언된 신호만. 서브모듈은 기록 안 됨.
  • 2 - scope + 서브모듈 한 레벨.
  • N - scope + 서브모듈 N-1 레벨.

실전에서 $dumpvars(0, test)가 거의 모든 testbench가 쓰는 것입니다. 모든 것을 캡처하는 게 저렴하고(VCD는 전이만 저장, steady state 아님), 디버깅 도중에 필요한 신호가 dump되지 않았음을 발견하고 싶지 않습니다.

설계가 정말 크고 VCD가 너무 크다면 선택적으로 dump할 수 있습니다.

$dumpvars(0, dut.inner_module);     // 관심 있는 서브모듈만
$dumpvars(0, dut.regs);             // register 파일만

스코프를 누적하려면 $dumpvars를 여러 번 호출할 수 있습니다.

특정 신호 dump

$dumpvars는 스코프 전체 대신 특정 신호 목록을 받을 수도 있습니다.

$dumpvars(0, test.clk, test.reset, dut.count);

세 신호만 기록합니다. 설계가 거대한데 신호 몇 개만 중요할 때 유용. 작은 설계라면 모두 dump하는 게 단순합니다.

시뮬레이션 중 dump 제어

$dumpvars와 짝지을 태스크 둘.

  • $dumpoff - dump 일시 정지. 더 이상 변경이 VCD에 들어가지 않음.
  • $dumpon - dump 재개.
initial begin
    $dumpfile("dump.vcd");
    $dumpvars(0, test);

    // ... 흥미로운 영역 ...

    #1000 $dumpoff;
    // ... VCD에 두고 싶지 않은 길고 지루한 영역 ...
    #5000 $dumpon;

    // ... 또 다른 흥미로운 영역 ...
end

긴 테스트의 "백만 사이클 도는" 지루한 부분을 5GB VCD 없이 건너뛰는 방법입니다.

결과 보기

두 가지 주요 방법.

브라우저 에디터에서

이 페이지의 에디터는 VCD를 인라인으로 렌더링합니다. 시뮬레이션을 돌리고, Waveform 탭으로 전환하면 왼쪽에 계층과 함께 신호가 나타나고 오른쪽에 드래그 가능한 커서가 있습니다. trace 어디든 클릭해 커서를 떨어뜨리면 각 신호 이름 옆에 작은 알약 모양으로 그 시간의 값이 표시됩니다.

GTKWave에서

로컬에서 시뮬레이션을 돌렸다면(iverilog -o sim test.v 다음 vvp sim) 결과 VCD를 다음으로 엽니다.

gtkwave dump.vcd

GTKWave가 파일을 로딩하고 왼쪽에 스코프 트리를 보여 주며, 오른쪽 파형 영역에 신호를 드래그하길 기다립니다. 멀티 비트 신호에 마우스 우클릭으로 표시 형식(binary, hex, decimal, analog)을 바꿀 수 있습니다. 아래 검색창으로 특정 시간이나 신호 전이로 점프할 수 있습니다.

흔한 패턴

작은 testbench helper

대부분의 testbench 파일이 이 정확한 블록으로 시작합니다. 모든 것을 한 initial에 합쳐 짧게 유지할 수 있습니다.

initial begin
    $dumpfile("dump.vcd");
    $dumpvars(0, test);

    // ... 자극 ...

    $finish;
end

조건부 dump

실패한 테스트에만 VCD 출력을 원하는 테스트 환경에서.

initial begin
    if (DUMP_VCD) begin
        $dumpfile("dump.vcd");
        $dumpvars(0, test);
    end
    // ... 자극 ...
end

DUMP_VCD는 커맨드라인에서 설정하거나 테스트 모드에 따라 정의하는 parameter일 것입니다. regression 스위트의 디스크 공간을 아낍니다.

메모리 dump

메모리(unpacked array)는 기본적으로 $dumpvars로 dump되지 않습니다 - 거대할 수 있기 때문. 원한다면 $dumpvars(0, dut.memory)를 명시적으로 쓰거나 일부 시뮬레이터의 $dumpmem을 사용.

흔한 실수

VCD 파일이 비어 있음. $dumpfile이나 $dumpvars를 잊었거나, 신호가 변하기 전에 시뮬레이션이 $finish를 호출했습니다. 설정 후 적어도 몇 시간 단위는 돌리세요.

파형에 신호가 없음. 넘긴 스코프가 그것을 포함하지 않았습니다. $dumpvars(0, dut)dut 안의 것만 기록합니다; testbench가 test 레벨에서 신호를 구동한다면 그것들은 나타나지 않습니다. 항상 testbench 스코프에서 dump하세요: $dumpvars(0, test).

VCD 파일이 거대함. 빠르게 변하는 넓은 신호로 긴 시뮬레이션은 많은 VCD 줄을 만들어 냅니다. 세 가지 해결: 더 좁은 스코프 dump, 지루한 부분 주변에 $dumpoff/$dumpon 사용, 또는 더 컴팩트한 형식인 FST로 전환(iverilog과 GTKWave 모두 -fst 플래그로 지원).

다음에 볼 내용

이 장의 마지막 문서 - Timescale and Delays - 는 `timescale 지시문과 #delay가 실제로 wall-clock 시간에 어떻게 매핑되는지를 설명합니다. 그 뒤에는 문서를 끝까지 완료한 셈입니다.

자주 묻는 질문

Verilog의 VCD 파일이란?

VCD는 Value Change Dump의 약자 - 시뮬레이션 동안 모든 신호 전이를 기록하는 텍스트 형식입니다. 시뮬레이터는 시간 0에 각 신호의 초기값을 쓰고, 그 다음 timestamp와 함께 모든 변경을 씁니다. GTKWave 같은 파형 뷰어가 파일을 읽어 스크롤과 zoom이 가능한 그래픽 타이밍 다이어그램으로 렌더링합니다.

Verilog에서 VCD 파일은 어떻게 생성하나요?

testbench의 initial 블록 안에 두 시스템 태스크를 추가합니다: $dumpfile("dump.vcd");는 출력 파일 이름을, $dumpvars(0, top_module);top_module과 그 아래의 모든 신호를 기록합니다. 시뮬레이션이 끝나면 어떤 파형 뷰어에서든 열 수 있는 dump.vcd 파일을 갖게 됩니다.

Verilog에서 $dumpvars(0, ...)는 무엇을 의미하나요?

$dumpvars(depth, instance)instance부터 시작해 depth 레벨 깊이까지 재귀하며 신호를 기록합니다. $dumpvars(0, test)는 ' test 스코프와 모든 하위 스코프의 모든 신호'를 의미합니다 - depth 0은 특별하고 무제한을 의미합니다. $dumpvars(1, test)는 인스턴스화된 서브모듈은 빼고 test에 직접 있는 신호만 기록합니다.

Verilog VCD 파일이 왜 비어 있나요?

세 가지 가능한 원인: $dumpfile/$dumpvars를 호출하지 않음; 신호가 변하기 전에 시뮬레이션이 $finish에 도달함(dump 호출 이후 적어도 몇 시간 단위는 돌리세요); $dumpvars에 넘긴 스코프가 실제 계층과 일치하지 않음. 최소 작동 시퀀스는 $dumpfile("dump.vcd"); $dumpvars(0, test); #10; $finish;입니다.

Coddy programming languages illustration

Coddy로 코딩 배우기

시작하기