Menu

$dumpfile dan $dumpvars di Verilog: Menghasilkan Waveform VCD

Cara menambahkan output waveform VCD ke testbench: $dumpfile, $dumpvars, pemilihan scope, dan cara melihat file hasilnya di GTKWave atau editor browser.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

Waveform yang Sebenarnya Kamu Butuhkan

$display mencetak teks. Itu cukup untuk pengecekan cepat, tapi begitu kamu sedang debug counter yang punya masalah timing atau state machine yang macet, kamu butuh gambar: sinyal yang digambar sebagai tegangan dari waktu ke waktu, bisa digulir, bisa diperbesar, dengan kursor yang bisa kamu taruh di transisi mana pun.

Gambar itu adalah file VCD, singkatan dari "value change dump", format teks yang distandardisasi IEEE di spesifikasi Verilog yang asli. Setiap simulator modern bisa menulisnya; setiap penampil waveform modern bisa membacanya. Biaya untuk menghasilkannya hanya dua baris di testbench-mu.

Dua Baris Itu

Di dalam blok initial, biasanya blok yang sama dengan tempat stimulus-mu, tambahkan:

$dumpfile("dump.vcd");
$dumpvars(0, test);
  • $dumpfile memberi nama file output-nya. Berikan path apa pun; kalau tanpa folder, file-nya akan berada di folder kerja simulator.
  • $dumpvars(0, test) berarti "rekam setiap sinyal di scope test dan setiap sub-scope-nya, secara rekursif, tanpa batas kedalaman".

Itulah seluruh persiapannya. Jalankan simulasi dan kamu akan punya dump.vcd yang bisa dibuka di GTKWave atau di tab Waveform editor browser.

Contoh Lengkap

Jalankan. Tab Waveform sekarang menampilkan tiga sinyal, yaitu clk, reset, dan count, yang digambar sepanjang waktu simulasi. Kamu bisa menaruh kursor di titik mana pun dan membaca nilai sinyal pada waktu itu. Kamu bisa menyeret untuk memperbesar dan memeriksa satu siklus clock.

Fungsi Argumen Pertama $dumpvars

$dumpvars(depth, scope) menelusuri scope dan setiap sub-instance di dalamnya, merekam sinyal sampai sedalam depth tingkat. Nilai kedalamannya:

  • 0: tanpa batas. Setiap sinyal di scope dan setiap sub-module bertingkat di dalamnya akan direkam.
  • 1: hanya sinyal yang dideklarasikan langsung di scope. Sub-module tidak direkam.
  • 2: scope ditambah satu tingkat sub-module.
  • N: scope ditambah N-1 tingkat sub-module.

Dalam praktiknya, $dumpvars(0, test) dipakai hampir di setiap testbench. Merekam semuanya itu murah (VCD hanya menyimpan transisi, bukan keadaan yang tetap), dan kamu tidak mau baru sadar di tengah debug bahwa sinyal yang kamu butuhkan tidak ikut disimpan.

Kalau desainmu sangat besar dan file VCD-nya terlalu besar, kamu bisa menyimpan secara selektif:

$dumpvars(0, dut.inner_module);     // just the interesting sub-module
$dumpvars(0, dut.regs);             // just the register file

Kamu bisa memanggil $dumpvars beberapa kali untuk menambahkan beberapa scope.

Menyimpan Sinyal Tertentu

$dumpvars juga bisa menerima daftar sinyal tertentu alih-alih seluruh scope:

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

Ini hanya merekam ketiga sinyal itu. Berguna saat desainnya sangat besar dan kamu hanya peduli pada segelintir sinyal. Untuk desain kecil, menyimpan semuanya lebih sederhana.

Mengatur Dump di Tengah Simulasi

Ada dua task lagi yang berpasangan dengan $dumpvars:

  • $dumpoff: menjeda dump. Perubahan selanjutnya tidak masuk ke VCD.
  • $dumpon: melanjutkan dump.
initial begin
    $dumpfile("dump.vcd");
    $dumpvars(0, test);

    // ... interesting region ...

    #1000 $dumpoff;
    // ... long boring region we don't want in the VCD ...
    #5000 $dumpon;

    // ... another interesting region ...
end

Begitulah cara melewati bagian membosankan "berjalan sejuta siklus" di pengujian yang panjang tanpa menghasilkan file VCD sebesar 5GB.

Melihat Hasilnya

Ada dua cara utama:

Di Editor Browser

Editor di halaman ini menampilkan VCD langsung di halaman. Jalankan simulasinya; pindah ke tab Waveform; sinyal-sinyalnya muncul dengan hierarkinya di sebelah kiri dan kursor yang bisa diseret di sebelah kanan. Klik di mana saja pada sebuah jejak sinyal untuk menaruh kursor; nilai sinyal pada waktu itu ditampilkan sebagai label kecil di sebelah setiap nama sinyal.

