เชี่ยวชาญ $display ใน Verilog: เทคนิคการดีบักและควบคุมการแสดงผลอย่างมีประสิทธิภาพ

目次

1. บทนำ: ความสำคัญและวัตถุประสงค์ของ “display” ใน Verilog

“display” หมายถึงอะไรใน Verilog?

ใน Verilog, $display เป็น system task ที่ใช้เป็นเครื่องมือเพื่อ “แสดง” สถานะภายในของการออกแบบระหว่างการจำลอง คล้ายกับ printf ของ C, มันทำให้คุณสามารถส่งสัญญาณ, ค่าตัวแปร, และสตริงไปยังเทอร์มินัลหรือคอนโซล—มีบทบาทสำคัญในการดีบักและการตรวจสอบการทำงานของฟังก์ชัน

ทำไม $display ถึงเป็นสิ่งจำเป็นสำหรับการพัฒนา Verilog?

  • ประสิทธิภาพการดีบัก : ในการออกแบบวงจรที่ซับซ้อน การมองเห็นว่าสัญญาณภายในทำงานถูกต้องหรือไม่เป็นสิ่งสำคัญ โดยใช้ `$display คุณสามารถตรวจสอบค่าของสัญญาณที่สนใจได้ทันทีระหว่างการจำลอง
  • การแสดงผลการจำลอง : เมื่อทำการติดตามการเปลี่ยนแปลงค่าในช่วงเวลาที่กำหนด, รูปคลื่นอาจไม่เพียงพอ บันทึกการแสดงผลให้วิธีที่เชื่อถือได้ในการบ่งบอกช่วงเวลาที่แม่นยำเหล่านั้น
  • เป็นประโยชน์ต่อการจัดทำเอกสาร : เมื่อสื่อสารเจตนาการออกแบบหรือกฎการทำงานให้วิศวกรคนอื่น, การใส่บันทึกการแสดงผลที่มีคำอธิบายสามารถเพิ่มความเข้าใจในโค้ดได้

วัตถุประสงค์และโครงสร้างของบทความนี้

ในบทความนี้ เราจะอธิบายอย่างเป็นระบบดังต่อไปนี้:

  1. ไวยรณ์พื้นฐานและการใช้งาน : การแนะนำอย่างละเอียดเกี่ยวกับไวยากรณ์และการใช้ $display ขั้นพื้นฐาน
  2. การเปรียบเทียบกับ system task อื่น : เราจะจัดระเบียบความแตกต่างระหว่าง task ที่เกี่ยวกับการแสดงผลเช่น $write, $strobe, และ $monitor
  3. ตัวกำหนดรูปแบบและเทคนิคการใช้ขั้นสูง : การใช้ตัวกำหนดรูปแบบเช่น %d, %b, %h, %s และเทคนิคการแสดงผลพิเศษจะถูกนำเสนอ
  4. ตัวอย่างการใช้งานจริง : เราจะแสดงการใช้งานใน test bench และโค้ดพร้อมตัวอย่างที่สามารถนำไปใช้ได้ทันที
  5. การประยุกต์ควบคุมการแสดงผล : ตัวอย่างการใช้งานจะรวมถึงการส่งออกฮาร์ดแวร์เช่น LCD หรือการควบคุมมอนิเตอร์และการแสดงผลข้อความ/รูปภาพ

ด้วยโครงสร้างนี้ ผู้เริ่มต้นและผู้ใช้ระดับกลางจะสามารถเข้าใจ $display ใน Verilog ได้อย่างถูกต้องและนำไปใช้ในทางปฏิบัติได้ ในแต่ละส่วนต่อไป เราจะดำเนินการอย่างชัดเจนโดยใช้ตัวอย่างและภาพประกอบเมื่อเป็นไปได้

2. พื้นฐานของ $display: ไวยากรณ์, กรณีการใช้, และข้อควรระวัง

ไวยากรณ์พื้นฐานของ $display

เมื่อใช้ $display ใน Verilog ไวยากรณ์พื้นฐานเป็นดังนี้

$display("string or format specifiers", signal1, signal2, ...);
  • ส่วนข้อความ : เขียนข้อความใ หรือตัวกำหนดรูปแบบ (เช่น: %d, %b, %h)
  • อาร์กิวเมนต์ : ระบุชื่อสัญญาณหรือ ตัวแปรที่ต้องการแสดงผลตามรูปแบบที่กำหนด

ตัวอย่าง: การแสดงจำนวนรอบของสัญญาณนาฬิกาและค่าของสัญญาณ

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

ในตัวอย่างนี้ เวลาในการจำลองและค่าของสัญญาณ clock/reset จะถูกแสดงออกมา

กรณีการใช้ $display

  1. ติดตามความคืบหน้าของการจำลอง การใส่ $display ที่จุดเฉพาะในโค้ดช่วยให้คุณตรวจสอบว่าตรงส่วนใดของโค้ดที่กำลังทำงานอยู่
  2. ตรวจสอบค่าของสัญญาณ แม้ว่าเครื่องมือดูรูปคลื่นอาจทำให้เข้าใจสาขาเงื่อนไขหรือการเปลี่ยนสถานะได้ยาก การแสดงผลเป็นข้อความทำให้การเข้าใจง่ายขึ้น
  3. ข้อความตามเงื่อนไข การผสานกับคำสั่ง if ทำให้คุณบันทึกข้อความได้เฉพาะเมื่อเงื่อนไขที่กำหนดเป็นจริง if (reset) $display("Reset asserted at %0t", $time);

ความแตกต่างระหว่าง $display กับ $write

$display จะเพิ่มอักขระขึ้นบรรทัดใหม่โดยอัตโนมัติที่ส่วนท้ายของการแสดงผล ในขณะที่ $write จะต่อข้อความต่อเนื่องโดยไม่เพิ่มบรรทัดใหม่ ตัวอย่าง:

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

ผลลัพธ์:

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

ผลลัพธ์:

HelloWorld

หากคุณต้องการบันทึกที่ชัดเจนเป็นบรรทัดต่อบรรทัดให้ใช้ $display หากต้องการจัดรูปแบบผลลัพธ์บนบรรทัดเดียวให้ใช้ $write

ข้อควรระวัง

  1. หลีกเลี่ยงการแสดงผลมากเกินไป หากคุณใช้ $display ทุกรอบสัญญาณนาฬิกา, บันทึกจะเติบโตใหญ่และความอ่านง่ายจะลดลง → ใช้เงื่อนไขเพื่อลดการแสดงผล
  2. ใช้การแสดงเวลาที่เหมาะสม การแสดง $time หรือ $realtime ทำให้คุณจับเวลาการทำงานของอุปกรณ์ได้อย่างแม่นยำ
  3. งานที่ออกแบบเพื่อการจำลองเท่านั้น $display ไม่สามารถใช้สำหรับการสังเคราะห์ (การนำไปใช้บน FPGA/ASIC) มันเป็นเครื่องมือดีบักที่ใช้เฉพาะการจำลองเท่านั้น

3. การเปรียบเทียบ System Tasks สำหรับการแสดงผล Log: $display, $write, $strobe, $monitor

Verilog มี system tasks นอกเหนือจาก $display สำหรับการแสดงผล การใช้แต่ละแบบมีกรณีการใช้งานและเวลาที่ต่างกัน จึงควรเข้าใจวิธีใช้ให้ชัดเจน

$display: งานแสดงผลมาตรฐาน

  • ลักษณะ เพิ่มบรรทัดใหม่โดยอัตโนมัติและบันทึกหนึ่งบรรทัดต่อการเรียกใช้
  • กรณีการใช้งาน ใช้บ่อยที่สุดเป็นวิธีดีบักพื้นฐาน; คุณสามารถเรียกใช้ทุกเวลาเพื่อแสดงผลครั้งเดียว

$write: แสดงผลโดยไม่มีบรรทัดใหม่

  • ลักษณะ ไม่เพิ่มบรรทัดใหม่จึงทำให้การแสดงผลต่อเนื่องในบรรทัดเดียวกัน
  • กรณีใช้งาน มีประโยชน์เมื่อคุณต้องการแสดงค่าหลายค่าเคียงข้างกัน
  • ตัวอย่าง $write("A=%d, ", a); $write("B=%dn", b); → ผลลัพธ์: A=5, B=10

$strobe: แสดงผลจบรอบการจำลอง

  • ลักษณะ พิมพ์ค่าหลังจากการประเมินทั้งหมดของขั้นตอนการจำลองในรอบปัจจุบันเสร็จสิ้น
  • กรณีการใช้งาน มีประโยชน์เมื่อหลีกเลี่ยง race conditionัญญาณหลายตัวเปลี่ยนพร้อมกัน)
  • ตัวอย่าง $strobe("Time=%0t, signal=%b", $time, sig); → ในขณะที่ $display อแสดงค่ากลาง, $strobe จะแสดงค่าที่ตั้งตัวแล้ว

$monitor: การแสดงผลอัตโนมัติตามการเปลี่ยนแปลง

  • ลักษณะ แสดงผลอัตโนมัติเมื่อสัญญาณใดที่ถูกตรวจสอบเปลี่ยนแปลง
  • กรณีการใช้งาน สะดวกเมื่อคุณต้องการเฝ้าติดตามชุดสัญญาณอย่างต่อเนื่อง
  • ตัวอย่าง $monitor("At %0t: a=%b, b=%b", $time, a, b); → บันทึกเมื่อ a หรือ b เปลี่ยนแปลง

ตารางสรุป

งานมีบรรทัดใหม่เวลาแสดงผลกรณีการใช้งานหลัก
$displayมีเมื่อเรียกใช้การบันทึกพื้นฐาน
$writeไม่มีเมื่อเรียกใช้การจัดรูปแบบแบบต่อเนื่องในบรรทัดเดียว
$strobeมีหลังจบรจำลองตรวจสอบค่าที่ตั้งตัวแล้ว
$monitorมีอัตโนมัเมื่อัญญาณเปลี่ยนการเฝ้าติดตามต่อเนื่อง

เคล็ดลับการใช้ให้มีประสิทธิภาพ

  • ใช้ $display เป็นค่าเริ่มต้น : อ่านง่ายและเหมาะสำหรับผู้เริ่มต้น
  • ใช้ $write เมื่อคุณต้องการผลลัพธ์ในบรรทัดเดียวรวมกัน
  • ใช้ $strobe เมื่อคุณต้องการค่าที่ตั้งตัวแล้วหลังการเปลี่ยนแปลง
  • ใช้ $monitor เมื่อคุณต้องการเฝ้าติดตามสัญญาณอย่างต่อเนื่อง

4. ตัวระบุรูปแบบและเทคนิคการแสดงผลขั้นสูง

ด้วยงานเช่น $display หรือ $write, คุณสามารถใส่ “ตัวระบุรูปแบบ” (format specifiers) ในสตริงเพื่อแสัญญาณหรือค่าตัวแปรในรูปแบบที่ต้องการ เนื่องจากคล้ายกับ printf ของ C การใช้ให้ถูกต้องตามวัตถุประสงค์จะช่วยเพิ่มประสิทธิภาพการดีบักอย่างมาก

ตัวระบุรูปแบบพื้นฐาน

ตัวระบุคำอธิบายตัวอย่างผลลัพธ์
%bไบนารี1010
%dทศนิยม10
%hเฮกซะเดซิมัลA
%oอ็อกทัล12
%cตัวอักษร ASCIIA
%sสตริงHello
%tเวลาในการจำลอง#100 เป็นต้น
m| ชื่อโมดูลตามลำดับชั้น |top.u1.u2`

ตัวอย่างการใช้งานจริง

  1. แสดงสัญญาณในหลายรูปแบบ
    verilog reg [7:0] data = 8'b10101010; $display("data = %b (bin), %d (dec), %h (hex)", data, data, data);
    → ตัวอย่างผลลัพธ์: data = 10101010 (bin), 170 (dec), AA (hex)

  2. ตรวจสอบลำดับชั้นของโมดูล
    verilog $display("Current module hierarchy is %m");
    → ตัวอย่างผลลัพธ์: Current is top.u1.counter

  3. แสดงเวลาในการจำลอง
    verilog $display("Time=%0t: clk=%b", $time, clk);
    → ตัวอย่างผลลัพธ์: Time=100: clk=1

เทคนิคการแสดงผลขั้นสูง

  • Zero-padding & field width คุณสามารถระบุการเติมศูนย์หรือความกว้างของฟิลด์ เช่น %0d ตัวอย่าง: $display("Count=%04d", count); → ผลลัพธ์: Count=0012
  • Signed vs unsigned distinction %d ปฏิบัติต่อค่าที่เป็น signed, %u ปฏิบัติต่อค่าที่เป็น unsigned หากค่บไม่แสดงตามที่คาดไว้ ให้แก้ไขตัวระบุรูปแบบ
  • Multi-line messages formatting ใช้ \n เพื่อแบ่งบรรทัดเพื่อความอ่านง่าย ตัวอย่าง: $display("Start of test\nSignal A=%b\nSignal B=%b", A, B);

Precautions

  • Mind the bit-width : สัญญาณ Verilog อาจมีความกว้างต่างกัน; การใช้ %d อาจทำให้เกิดการตัดหรือการขยายสัญญาณแบบ sign‑extension
  • Handling undefined values (X, Z) : หากคุณรวมบิตที่ไม่ได้กำหนด, การใช้ %b จะทำให้แสดง x หรือ z โดยตรง

5. Practical Examples: Using $display in Test Benches and Modules

จากนี้เราจะนำเสนอการใช้ $display อย่างมีประสิทธิภาพผ่านตัวอย่างโค้ด Verilog จริง ๆ ครอบคลุมพื้นฐานของ test bench จนถึงการบันทึก debug แบบมีเงื่อนไข

Basic Example: Output in a Test Bench

โดยใส่ $display ลงใน test bench คุณสามารถสังเกตพฤติกรรมระหว่างการจำลองได้

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

ในตัวอย่างนี้ ทุกขอบ rising edge ของสัญญาณ clock จะทำให้แสดงค่า reset และ count เนื่องจากคุณสามารถตรวจสอบข้อความบันทึกและ waveform พร้อมกัน ทำให้การติดตามพฤติกรรมง่ายขึ้น

Conditional Display Example

โดยผสานกับคำสั่ง if คุณสามารถบันทึกเฉพาะเมื่อเงื่อนไขที่กำหนดเป็นจริง

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

→ วิธีนี้ช่วยหลีกเลี่ยงบันทึกที่ไม่จำเป็นในขณะที่ระบุตำแหน่งเหตุการณ์ที่คุณสนใจได้อย่างแม่นยำ

Debug-Message Example

ในระหว่างการ debug การออกแบบ การจับสัญญาณที่เข้าสู่ “สถานะที่ไม่คาดคิด” เป็นวิธีที่มีประสิทธิภาพ

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

→ คุณจะค้นพบข้อบกพร่องของการออกแบบหรือพฤติกรรมการจำลองที่ไม่คาดคิดได้อย่างรวดเร็ว

Monitoring Multiple Signals Together

เมื่อแสดงสัญญาณหลายตัว การรวบรวมไว้ในบรรทัดเดียวด้วย $display ทำให้บันทึกอ่านง่ายขึ้น

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

Summary of Practical Tips

  • Place $display in the test bench to visualize progress วาง $display ใน test bench เพื่อมองเห็นความคืบหน้า
  • Use conditional branches to refine logs ใช้เงื่อนไขเพื่อคัดกรองบันทึก
  • Generate warning messages to detect anomalies สร้างข้อความเตือนเพื่อค้นพบความผิดปกติ
  • Consolidate multiple signals in one line to improve readability รวมสัญญาณหลายตัวในบรรทัดเดียวเพื่อเพิ่มความอ่านง่าย

6. Display‑Control Applications (Pixel/Text/Image Display)

จนถึงตอนนี้ เราได้แนะนำ $display สำหรับบันทึกการจำลอง ในขณะเดียวกัน Verilog ยังถูกใช้อย่างกว้างขวางสำหรับ “การควบคุมการแสดงผล” ในการทำฮาร์ดแวร์ (LCD, VGA, HDMI) ในส่วนนี้เราจะสรุปสั้น ๆ ว่าจะทำการแสดงผลบนหน้าจอระดับฮาร์ดแวร์อย่างไร

Fundamental Concept of Display Control

เพื่อแสดงข้อความหรือรูปภาพบนหน้าจอ คุณต้องสร้างสัญญาณวิดีโอแทนการใช้ $display เพียงอย่างเดียว สัญญาณควบคุมทั่วไปได้แก่:

  • **HSYNC (Horizontal Sync : สัญญาณที่บ่งบอกจบแต่ละบรรทัด
  • VSYNC (Vertical Sync) : สัญญาณที่บ่งบอกจบแต่ละเฟรม
  • RGB Data : สัญญาณที่แสดงสีของพิกเซลแต่ละจุด (เช่น 8‑bit × 3 = 24‑bit color)

ใน Verilog คุณควบคุมสัญญาณเหล่านี้ผ่านตัวนับและ state machine แล้วส่งออกตามช่วงเวลาเพื่อให้บรรลุ “การแสดงผลบนหน้าจอ”

Example 1: Displaying Color Bars

The most basic example is outputting color bars horizontally on a display.

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

→ This results in red, green, and blue color bars aligned across the screen horizontally.

ตัวอย่างที่ 2: การแสดงข้อความ

For text display you prepare a font ROM and convert each character’s dot pattern into pixels.

// 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

→ This draws a particular character (e.g., “A”) on the screen.

ตัวอย่างที่ 3: การแสดงภาพ

To display an image you read pre-stored bitmap data (ROM or external memory) and convert that into pixel output.

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

In embedded systems using FPGAs, this method lets you display simple icons or logos.

ความแตกต่างเมื่อเทียบกับการดีบัก $display

  • $display is text output (simulation only)
  • Display control is video signal generation (hardware-implementable)

Though their purposes differ, learners of Verilog often confuse the two.

  • “I want to verify behavior during simulation” → Use $display
  • “I want to output to actual screen on FPGA” → Design video-signal logic

การขยายการใช้งาน

  • On learning FPGA boards, Verilog is frequently used for 7-segment LED display or small LCD display .
  • Advancing further, you can build systems supporting VGA/HDMI output for game development or GUI display.
  • By combining knowledge of $display with display-control logic you can handle “display” in both simulation and actual hardware.

7. การใช้งานที่เหมาะสมและเคล็ดลับตามสถานการณ์การใช้งาน

When we speak of “display” in Verilog there are two aspects: the simulation-only $display tasks, and the hardware implementation display control. Using each appropriately leads to efficient development and debugging.

การใช้ในขั้นตอนจำลอง

  1. $display เป็นบันทึกดีบัก
    • Output critical variables or signals with $display to check if your design behaves as expected.
    • Verifying “values under specific conditions” or “counter reaching points” via logs is efficient.
  2. หลีกเลี่ยงการแสดงผลมากเกินไป
    • Outputting at every clock cycle floods logs and reduces readability. Narrow the conditions.
    • Example: if (state == ERROR) $display("Error occured at %0t", $time);
  3. แยกแยะระหว่างงานต่าง ๆ
    • $monitor → For signals you wish to watch continuously
    • $strobe → When you need to output settled values
    • $write → For formatted horizontal output

การใช้ในการควบคุมการแสดงผลบนฮาร์ดแวร์

  1. การแสดงผล 7‑segment สำหรับการเรียนรู้
    • In FPGA beginner projects, displaying a counter value on a 7-segment LED is standard.
    • Combine with $display simulation output to deepen understanding of display vs simulation.
  2. การควบคุมจอ LCD หรือ VGA
    • Use font ROM or image ROM to display text or image.
    • By also using $display in simulation you can doubly verify that the video-signal generation is correct.
  3. การซ้อนทับดีบักบนฮาร์ดแวร์
    • You can overlay “counter value”, “coordinates”, “debug messages” on actual video output.
    • In FPGA development it is common to “make the screen itself a debugging tool”.

เคล็ดลับปฏิบัติ

  • ตามการจำลอง → กระบวนการฮาร์ดแวร์ ใช้ $display เพื่อตรวจสอบพฤติกรรมในการจำลองก่อน, จากนั้นย้ายไปยังตรรกะควบคุมการแสดงผลสำหรับการนำไปใช้ในฮาร์ดแวร์
  • ใช้บันทึกและรูปคลื่นร่วมกัน บันทึกข้อความจาก $display ระบุ “เวลาที่เหตุการณ์เกิดขึ้น”, ในขณะที่รูปคลื่นแสดง “การเปลี่ยนแปลงโดยละเอียด”. การใช้ทั้งสองช่วยเพิ่มความแม่นยำในการดีบัก
  • ทำให้รูปแบบข้อความสอดคล้องกันในการพัฒนาทีม การทำให้รูปแบบข้อความ $display (คำนำหน้า, การแสดงเวลา, ฯลฯ) สอดคล้องกันทำให้การวิเคราะห์บันทึกง่ายขึ้นเมื่อหลายคนทำงานร่วมกัน

สรุป

  • งานประเภท $display เป็น “เครื่องมือสังเกต” ที่ใช้เฉพาะการจำลองเท่านั้น
  • การควบคุมการแสดงผลหมายถึงการนำไปใช้ในฮาร์ดแวร์ “วิธีการแสดงผล”
  • การใช้แต่ละอย่างอย่างเหมาะสมและผสานรวมกันจะช่วยให้การพัฒนามีประสิทธิภาพ

8. คำถามที่พบบ่อย (FAQ)

Q1. ความแตกต่างระหว่าง $display กับ $monitor คืออะไร?

A. $display แสดงผลครั้งเดียวขณะที่ถูกเรียกใช้. ในทางตรงกันข้าม, $monitor จะทำการแสดงผลอัตโนมัติทุกครั้งที่สัญญาณที่ลงทะเบียนมีการเปลี่ยนแปลง.

  • สำหรับการดีบักครั้งเดียว → $display
  • สำหรับการตรวจสอบต่อเนื่อง → $monitor

Q2. ควรใช้ $strobe เมื่อใด?

A. $strobe แสดงค่าที่คงที่ในตอนท้ายของรอบการจำลอง. ตัวอย่างเช่น เมื่อหลายสัญญาณเปลี่ยนพร้อมกันที่ขอบสัญญาณนาฬิกา, $display อาจแสดงค่ากลาง. ในกรณีเช่นนั้น $strobe มีประโยชน์ในการแสดงค่าที่สุดท้าย.

Q3. การใช้ตัวระบุรูปแบบ %m มีอะไรบ้าง?

A. %m แสดงชื่อลำดับชั้นของโมดูลปัจจุบัน. ในการออกแบบขนาดใหญ่, การบันทึก “ลำดับชั้นที่ข้อความมาจาก” ทำให้การวิเคราะห์ง่ายขึ้นมาก.

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

Example output:

Current module: top.u1.counter

Q4. บันทึกของฉันใหญ่เกินไปเพราะใช้ $display จำนวนมาก ควรทำอย่างไร?

A. มาตรการต่อไปนี้มีประสิทธิภาพ:

  • ใช้คำสั่ง if เพื่อกรองการแสดงผล
  • แสดงเฉพาะการตรวจจับข้อผิดพลาดหรือเหตุการณ์ที่ต้องการ
  • ใช้ $monitor เพื่อติดตามสัญญาณที่จำเป็นอย่างน้อยที่สุด
  • ส่งออกไปยังไฟล์บันทึกและใช้เครื่องมือกรองในระหว่างการวิเคราะห์

Q5. $display สามารถใช้สำหรับการสังเคราะห์ (FPGA/ASIC) ได้หรือไม่?

A. ไม่. $display เป็น งานที่ใช้เฉพาะการจำลอง เท่านั้น. เครื่องมือสังเคราะห์จะละเลยมันจึงไม่ปรากฏในฮาร์ดแวร์จริง. หากต้องการแสดงบนฮาร์ดแวร์จริงต้องออกแบบด้วย “7‑segment LED”, “LCD”, “VGA control logic” เป็นต้นใน Verilog.

Q6. ฉันจะแสดงข้อความหรือรูปภาพบนฮาร์ดแวร์จริงอย่างไร?

A. ไม่ได้ผ่าน $display, แต่โดยการสร้างสัญญาณวิดีโอ.

  • 7‑segment display → สำหรับการแสดงตัวเลขหรืออักขระอย่างง่าย
  • VGA/LCD → สร้างสัญญาณ HSYNC, VSYNC, RGB และควบคุมมัน
  • ข้อความ → ใช้ฟอนต์ ROM และส่งออกรูปแบบจุด
  • รูปภาพ → เก็บบิตแมพใน ROM หรือหน่วยความจำภายนอกและส่งออกพิกเซลตามนั้น

9. สรุปและขั้นตอนต่อไป

สรุปของบทความนี้

ในบทความนี้เราได้ครอบคลุม “การแสดงผล” ใน Verilog ตั้งแต่พื้นฐานจนถึงการประยุกต์ใช้งาน. จุดสำคัญได้แก่:

  1. พื้นฐานของ $display
    • งานจำลองที่แสดงสัญญาณหรือค่าตัวแปร, ใช้งานคล้ายกับ printf ของ C .
  2. ความแตกต่างกับงานที่เกี่ยวข้อง
    • $write → แสดงโดยไม่มีการขึ้นบรรทัดใหม่
    • $strobe → แสดงค่าที่คงที่ในตอนท้ายของรอบการจำลอง
    • $monitor → ตรวจสอบการเปลี่ยนแปลงสัญญาณโดยอัตโนมัติ
  3. การใช้ตัวระบุรูปแบบ
    • โดยใช้ %b , %d , %h , %m , %t , คุณสามารถสร้างบันทึกที่ชัดเจนและเป็นประโยชน์มากขึ้น.
  4. ตัวอย่างการใช้งานจริง
    • ใส่ $display ลงใน test bench เพื่อเฝ้าติดตามความคืบหน้า.
    • ใช้ข้อความแบบมีเงื่อนไขเพื่อให้การดีบักมีประสิทธิภาพ.
  5. การประยุกต์ในควบคุมการแสดงผล
    • $display ใช้เฉพาะการจำลอง; การนำไปใช้ในฮาร์ดแวร์ต้องใช้ HSYNC, VSYNC, RGB เพื่อแสดงข้อความ/รูปภาพ.
    • จากการเรียนรู้ 7‑segment display ไปจนถึงการควบคุม VGA/HDMI ขั้นสูง, มีการขยายได้หลายรูปแบบ.

ขั้นตอนต่อไป

  • ก้าวสู่ SystemVerilog → ในภาษาต่อเนื่อง SystemVerilog คุณสามารถใช้คุณสมบัติการดีบักขั้นสูงกว่า (assertions, $display ที่ปรับปรุงแล้ว ฯลฯ)
  • รวมกับ waveform viewer → โดยการรวมบันทึก $display กับข้อมูล waveform คุณสามารถวิเคราะห์ค่าตัวเลขและการเปลี่ยนแปลงได้พร้อมกัน เพิ่มความแม่นยำของการดีบัก
  • เรียนรู้การแสดงผลฮาร์ดแวร์ → ในโครงการบอร์ด FPGA ขนาดเล็กลองแสดงผลบน 7‑segment หรือ LCD เพื่อสัมผัสความแตกต่างระหว่าง “simulation display” กับ “hardware display control”
  • นำไปใช้ในการพัฒนาทีม → ด้วยการมาตรฐานรูปแบบข้อความ $display คุณจะเพิ่มประสิทธิภาพการวิเคราะห์บันทึกในงานพัฒนาที่มีหลายคน

สรุป

$display ไม่ได้เป็นเพียง “text output” เท่านั้น มันเป็นเครื่องที่ทรงพลังสำหรับการดีบักการจำลอง และเมื่อคุณก้าวเข้าสู่โลกของการควบคุมการแสดงผล คุณจะได้สัมผัสความสนุกของการแสดงกราฟิกบนจอจริงผ่าน FPGA
ฉันหวังว่าบทความนี้จะช่วยให้ผู้เรียน Verilog เข้าใจทั้ง “simulation debugging” และ “hardware display output” อย่างชัดเจน.