Menguasai $display dalam Verilog: Teknik Debugging Efektif dan Kawalan Paparan

目次

1. Pengenalan: Kepentingan dan Tujuan “display” dalam Verilog

Apa Maksud “display” dalam Verilog?

Dalam Verilog, $display ialah tugas sistem yang digunakan sebagai alat untuk “memaparkan” keadaan dalaman sesuatu reka bentuk semasa simulasi. Seperti printf dalam C, ia membolehkan anda mengeluarkan isyarat, nilai pembolehubah, dan rentetan ke terminal atau konsol—memainkan peranan utama dalam penyahpepijatan dan pengesahan fungsi.

Mengapa $display Penting untuk Pembangunan Verilog?

  • Kecekapan penyahpepijatan yang dipertingkatkan : Dalam reka bentuk litar yang kompleks, memvisualisasikan sama ada isyarat dalaman berfungsi dengan betul adalah kritikal. Dengan menggunakan $display, anda boleh serta-merta memeriksa nilai isyarat yang diminati semasa simulasi.
  • Visualisasi simulasi : Apabila menjejaki peralihan nilai pada titik masa tertentu, bentuk gelombang sahaja mungkin tidak mencukupi. Log paparan menyediakan cara yang boleh dipercayai untuk menandakan detik‑detik tepat tersebut.
  • Berguna untuk dokumentasi juga : Apabila menyampaikan niat reka bentuk atau peraturan operasi kepada jurutera lain, menyisipkan log paparan yang beranotasi dapat meningkatkan pemahaman kod.

Tujuan dan Struktur Artikel Ini

Dalam artikel ini, kami akan menerangkan secara berperingkat perkara‑perkara berikut:

  1. Sintaks asas dan penggunaan : Pengenalan teliti kepada sintaks dan penggunaan asas $display.
  2. Perbandingan dengan tugas sistem lain : Kami akan menyusun perbezaan antara tugas berkaitan paparan seperti $write, $strobe, dan $monitor.
  3. Penentu format dan teknik penggunaan lanjutan : Penggunaan penentu format seperti %d, %b, %h, %s, serta teknik paparan khas akan diperkenalkan.
  4. Contoh penggunaan praktikal : Kami akan menunjukkan contoh konkrit dalam test bench dan kod, memberikan pengetahuan yang boleh diaplikasikan serta‑merta.
  5. Aplikasi kawalan paparan : Kes penggunaan contoh akan merangkumi output perkakasan seperti LCD atau kawalan monitor serta paparan teks/gambar.

Dengan struktur ini, pengguna baru dan pertengahan dapat memahami $display dalam Verilog dengan betul dan mengaplikasikannya dalam amalan. Dalam setiap bahagian yang berikut, kami akan meneruskan dengan jelas menggunakan contoh dan diagram bila boleh.

2. Asas $display: Sintaks, Kes Penggunaan, dan Langkah Berhati‑hati

Sintaks Asas $display

Apabila menggunakan $display dalam Verilog, sintaks asasnya ialah seperti berikut.

$display("string or format specifiers", signal1, signal2, ...);
  • Bahagian rentetan : Tulis apa‑apa teks atau penentu format (contohnya: %d, %b, %h).
  • Argumen : Senaraikan nama isyarat atau pembolehubah yang hendak dikeluarkan mengikut format yang bersesuaian.

Contoh: Memaparkan kiraan jam dan nilai isyarat

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

Dalam contoh ini, masa simulasi serta nilai isyarat jam/reset dikeluarkan.

Kes Penggunaan $display

  1. Mengekalkan kemajuan simulasi Dengan menyisipkan $display pada titik‑titik tertentu dalam reka bentuk anda, anda dapat mengesahkan bahagian kod mana yang telah dicapai.
  2. Pengesahan nilai isyarat Walaupun penonton bentuk gelombang menyukarkan pemahaman intuitif cabang bersyarat atau peralihan keadaan, mengeluarkan teks memudahkan pemahaman.
  3. Paparan mesej bersyarat Dengan menggabungkan bersama pernyataan if, anda boleh mencatat mesej hanya apabila syarat tertentu dipenuhi. if (reset) $display("Reset asserted at %0t", $time);

Perbezaan Antara $display dan $write

$display secara automatik menambah baris baru pada akhir output. Sebaliknya, $write meneruskan output tanpa menambah baris baru.
Contoh:

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

Output:

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

Output:

HelloWorld

Jika anda memerlukan log baris demi baris yang lebih jelas, gunakan $display. Apabila anda ingin memformat output pada satu baris, gunakan $write.