Di GTKWave

Kalau kamu menjalankan simulasi secara lokal (iverilog -o sim test.v lalu vvp sim), buka file VCD hasilnya dengan:

gtkwave dump.vcd

GTKWave memuat file itu, menampilkan pohon scope di sebelah kiri, lalu menunggumu menyeret sinyal ke area waveform di sebelah kanan. Klik kanan pada sinyal multi-bit untuk mengubah format tampilannya (biner, hex, desimal, analog). Pakai kotak pencarian di bagian bawah untuk melompat ke waktu tertentu atau ke transisi sinyal tertentu.

Pola yang Umum

Bantuan Kecil untuk Testbench

Kebanyakan file testbench diawali dengan blok yang persis seperti ini. Kamu bisa membuatnya tetap pendek dengan menggabungkan semuanya dalam satu initial:

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

    // ... stimulus ...

    $finish;
end

Dump Bersyarat

Di lingkungan pengujian di mana kamu hanya ingin output VCD untuk pengujian yang gagal:

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

DUMP_VCD adalah sebuah parameter yang kamu atur dari command line atau definisikan sesuai mode pengujiannya. Menghemat ruang disk di suite regresi.

Dump Memori

Memori (array unpacked) tidak disimpan oleh $dumpvars secara default, karena ukurannya bisa sangat besar. Pakai $dumpvars(0, dut.memory) secara eksplisit kalau kamu menginginkannya, atau $dumpmem di beberapa simulator.

Kesalahan yang Umum

File VCD kosong. Kamu lupa $dumpfile atau $dumpvars, atau simulasi memanggil $finish sebelum ada sinyal yang berubah. Jalankan setidaknya beberapa satuan waktu setelah persiapannya.

Sinyal tidak muncul di waveform. Scope yang kamu berikan tidak mencakupnya. $dumpvars(0, dut) hanya merekam isi dut; kalau testbench-mu menggerakkan sinyal di tingkat test, sinyal itu tidak akan muncul. Selalu lakukan dump dari scope testbench: $dumpvars(0, test).

File VCD terlalu besar. Simulasi panjang dengan sinyal lebar yang cepat berubah menghasilkan banyak baris VCD. Ada tiga solusi: simpan scope yang lebih sempit, pakai $dumpoff/$dumpon di sekitar bagian yang membosankan, atau beralih ke format yang lebih ringkas seperti FST (yang didukung iverilog dan GTKWave dengan flag -fst).

Selanjutnya

Dokumen terakhir di bab ini, Timescale dan Delay, menjelaskan direktif `timescale dan bagaimana #delay sebenarnya dipetakan ke waktu nyata. Setelah itu, kamu sudah menyelesaikan dokumentasi ini dari awal sampai akhir.

Pertanyaan yang sering diajukan

Apa itu file VCD di Verilog?

VCD adalah singkatan dari Value Change Dump, format teks untuk merekam setiap transisi sinyal selama simulasi. Simulator menulis nilai awal setiap sinyal pada waktu 0, lalu setiap perubahan beserta cap waktunya. Penampil waveform seperti GTKWave membaca file itu dan menampilkannya sebagai diagram timing grafis yang bisa kamu gulir dan perbesar.

Bagaimana cara membuat file VCD di Verilog?

Tambahkan dua system task di dalam blok initial di testbench-mu: $dumpfile("dump.vcd"); memberi nama file output-nya, dan $dumpvars(0, top_module); merekam setiap sinyal di top_module dan di bawahnya. Setelah simulasi selesai, kamu akan punya file dump.vcd yang bisa dibuka di penampil waveform apa pun.

Apa arti $dumpvars(0, ...) di Verilog?

$dumpvars(depth, instance) merekam sinyal mulai dari instance dan masuk ke dalam sedalam depth tingkat. $dumpvars(0, test) berarti 'semua sinyal di scope test dan setiap sub-scope-nya, secara rekursif': kedalaman 0 itu istimewa dan berarti tanpa batas. $dumpvars(1, test) hanya akan merekam sinyal yang langsung berada di test, bukan di sub-module mana pun yang dibuat instance-nya.

Kenapa file VCD-ku kosong di Verilog?

Ada tiga kemungkinan penyebab: kamu sama sekali tidak memanggil $dumpfile/$dumpvars; simulasi sudah mencapai $finish sebelum ada sinyal yang berubah (jalankan setidaknya beberapa satuan waktu setelah pemanggilan dump); atau scope yang kamu berikan ke $dumpvars tidak sesuai dengan hierarki sebenarnya. Urutan minimal yang berfungsi adalah $dumpfile("dump.vcd"); $dumpvars(0, test); #10; $finish;.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai