Menguasai $display dalam Verilog: Teknik Debugging Efektif dan Kontrol Tampilan

目次

1. Pendahuluan: Pentingnya dan Tujuan “display” dalam Verilog

Apa Arti “display” dalam Verilog?

Dalam Verilog, $display adalah tugas sistem yang digunakan sebagai alat untuk “menampilkan” keadaan internal suatu desain selama simulasi. Mirip dengan printf di C, ia memungkinkan Anda mengeluarkan sinyal, nilai variabel, dan string ke terminal atau konsol—memainkan peran sentral dalam debugging dan verifikasi fungsional.

Mengapa $display Penting untuk Pengembangan Verilog?

  • Meningkatkan efisiensi debugging : Pada desain sirkuit yang kompleks, memvisualisasikan apakah sinyal internal berfungsi dengan benar sangat penting. Dengan menggunakan $display, Anda dapat langsung memeriksa nilai sinyal yang diinginkan selama simulasi.
  • Visualisasi simulasi : Saat melacak transisi nilai pada titik waktu tertentu, gelombang saja mungkin tidak cukup. Log tampilan menyediakan cara yang dapat diandalkan untuk menandai momen‑momen tepat tersebut.
  • Bermanfaat untuk dokumentasi juga : Saat menyampaikan maksud desain atau aturan operasional kepada insinyur lain, menyisipkan log tampilan yang beranotasi dapat meningkatkan pemahaman kode.

Tujuan dan Struktur Artikel Ini

Dalam artikel ini, kami akan menjelaskan secara metodis hal‑hal berikut:

  1. Sintaks dasar dan penggunaan : Pengantar yang cermat tentang sintaks fundamental dan penggunaan $display.
  2. Perbandingan dengan tugas sistem lainnya : Kami akan menguraikan perbedaan antara tugas‑tugas terkait tampilan seperti $write, $strobe, dan $monitor.
  3. Spesifikator format dan teknik penggunaan lanjutan : Penggunaan spesifikator format seperti %d, %b, %h, %s, serta teknik tampilan khusus akan diperkenalkan.
  4. Contoh penggunaan praktis : Kami akan menunjukkan contoh konkret dalam test bench dan kode, memberikan pengetahuan yang dapat langsung diterapkan.
  5. Aplikasi kontrol tampilan : Contoh kasus penggunaan akan mencakup output perangkat keras seperti LCD atau kontrol monitor serta menampilkan output teks/gambar.

Dengan struktur ini, baik pemula maupun pengguna menengah dapat memahami $display dalam Verilog dengan tepat dan menerapkannya dalam praktik. Pada setiap bagian berikutnya, kami akan melanjutkan dengan jelas menggunakan contoh dan diagram bila memungkinkan.

2. Dasar‑dasar $display: Sintaks, Kasus Penggunaan, dan Perhatian

Sintaks Dasar $display

Saat menggunakan $display dalam Verilog, sintaks dasar adalah sebagai berikut.

$display("string or format specifiers", signal1, signal2, ...);
  • Bagian string : Tulis teks apa pun atau spesifikator format (misalnya: %d, %b, %h).
  • Argumen : Daftar nama sinyal atau variabel yang akan dikeluarkan sesuai format yang bersangkutan.

Contoh: Menampilkan hitungan jam dan nilai sinyal

$display("Time=%0t : clk=%b, reset=%b", $time, clk, reset);

Pada contoh ini, waktu simulasi serta nilai sinyal clock/reset dikeluarkan.

Kasus Penggunaan $display

  1. Memahami kemajuan simulasi Dengan menyisipkan $display pada titik‑titik tertentu dalam desain Anda dapat memverifikasi bagian kode mana yang telah dijalankan.
  2. Verifikasi nilai sinyal Bahkan ketika penampil gelombang menyulitkan pemahaman intuitif tentang cabang kondisional atau transisi status, output berupa teks membuat pemahaman menjadi lebih mudah.
  3. Menampilkan pesan bersyarat Dengan menggabungkan dengan pernyataan if Anda dapat mencatat pesan hanya ketika kondisi tertentu terpenuhi. if (reset) $display("Reset asserted at %0t", $time);