Lang Berhati‑hati

  1. Elakkan output berlebihan Jika anda menggunakan $display setiap kitaran jam, log menjadi besar dan kebolehbacaan menurun. → Gunakan penapisan untuk mengurangkan output.
  2. Gunakan paparan masa Memaparkan $time atau $realtime membolehkan anda menangkap masa operasi dengan tepat.
  3. Tugas hanya untuk simulasi $display tidak boleh digunakan untuk sintesis (pelaksanaan FPGA/ASIC). Ia merupakan alat debug yang hanya untuk simulasi.

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

Verilog menawarkan tugas sistem selain $display untuk output. Kegunaan dan masa pelaksanaannya berbeza, jadi penting untuk memahami cara menggunakannya secara berasingan.

$display: Tugas Paparan Standard

  • Ciri-ciri Secara automatik menambah baris baru dan mencatat satu baris bagi setiap panggilan.
  • Kegunaan Paling kerap digunakan sebagai kaedah debug asas; anda boleh memanggilnya pada bila-bila masa untuk output sekali.

$write: Paparan Tanpa Baris Baru

  • Ciri-ciri Tidak menambah baris baru dan oleh itu output diteruskan pada baris yang sama.
  • Kegunaan Berguna apabila anda mahu memaparkan beberapa nilai secara bersebelahan.
  • Contoh $write("A=%d, ", a); $write("B=%dn", b); → Output: A=5, B=10.

$strobe: Output pada Akhir Kitaran Simulasi

  • Ciri-ciri Mencetak nilai selepas semua penilaian simulasi dalam langkah semasa selesai.
  • Kegunaan Berguna untuk mengelakkan keadaan perlumbaan (apabila banyak isyarat berubah serentak).
  • Contoh $strobe("Time=%0t, signal=%b", $time, sig); → Manakala $display mungkin menunjukkan nilai antara, $strobe menunjukkan nilai yang telah stabil.

$monitor: Output Penjejakan Automatik

  • Ciri-ciri Secara automatik output apabila mana-mana isyarat yang dipantau berubah.
  • Kegunaan Mudah apabila anda mahu memantau sekumpulan isyarat secara berterusan.
  • Contoh $monitor("At %0t: a=%b, b=%b", $time, a, b); → Log apabila a atau b berubah.

Jadual Ringkasan

TugasBaris BaruMasa OutputKegunaan Utama
$displayYaBila dipanggilOutput log asas
$writeTidakBila dipanggilPemformatan baris tunggal
$strobeYaSelepas kitaran simulasi berakhirSemak nilai yang stabil
$monitorYaAutomatik bila isyarat berubahPemantauan berterusan

Tips untuk Penggunaan Efektif

  • Gunakan $display secara lalai : Mudah dibaca dan sesuai untuk pemula.
  • Gunakan $write apabila anda mahu output gabungan satu baris.
  • Gunakan $strobe apabila anda perlukan nilai yang stabil selepas perubahan.
  • Gunakan $monitor apabila anda perlukan pemantauan isyarat secara berterusan.

4. Penentu Format dan Teknik Paparan Lanjutan

Dengan tugas seperti $display atau $write, anda boleh menyertakan “penentu format” dalam rentetan untuk memaparkan isyarat atau pembolehubah dalam format yang dikehendaki. Oleh kerana ia menyerupai printf dalam C, penggunaan yang betul mengikut tujuan anda dapat meningkatkan kecekapan debugging secara signifikan.

Penentu Format Asas

PenentuKeteranganContoh Output
%bbinari1010
%dperpuluhan10
%hheksadesimalA
%ooktal12
%caksara ASCIIA
%srentetanHello
%tmasa simulasi#100 dll.
%mnama hierarki modultop.u1.u2

Contoh Praktikal

  1. Paparkan isyarat dalam pelbagai 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. Semak hierarki modul
    $display("Current module hierarchy is %m"); → Contoh output: Current module hierarchy is top.u1.counter
  3. Paparkan masa simulasi
    $display("Time=%0t: clk=%b", $time, clk); → Contoh output: Time=100: clk=1

Teknik Paparan Lanjutan

  • Penjajaran sifar & lebar medan Anda boleh menentukan penjajaran sifar atau lebar medan seperti %0d. Contoh: $display("Count=%04d", count); → Output: Count=0012
  • Perbezaan bertanda vs tidak bertanda %d mengendalikan nilai sebagai bertanda, %u mengendalikan nilai sebagai tidak bertanda. Jika nilai negatif tidak dipaparkan seperti yang dijangka, semak semula penentu format.
  • Pemformatan mesej berbilang baris Gunakan n untuk memecah baris bagi meningkatkan kebolehbacaan. Contoh: $display("Start of testnSignal A=%bnSignal B=%b", A, B);

Langkah Berhati-hati

  • Perhatikan lebar bit : Isyarat Verilog mungkin mempunyai lebar yang berbeza; penggunaan %d boleh menyebabkan pemotongan atau isu peluasan tanda.
  • Mengendalikan nilai tidak ditakrifkan (X, Z) : Jika anda memasukkan bit yang tidak ditakrifkan, penggunaan %b akan memaparkan x atau z secara langsung.

5. Contoh Praktikal: Menggunakan $display dalam Test Bench dan Modul

Dari sini kami akan memperkenalkan penggunaan berkesan $display melalui contoh kod Verilog sebenar, meliputi asas test bench hingga log debug bersyarat.

Contoh Asas: Output dalam Test Bench

Dengan menyisipkan $display ke dalam test bench, anda dapat memerhati tingkah laku semasa 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

Dalam contoh ini, setiap naik tepi jam memicu output reset dan count. Oleh kerana anda boleh memeriksa log teks serta gelombang, penjejakan tingkah laku menjadi lebih mudah.

Contoh Paparan Bersyarat

Dengan menggabungkan pernyataan if anda boleh log hanya apabila syarat tertentu dipenuhi.

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

→ Ini membolehkan anda mengelakkan log berlebihan sambil menumpukan pada peristiwa yang penting.

Contoh Mesej Debug

Semasa debugging reka bentuk, adalah berkesan untuk mengesan bila isyarat memasuki “keadaan tidak dijangka”.

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 menemui kecacatan reka bentuk atau tingkah laku simulasi yang tidak dijangka.

Memantau Pelbagai Isyarat Secara Serentak

Apabila memaparkan banyak isyarat, mengumpulkannya ke dalam satu baris menggunakan $display menjadikan log lebih mudah dibaca.

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

Ringkasan Petua Praktikal

  • Letakkan $display dalam test bench untuk memvisualisasikan kemajuan
  • Gunakan cabang bersyarat untuk memperhalus log
  • Jana mesej amaran untuk mengesan anomali
  • Gabungkan pelbagai isyarat dalam satu baris untuk meningkatkan kebolehbacaan

6. Aplikasi Kawalan Paparan (Paparan Piksel/Teks/Imej)

Sehingga kini, kami telah memperkenalkan $display untuk log simulasi. Pada masa yang sama, Verilog juga banyak digunakan untuk “kawalan paparan” dalam pelaksanaan perkakasan (LCD, VGA, output HDMI). Dalam bahagian ini, kami akan memperkenalkan secara ringkas cara melaksanakan paparan skrin pada tahap perkakasan.

Konsep Asas Kawalan Paparan

Untuk memaparkan teks atau imej pada skrin, anda mesti menjana isyarat video dan bukannya sekadar menggunakan $display. Isyarat kawalan tipikal termasuk:

  • HSYNC (Horizontal Sync) : Isyarat yang menandakan akhir setiap baris
  • VSYNC (Vertical Sync) : Isyarat yang menandakan akhir setiap bingkai
  • Data RGB : Isyarat yang mewakili warna setiap piksel (contoh, 8bit × 3 = 24bit warna)

Dalam Verilog, anda mengawal isyarat‑isyarat ini melalui kaunter dan mesin keadaan serta mengeluarkannya berdasarkan masa untuk merealisasikan “paparan skrin”.

Contoh 1: Memaparkan Bar Warna

Contoh paling asas ialah memaparkan jalur warna secara mendatar pada paparan.

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 jalur warna merah, hijau, dan biru yang diselaraskan merentasi skrin secara mendatar.

Contoh 2: Paparan Teks

Untuk paparan teks, anda menyediakan ROM fon dan menukar corak titik setiap aksara 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 melukis aksara tertentu (contoh, “A”) pada skrin.

Contoh 3: Paparan Imej

Untuk memaparkan imej, anda membaca data bitmap yang disimpan terlebih dahulu (ROM atau memori luaran) dan menukarnya menjadi output piksel.

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

Dalam sistem terbenam yang menggunakan FPGA, kaedah ini membolehkan anda memaparkan ikon atau logo ringkas.

Perbezaan Berbanding Debug $display

  • $display ialah output teks (hanya simulasi)
  • Kawalan paparan ialah penjanaan isyarat video (boleh dilaksanakan pada perkakasan)

Walaupun tujuan mereka berbeza, pelajar Verilog sering keliru antara keduanya.

  • “Saya mahu mengesahkan kelakuan semasa simulasi” → Gunakan $display
  • “Saya mahu output ke skrin sebenar pada FPGA” → Reka logik isyarat video

Pengembangan Aplikasi

  • Dalam pembelajaran papan FPGA, Verilog kerap digunakan untuk paparan LED 7-segmen atau paparan LCD kecil.
  • Dengan kemajuan selanjutnya, anda boleh membina sistem yang menyokong output VGA/HDMI untuk pembangunan permainan atau paparan GUI.
  • Dengan menggabungkan pengetahuan tentang $display dengan logik kawalan paparan, anda boleh mengendalikan “paparan” dalam simulasi dan perkakasan sebenar.

7. Penggunaan yang Sesuai dan Petua Berdasarkan Senario Aplikasi

Apabila kita menyebut “paparan” dalam Verilog, terdapat dua aspek: tugas $display yang hanya untuk simulasi, dan kawalan paparan pelaksanaan perkakasan. Menggunakan masing‑masing dengan betul menghasilkan pembangunan dan penyahpepijatan yang cekap.

Penggunaan dalam Simulasi

  1. $display sebagai log penyahpepijatan
    • Outputkan pembolehubah atau isyarat kritikal dengan $display untuk memeriksa sama ada reka bentuk anda berkelakuan seperti yang dijangka.
    • Mengesahkan “nilai di bawah syarat tertentu” atau “kaunter mencapai titik” melalui log adalah berkesan.
  2. Elakkan output berlebihan
    • Mengoutput pada setiap kitaran jam akan membanjiri log dan mengurangkan kebolehbacaan. Persempit syaratnya.
    • Contoh: if (state == ERROR) $display("Ralat berlaku pada %0t", $time);
  3. Bezakan antara tugas
    • $monitor → Untuk isyarat yang anda ingin pantau secara berterusan
    • $strobe → Apabila anda perlu mengoutput nilai yang telah stabil
    • $write → Untuk output mendatar berformat

Penggunaan dalam Kawalan Paparan Perkakasan

  1. Paparan 7-segmen untuk pembelajaran
    • Dalam projek pemula FPGA, memaparkan nilai kaunter pada LED 7-segmen adalah standard.
    • Gabungkan dengan output simulasi $display untuk memperdalam pemahaman tentang perbezaan paparan vs simulasi.
  2. Kawalan monitor LCD atau VGA
    • Gunakan ROM fon atau ROM imej untuk memaparkan teks atau imej.
    • Dengan juga menggunakan $display dalam simulasi, anda boleh mengesahkan dua kali bahawa penjanaan isyarat video adalah betul.
  3. Lapisan penyahpepijatan dalam perkakasan
    • Anda boleh menindih “nilai kaunter”, “koordinat”, “mesej penyahpepijatan” pada output video sebenar.
    • Dalam pembangunan FPGA, adalah biasa untuk “menjadikan skrin itu sendiri sebagai alat penyahpepijatan”.

Petua Praktikal

  • Ikuti aliran simulasi → perkakasan Pertama gunakan $display untuk mengesahkan kelakuan dalam simulasi, kemudian beralih ke logik kawalan paparan untuk pelaksanaan perkakasan.
  • Gunakan log dan gelombang secara serentak Log teks dari $display menunjukkan “masa berlakunya peristiwa”, manakala gelombang menunjukkan “peralihan terperinci”. Menggunakan kedua-duanya meningkatkan ketepatan penyahpepijatan.
  • Seragamkan format mesej dalam pembangunan pasukan Menstandardkan format mesej $display (awalan, paparan masa, dll.) memudahkan analisis log apabila ramai orang bekerja bersama.

Ringkasan

  • Tugas jenis $display adalah “alat pemerhatian” yang hanya untuk simulasi
  • Kawalan paparan bermaksud pelaksanaan perkakasan “kaedah paparan”
  • Dengan menggunakan masing-masing dengan betul dan menggabungkannya anda dapat membolehkan pembangunan yang cekap

8. Soalan Lazim (FAQ)

Q1. Apa perbezaan antara $display dan $monitor?

A. $display mengeluarkan output sekali pada saat ia dipanggil. Sebaliknya, $monitor secara automatik mengeluarkan output setiap kali isyarat yang dipantau berubah.

  • Untuk penyahpepijatan sekali sahaja → $display
  • Untuk pemantauan berterusan → $monitor

Q2. Bila saya harus menggunakan $strobe?

A. $strobe mengeluarkan nilai yang telah stabil pada akhir kitaran simulasi. Contohnya, apabila pelbagai isyarat berubah serentak pada tepi jam, $display mungkin menunjukkan nilai antara. Dalam kes tersebut $strobe memudahkan untuk menunjukkan nilai akhir.

Q3. Apa kegunaan penentu format %m?

A. %m mengeluarkan nama hierarki modul semasa. Dalam reka bentuk yang besar, log “hierarki mana mesej itu datang” memudahkan analisis dengan ketara.

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

Contoh output:

Current module: top.u1.counter

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

A. Langkah-langkah berikut berkesan:

  • Gunakan pernyataan if untuk menapis output
  • Hanya keluarkan pengesanan ralat atau peristiwa tertentu
  • Gunakan $monitor untuk memantau hanya isyarat minimum yang diperlukan
  • Keluarkan ke fail log dan gunakan alat penapisan semasa analisis

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

A. Tidak. $display adalah tugas yang hanya untuk simulasi. Alat sintesis mengabaikannya jadi tidak muncul dalam perkakasan sebenar. Jika anda ingin memaparkan output pada perkakasan sebenar, anda mesti mereka bentuk dengan “LED 7‑segmen”, “LCD”, “logik kawalan VGA”, dll., dalam Verilog.

Q6. Bagaimana saya memaparkan teks atau imej pada perkakasan sebenar?

A. Bukan melalui $display, tetapi dengan menjana isyarat video.

  • Paparan 7‑segmen → Untuk paparan nombor atau aksara ringkas
  • VGA/LCD → Menjana isyarat HSYNC, VSYNC, RGB dan mengawalnya
  • Teks → Menggunakan ROM fon dan mengeluarkan corak titik
  • Imej → Menyimpan bitmap dalam ROM atau memori luaran dan mengeluarkan piksel mengikut keperluan

9. Kesimpulan & Langkah Seterusnya

Ringkasan Artikel Ini

Dalam artikel ini kami membincangkan “display” dalam Verilog dari asas hingga aplikasi. Titik utama termasuk:

  1. Asas $display
    * Tugas simulasi yang memaparkan isyarat atau pembolehubah, boleh digunakan serupa dengan printf dalam C.
  2. Perbezaan dengan tugas berkaitan
    * $write → Papar tanpa baris baru
    * $strobe → Keluarkan nilai yang telah stabil pada akhir kitaran simulasi
    * $monitor → Memantau perubahan isyarat secara automatik
  3. Menggunakan penentu format
    * Dengan menggunakan %b, %d, %h, %m, %t, anda dapat mengeluarkan log yang lebih jelas dan praktikal.
  4. Contoh praktikal
    * Sisipkan $display ke dalam test bench untuk memantau kemajuan.
    * Gunakan mesej bersyarat untuk membolehkan penyahpepijatan yang cekap.
  5. Aplikasi dalam kawalan paparan
    * $display hanya untuk simulasi; pelaksanaan perkakasan menggunakan HSYNC, VSYNC, RGB untuk memaparkan teks/imej.
    * Dari mempelajari paparan 7‑segmen hingga kawalan VGA/HDMI lanjutan, pelbagai pengembangan boleh dilakukan.

Langkah Seterusnya

  • Maju ke SystemVerilog → Dalam bahasa penerus SystemVerilog, anda boleh menggunakan ciri debug yang lebih maju (penegasan, $display yang dipertingkatkan, dll.).
  • Gabungkan dengan penonton gelombang → Dengan menggabungkan log $display dan data gelombang, anda dapat menganalisis kedua-dua nilai numerik dan peralihan, meningkatkan ketepatan debugging.
  • Pelajari output paparan perkakasan → Dalam projek papan FPGA kecil, cuba output pada 7‑segmen atau LCD untuk merasai perbezaan antara “paparan simulasi” dan “kawalan paparan perkakasan”.
  • Gunakan dalam pembangunan berpasukan → Dengan menstandardkan format mesej $display, anda meningkatkan kecekapan analisis log dalam pembangunan berbilang orang.

Kesimpulan

$display lebih daripada sekadar “output teks”. Ia merupakan alat yang kuat untuk debugging simulasi. Dan apabila anda melangkah ke dunia kawalan paparan, anda dapat merasai kegembiraan memaparkan grafik pada monitor sebenar melalui FPGA.
Saya harap artikel ini membantu pelajar Verilog memahami dengan jelas kedua-dua “debugging simulasi” dan “output paparan perkakasan”.