Perbedaan antara $display dan $write

$display secara otomatis menambahkan baris baru di akhir output. Sebaliknya, $write melanjutkan output tanpa menambahkan baris baru.
Contoh:

$display("Hello");
$display("World");

Output:

Hello
World
$write("Hello");
$write("World");

Output:

HelloWorld

Jika Anda memerlukan log yang lebih jelas baris per baris, gunakan $display. Ketika Anda ingin memformat output pada satu baris, gunakan $write.

Perhatian

  1. Hindari output berlebihan Jika Anda menggunakan $display setiap siklus clock, log akan menjadi sangat besar dan keterbacaan menurun. → Gunakan kondisional untuk mengurangi output.
  2. Manfaatkan tampilan waktu Menampilkan $time atau $realtime memungkinkan Anda menangkap timing operasi secara akurat.
  3. Tugas hanya untuk simulasi $display tidak dapat digunakan untuk sintesis (implementasi FPGA/ASIC). Ini adalah alat debug yang hanya untuk simulasi.

3. Membandingkan Sistem Tugas Log Output: $display, $write, $strobe, $monitor

Verilog menyediakan tugas sistem selain $display untuk output. Perbedaan penggunaan dan timing‑nya membuat penting untuk memahami cara menggunakannya secara terpisah.

$display: Tugas Display Standar

  • Karakteristik Secara otomatis menambahkan newline dan mencatat satu baris per pemanggilan.
  • Kasus Penggunaan Paling umum digunakan sebagai metode debug dasar; Anda dapat memanggilnya kapan saja untuk output satu kali.

$write: Display Tanpa Newline

  • Karakteristik Tidak menambahkan newline sehingga output berlanjut pada baris yang sama.
  • Kasus Penggunaan Berguna ketika Anda ingin menampilkan beberapa nilai berdampingan.
  • Contoh $write("A=%d, ", a); $write("B=%dn", b); → Output: A=5, B=10 .

$strobe: Output pada Akhir Siklus Simulasi

  • Karakteristik Mencetak nilai setelah semua evaluasi simulasi pada langkah saat ini selesai.
  • Kasus Penggunaan Berguna untuk menghindari kondisi balapan (ketika beberapa sinyal berubah secara bersamaan).
  • Contoh $strobe("Time=%0t, signal=%b", $time, sig); → Sementara $display mungkin menampilkan nilai interim, $strobe menampilkan nilai yang sudah stabil.

$monitor: Output Pelacakan Otomatis

  • Karakteristik Secara otomatis menampilkan ketika sinyal yang dipantau berubah.
  • Kasus Penggunaan Praktis ketika Anda ingin memantau sekumpulan sinyal secara terus‑menerus.
  • Contoh $monitor("At %0t: a=%b, b=%b", $time, a, b); → Mencatat ketika a atau b berubah.

Tabel Ringkasan

TugasNewlineTiming OutputKasus Penggunaan Utama
$displayYaSaat dipanggilOutput log dasar
$writeTidakSaat dipanggilFormat berdampingan
$strobeYaSetelah siklus simulasi selesaiMemeriksa nilai yang stabil
$monitorYaOtomatis saat sinyal berubahPemantauan kontinu

Tips untuk Penggunaan Efektif

  • Gunakan $display secara default : Mudah dibaca dan cocok untuk pemula.
  • Gunakan $write ketika Anda menginginkan output gabungan satu baris .
  • Gunakan $strobe ketika Anda memerlukan nilai yang sudah stabil setelah perubahan .
  • Gunakan $monitor ketika Anda memerlukan pemantauan sinyal secara terus‑menerus .

4. Spesifikator Format dan Teknik Display Lanjutan

Dengan tugas seperti $display atau $write, Anda dapat menyertakan “spesifikator format” dalam string untuk menampilkan sinyal atau variabel dalam format yang diinginkan. Karena mirip dengan printf di C, penggunaan yang tepat berdasarkan tujuan Anda secara signifikan meningkatkan efisiensi debugging.

Spesifikator Format Dasar

SpesifikatorDeskripsiContoh Output
%bbiner1010
%ddesimal10
%hheksadesimalA
%ooktal12
%ckarakter ASCIIA
%sstringHello
%twaktu simulasi#100 dll.
%mnama hierarki modultop.u1.u2

Contoh Praktis

  1. Tampilkan sinyal dalam beberapa format reg [7:0] data = 8'b10101010; $display("data = %b (bin), %d (dec), %h (hex)", data, data, data); → Contoh output: data = 10101010 (bin), 170 (dec), AA (hex)
  2. Periksa hierarki modul $display("Current module hierarchy is %m"); → Contoh output: Current module hierarchy is top.u1.counter
  3. Tampilkan waktu simulasi $display("Time=%0t: clk=%b", $time, clk); → Contoh output: Time=100: clk=1

Teknik Display Lanjutan

  • Zero‑padding & lebar bidang Anda dapat menentukan zero‑padding atau lebar bidang seperti %0d. Contoh: $display("Count=%04d", count); → Output: Count=0012
  • Perbedaan signed vs unsigned %d memperlakukan nilai sebagai signed, %u memperlakukan nilai sebagai unsigned. Jika nilai negatif tidak ditampilkan seperti yang diharapkan, perbaiki spesifikatornya.
  • Pemformatan pesan multi‑baris Gunakan \n untuk memecah baris demi keterbacaan. Contoh: $display("Start of test\nSignal A=%b\nSignal B=%b", A, B);

Precautions

  • Perhatikan lebar bit : Sinyal Verilog dapat memiliki lebar yang berbeda; penggunaan %d dapat menyebabkan pemotongan atau masalah sign‑extension.
  • Menangani nilai tak terdefinisi (X, Z) : Jika Anda menyertakan bit yang tak terdefinisi, penggunaan %b akan menampilkan x atau z secara langsung.

5. Contoh Praktis: Menggunakan $display di Test Bench dan Modul

Di bagian ini kami akan memperkenalkan penggunaan efektif $display melalui contoh kode Verilog nyata, mencakup dasar‑dasar test bench hingga logging debug bersyarat.

Contoh Dasar: Output di Test Bench

Dengan menyisipkan $display ke dalam test bench, Anda dapat mengamati perilaku selama simulasi.

module tb_counter;
  reg clk;
  reg reset;
  wire [3:0] count;

  // DUT (Device Under Test)
  counter uut (
    .clk(clk),
    .reset(reset),
    .count(count)
  );

  // Clock generation
  initial begin
    clk = 0;
    forever #5 clk = ~clk;  // invert every 5 units
  end

  // Test scenario
  initial begin
    reset = 1;
    #10 reset = 0;

    #50 $finish;
  end

  // Display state
  always @(posedge clk) begin
    $display("Time=%0t | reset=%b | count=%d", $time, reset, count);
  end
endmodule

Pada contoh ini, setiap tepi naik clock memicu output reset dan count. Karena Anda dapat memeriksa log teks serta gelombang, pelacakan perilaku menjadi lebih mudah.

Contoh Display Bersyarat

Dengan menggabungkan pernyataan if Anda dapat mencatat hanya ketika kondisi tertentu terpenuhi.

always @(posedge clk) begin
  if (count == 4'd10) begin
    $display("Count has reached 10 (Time=%0t)", $time);
  end
end

→ Ini memungkinkan Anda menghindari log berlebih sambil menyoroti peristiwa yang penting.

Contoh Pesan Debug

Saat melakukan debugging desain, efektif untuk menangkap ketika sebuah sinyal masuk ke “status tak terduga”.

always @(posedge clk) begin
  if (count > 4'd12) begin
    $display("WARNING: count overflow detected! Time=%0t, value=%d", $time, count);
  end
end

→ Anda dapat dengan cepat menemukan kesalahan desain atau perilaku simulasi yang tidak diharapkan.

Memantau Banyak Sinyal Secara Bersamaan

Ketika menampilkan banyak sinyal, mengumpulkannya dalam satu baris menggunakan $display membuat log lebih mudah dibaca.

$display("Time=%0t | clk=%b | reset=%b | A=%h | B=%h | SUM=%h",
         $time, clk, reset, A, B, SUM);

Ringkasan Tips Praktis

  • Letakkan $display di test bench untuk memvisualisasikan kemajuan
  • Gunakan cabang bersyarat untuk menyaring log
  • Buat pesan peringatan untuk mendeteksi anomali
  • Konsolidasikan beberapa sinyal dalam satu baris untuk meningkatkan keterbacaan

6. Aplikasi Display‑Control (Pixel/Teks/Gambar)

Sampai saat ini, kami telah memperkenalkan $display untuk log simulasi. Sementara itu, Verilog juga banyak digunakan untuk “display control” pada implementasi perangkat keras (LCD, VGA, output HDMI). Pada bagian ini, kami secara singkat memperkenalkan cara mengimplementasikan tampilan layar pada level perangkat keras.

Konsep Dasar Display Control

Untuk menampilkan teks atau gambar di layar, Anda harus menghasilkan sinyal video, bukan sekadar menggunakan $display. Sinyal kontrol tipikal meliputi:

  • HSYNC (Horizontal Sync) : Sinyal yang menandakan akhir setiap baris
  • VSYNC (Vertical Sync) : Sinyal yang menandakan akhir setiap frame
  • RGB Data : Sinyal yang mewakili warna tiap piksel (misalnya, 8‑bit × 3 = 24‑bit warna)

Di Verilog, Anda mengendalikan sinyal‑sinyal ini melalui penghitung dan mesin status serta mengeluarkannya berdasarkan timing untuk mewujudkan “tampilan layar”.

Contoh 1: Menampilkan Color Bars

Contoh paling dasar adalah menampilkan bar warna secara horizontal pada sebuah tampilan.

always @(posedge clk) begin
  if (h_counter < 100)       rgb <= 24'hFF0000; // red
  else if (h_counter < 200)  rgb <= 24'h00FF00; // green
  else if (h_counter < 300)  rgb <= 24'h0000FF; // blue
  else                       rgb <= 24'h000000; // black
end

→ Ini menghasilkan bar warna merah, hijau, dan biru yang teralign secara horizontal di seluruh layar.

Contoh 2: Tampilan Teks

Untuk tampilan teks, Anda menyiapkan font ROM dan mengubah pola titik setiap karakter menjadi piksel.

// Referencing the pattern of 'A' from the font ROM and displaying
if (font_rom[char_code][y][x] == 1'b1)
    rgb <= 24'hFFFFFF;  // white for display
else
    rgb <= 24'h000000;  // black background

→ Ini menggambar karakter tertentu (misalnya, “A”) pada layar.

Contoh 3: Tampilan Gambar

Untuk menampilkan gambar, Anda membaca data bitmap (ROM atau memori eksternal) yang telah disimpan sebelumnya dan mengubahnya menjadi output piksel.

rgb <= image_rom[addr];  // Retrieve color data from ROM

Dalam sistem tertanam yang menggunakan FPGA, metode ini memungkinkan Anda menampilkan ikon atau logo sederhana.

Perbedaan Dibandingkan Debug $display

  • $display adalah output teks (hanya simulasi)
  • Kontrol tampilan adalah generasi sinyal video (dapat diimplementasikan pada perangkat keras)

Meskipun tujuan mereka berbeda, pelajar Verilog sering kebingungan antara keduanya.

  • “Saya ingin memverifikasi perilaku selama simulasi” → Gunakan $display
  • “Saya ingin menampilkan ke layar sebenarnya pada FPGA” → Rancang logika sinyal video

Perluasan Aplikasi

  • Pada papan FPGA untuk pembelajaran, Verilog sering digunakan untuk tampilan LED 7‑segmen atau layar LCD kecil.
  • Dengan melangkah lebih jauh, Anda dapat membangun sistem yang mendukung output VGA/HDMI untuk pengembangan game atau tampilan GUI.
  • Dengan menggabungkan pengetahuan tentang $display dengan logika kontrol tampilan, Anda dapat menangani “tampilan” baik dalam simulasi maupun perangkat keras sebenarnya.

7. Penggunaan yang Tepat dan Tips Berdasarkan Skenario Aplikasi

Ketika kita membicarakan “tampilan” dalam Verilog, ada dua aspek: tugas $display hanya simulasi, dan kontrol tampilan implementasi perangkat keras. Menggunakan masing‑masing secara tepat menghasilkan pengembangan dan debugging yang efisien.

Penggunaan dalam Simulasi

  1. $display sebagai log debug
    • Keluarkan variabel atau sinyal penting dengan $display untuk memeriksa apakah desain Anda berperilaku seperti yang diharapkan.
    • Memverifikasi “nilai dalam kondisi tertentu” atau “counter mencapai titik” melalui log sangat efisien.
  2. Hindari output berlebihan
    • Mengeluarkan output pada setiap siklus clock membanjiri log dan mengurangi keterbacaan. Persempit kondisi.
    • Contoh: if (state == ERROR) $display("Error occured at %0t", $time);
  3. Membedakan antara tugas
    • $monitor → Untuk sinyal yang ingin Anda pantau secara terus‑menerus
    • $strobe → Ketika Anda perlu mengeluarkan nilai yang sudah stabil
    • $write → Untuk output horizontal yang terformat

Penggunaan dalam Kontrol Tampilan Perangkat Keras

  1. Tampilan 7‑segmen untuk pembelajaran
    • Dalam proyek pemula FPGA, menampilkan nilai counter pada LED 7‑segmen adalah hal standar.
    • Gabungkan dengan output simulasi $display untuk memperdalam pemahaman tentang perbedaan tampilan vs simulasi.
  2. Kontrol monitor LCD atau VGA
    • Gunakan font ROM atau image ROM untuk menampilkan teks atau gambar.
    • Dengan juga menggunakan $display dalam simulasi, Anda dapat memverifikasi dua kali bahwa generasi sinyal video sudah benar.
  3. Overlay debug pada perangkat keras
    • Anda dapat menambahkan overlay “nilai counter”, “koordinat”, “pesan debug” pada output video sebenarnya.
    • Dalam pengembangan FPGA, umum untuk “menjadikan layar itu sendiri sebagai alat debugging”.

Tips Praktis

  • Ikuti alur simulasi → perangkat keras Pertama gunakan $display untuk memverifikasi perilaku dalam simulasi, kemudian pindah ke logika kontrol tampilan untuk implementasi perangkat keras.
  • Gunakan log dan gelombang secara bersamaan Log teks dari $display menunjukkan “waktu terjadinya peristiwa”, sementara gelombang menampilkan “transisi detail”. Menggunakan keduanya meningkatkan presisi debugging.
  • Seragamkan format pesan dalam pengembangan tim Menstandarisasi format pesan $display (prefiks, tampilan waktu, dll.) memudahkan analisis log ketika banyak orang bekerja bersama.

Ringkasan

  • Tugas tipe $display hanya untuk simulasi “alat observasi”
  • Kontrol tampilan berarti implementasi perangkat keras “metode tampilan”
  • Dengan menggunakan masing‑masing secara tepat dan menggabungkannya, Anda dapat memungkinkan pengembangan yang efisien

8. FAQ (Pertanyaan yang Sering Diajukan)

Q1. Apa perbedaan antara $display dan $monitor?

A. $display menghasilkan output satu kali pada saat dipanggil. Sebaliknya, $monitor secara otomatis menghasilkan output setiap kali sinyal yang terdaftar berubah.

  • Untuk debugging satu kali → $display
  • Untuk pemantauan berkelanjutan → $monitor

Q2. Kapan saya harus menggunakan $strobe?

A. $strobe menghasilkan nilai yang sudah stabil pada akhir siklus simulasi. Misalnya, ketika beberapa sinyal berubah secara bersamaan pada tepi clock, $display mungkin menampilkan nilai antara. Dalam kasus seperti itu $strobe berguna untuk menampilkan nilai akhir.

Q3. Apa kegunaan spesifikator format %m?

A. %m menghasilkan nama hierarki modul saat ini. Pada desain besar, mencatat “hierarki mana pesan berasal” membuat analisis jauh lebih mudah.

$display("Current module: %m");

Contoh output:

Current module: top.u1.counter

Q4. Log saya menjadi sangat besar karena saya menggunakan banyak $display. Apa yang harus saya lakukan?

A. Langkah‑langkah berikut efektif:

  • Gunakan pernyataan if untuk menyaring output
  • Hanya output deteksi error atau peristiwa tertentu
  • Gunakan $monitor untuk memantau hanya sinyal minimum yang diperlukan
  • Output ke file log dan terapkan alat penyaringan selama analisis

Q5. Bisakah $display digunakan untuk sintesis (FPGA/ASIC)?

A. Tidak. $display adalah tugas hanya untuk simulasi. Alat sintesis mengabaikannya sehingga tidak muncul di perangkat keras sebenarnya. Jika Anda ingin menampilkan output pada perangkat keras nyata, Anda harus merancang dengan “LED 7‑segmen”, “LCD”, “logika kontrol VGA”, dll., dalam Verilog.

Q6. Bagaimana cara menampilkan teks atau gambar pada perangkat keras sebenarnya?

A. Tidak melalui $display, melainkan dengan menghasilkan sinyal video.

  • Tampilan 7‑segmen → Untuk tampilan numerik atau karakter sederhana
  • VGA/LCD → Menghasilkan sinyal HSYNC, VSYNC, RGB dan mengontrolnya
  • Teks → Gunakan ROM font dan keluarkan pola titik
  • Gambar → Simpan bitmap di ROM atau memori eksternal dan keluarkan piksel sesuai

9. Kesimpulan & Langkah Selanjutnya

Ringkasan Artikel Ini

Dalam artikel ini kami membahas “display” dalam Verilog dari dasar hingga aplikasi. Poin-poin utama meliputi:

  1. Dasar-dasar $display

    • Tugas simulasi yang menampilkan sinyal atau variabel, dapat digunakan serupa dengan printf di C.
  2. Perbedaan dengan tugas terkait

    • $write → Menampilkan tanpa baris baru
    • $strobe → Menghasilkan nilai stabil pada akhir siklus simulasi
    • $monitor → Secara otomatis memantau perubahan sinyal
  3. Menggunakan spesifikator format

    • Dengan menggunakan %b, %d, %h, %m, %t, Anda dapat menghasilkan log yang lebih jelas dan praktis.
  4. Contoh praktis

    • Sisipkan $display ke dalam test bench untuk memantau kemajuan.
    • Gunakan pesan bersyarat untuk memungkinkan debugging yang efisien.
  5. Aplikasi dalam kontrol tampilan

    • $display hanya untuk simulasi; implementasi perangkat keras menggunakan HSYNC, VSYNC, RGB untuk menampilkan teks/gambar.
    • Dari mempelajari tampilan 7‑segmen hingga kontrol VGA/HDMI lanjutan, ekspansi memungkinkan.
  • Maju ke SystemVerilog → Dalam bahasa penerus SystemVerilog Anda dapat menggunakan fitur debug yang lebih canggih (assertion, $display yang ditingkatkan, dll.).
  • Menggabungkan dengan penampil gelombang → Dengan menggabungkan log $display dan data gelombang, Anda dapat menganalisis nilai numerik serta transisi, meningkatkan presisi debugging.
  • Pelajari output tampilan perangkat keras → Pada proyek papan FPGA kecil, coba keluarkan pada 7‑segment atau LCD untuk merasakan perbedaan antara “tampilan simulasi” dan “kontrol tampilan perangkat keras”.
  • Terapkan dalam pengembangan tim → Dengan menstandarisasi format pesan $display, Anda meningkatkan efisiensi analisis log dalam pengembangan tim multi‑orang.

Penutup

$display lebih dari sekadar “output teks”. Ini adalah alat yang kuat untuk debugging simulasi. Dan ketika Anda memasuki dunia kontrol tampilan, Anda dapat merasakan kegembiraan menampilkan grafik pada monitor nyata melalui FPGA.
Saya harap artikel ini membantu pembelajar Verilog memahami baik “debugging simulasi” maupun “output tampilan perangkat keras” dengan jelas.