- 1 1. บทนำ: ความสำคัญและวัตถุประสงค์ของ “display” ใน Verilog
- 2 2. พื้นฐานของ $display: ไวยากรณ์, กรณีการใช้, และข้อควรระวัง
- 3 3. การเปรียบเทียบ System Tasks สำหรับการแสดงผล Log: $display, $write, $strobe, $monitor
- 4 4. ตัวระบุรูปแบบและเทคนิคการแสดงผลขั้นสูง
- 5 5. Practical Examples: Using $display in Test Benches and Modules
- 6 6. Display‑Control Applications (Pixel/Text/Image Display)
- 7 7. การใช้งานที่เหมาะสมและเคล็ดลับตามสถานการณ์การใช้งาน
- 8 8. คำถามที่พบบ่อย (FAQ)
- 8.1 Q1. ความแตกต่างระหว่าง $display กับ $monitor คืออะไร?
- 8.2 Q2. ควรใช้ $strobe เมื่อใด?
- 8.3 Q3. การใช้ตัวระบุรูปแบบ %m มีอะไรบ้าง?
- 8.4 Q4. บันทึกของฉันใหญ่เกินไปเพราะใช้ $display จำนวนมาก ควรทำอย่างไร?
- 8.5 Q5. $display สามารถใช้สำหรับการสังเคราะห์ (FPGA/ASIC) ได้หรือไม่?
- 8.6 Q6. ฉันจะแสดงข้อความหรือรูปภาพบนฮาร์ดแวร์จริงอย่างไร?
- 9 9. สรุปและขั้นตอนต่อไป
1. บทนำ: ความสำคัญและวัตถุประสงค์ของ “display” ใน Verilog
“display” หมายถึงอะไรใน Verilog?
ใน Verilog, $display เป็น system task ที่ใช้เป็นเครื่องมือเพื่อ “แสดง” สถานะภายในของการออกแบบระหว่างการจำลอง คล้ายกับ printf ของ C, มันทำให้คุณสามารถส่งสัญญาณ, ค่าตัวแปร, และสตริงไปยังเทอร์มินัลหรือคอนโซล—มีบทบาทสำคัญในการดีบักและการตรวจสอบการทำงานของฟังก์ชัน
ทำไม $display ถึงเป็นสิ่งจำเป็นสำหรับการพัฒนา Verilog?
- ประสิทธิภาพการดีบัก : ในการออกแบบวงจรที่ซับซ้อน การมองเห็นว่าสัญญาณภายในทำงานถูกต้องหรือไม่เป็นสิ่งสำคัญ โดยใช้ `$display คุณสามารถตรวจสอบค่าของสัญญาณที่สนใจได้ทันทีระหว่างการจำลอง
- การแสดงผลการจำลอง : เมื่อทำการติดตามการเปลี่ยนแปลงค่าในช่วงเวลาที่กำหนด, รูปคลื่นอาจไม่เพียงพอ บันทึกการแสดงผลให้วิธีที่เชื่อถือได้ในการบ่งบอกช่วงเวลาที่แม่นยำเหล่านั้น
- เป็นประโยชน์ต่อการจัดทำเอกสาร : เมื่อสื่อสารเจตนาการออกแบบหรือกฎการทำงานให้วิศวกรคนอื่น, การใส่บันทึกการแสดงผลที่มีคำอธิบายสามารถเพิ่มความเข้าใจในโค้ดได้
วัตถุประสงค์และโครงสร้างของบทความนี้
ในบทความนี้ เราจะอธิบายอย่างเป็นระบบดังต่อไปนี้:
- ไวยรณ์พื้นฐานและการใช้งาน : การแนะนำอย่างละเอียดเกี่ยวกับไวยากรณ์และการใช้
$displayขั้นพื้นฐาน - การเปรียบเทียบกับ system task อื่น : เราจะจัดระเบียบความแตกต่างระหว่าง task ที่เกี่ยวกับการแสดงผลเช่น
$write,$strobe, และ$monitor - ตัวกำหนดรูปแบบและเทคนิคการใช้ขั้นสูง : การใช้ตัวกำหนดรูปแบบเช่น
%d,%b,%h,%sและเทคนิคการแสดงผลพิเศษจะถูกนำเสนอ - ตัวอย่างการใช้งานจริง : เราจะแสดงการใช้งานใน test bench และโค้ดพร้อมตัวอย่างที่สามารถนำไปใช้ได้ทันที
- การประยุกต์ควบคุมการแสดงผล : ตัวอย่างการใช้งานจะรวมถึงการส่งออกฮาร์ดแวร์เช่น 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
- ติดตามความคืบหน้าของการจำลอง การใส่
$displayที่จุดเฉพาะในโค้ดช่วยให้คุณตรวจสอบว่าตรงส่วนใดของโค้ดที่กำลังทำงานอยู่ - ตรวจสอบค่าของสัญญาณ แม้ว่าเครื่องมือดูรูปคลื่นอาจทำให้เข้าใจสาขาเงื่อนไขหรือการเปลี่ยนสถานะได้ยาก การแสดงผลเป็นข้อความทำให้การเข้าใจง่ายขึ้น
- ข้อความตามเงื่อนไข การผสานกับคำสั่ง
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
ข้อควรระวัง
- หลีกเลี่ยงการแสดงผลมากเกินไป หากคุณใช้
$displayทุกรอบสัญญาณนาฬิกา, บันทึกจะเติบโตใหญ่และความอ่านง่ายจะลดลง → ใช้เงื่อนไขเพื่อลดการแสดงผล - ใช้การแสดงเวลาที่เหมาะสม การแสดง
$timeหรือ$realtimeทำให้คุณจับเวลาการทำงานของอุปกรณ์ได้อย่างแม่นยำ - งานที่ออกแบบเพื่อการจำลองเท่านั้น
$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 | ตัวอักษร ASCII | A |
%s | สตริง | Hello |
%t | เวลาในการจำลอง | #100 เป็นต้น |
m| ชื่อโมดูลตามลำดับชั้น |top.u1.u2` |
ตัวอย่างการใช้งานจริง
แสดงสัญญาณในหลายรูปแบบ
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)ตรวจสอบลำดับชั้นของโมดูล
verilog $display("Current module hierarchy is %m");
→ ตัวอย่างผลลัพธ์:Current is top.u1.counterแสดงเวลาในการจำลอง
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
$displayin 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
$displayis 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
$displaywith 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.
การใช้ในขั้นตอนจำลอง
$displayเป็นบันทึกดีบัก- Output critical variables or signals with
$displayto check if your design behaves as expected. - Verifying “values under specific conditions” or “counter reaching points” via logs is efficient.
- Output critical variables or signals with
- หลีกเลี่ยงการแสดงผลมากเกินไป
- Outputting at every clock cycle floods logs and reduces readability. Narrow the conditions.
- Example:
if (state == ERROR) $display("Error occured at %0t", $time);
- แยกแยะระหว่างงานต่าง ๆ
$monitor→ For signals you wish to watch continuously$strobe→ When you need to output settled values$write→ For formatted horizontal output
การใช้ในการควบคุมการแสดงผลบนฮาร์ดแวร์
- การแสดงผล 7‑segment สำหรับการเรียนรู้
- In FPGA beginner projects, displaying a counter value on a 7-segment LED is standard.
- Combine with
$displaysimulation output to deepen understanding of display vs simulation.
- การควบคุมจอ LCD หรือ VGA
- Use font ROM or image ROM to display text or image.
- By also using
$displayin simulation you can doubly verify that the video-signal generation is correct.
- การซ้อนทับดีบักบนฮาร์ดแวร์
- 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 ตั้งแต่พื้นฐานจนถึงการประยุกต์ใช้งาน. จุดสำคัญได้แก่:
- พื้นฐานของ
$display- งานจำลองที่แสดงสัญญาณหรือค่าตัวแปร, ใช้งานคล้ายกับ
printfของ C .
- งานจำลองที่แสดงสัญญาณหรือค่าตัวแปร, ใช้งานคล้ายกับ
- ความแตกต่างกับงานที่เกี่ยวข้อง
$write→ แสดงโดยไม่มีการขึ้นบรรทัดใหม่$strobe→ แสดงค่าที่คงที่ในตอนท้ายของรอบการจำลอง$monitor→ ตรวจสอบการเปลี่ยนแปลงสัญญาณโดยอัตโนมัติ
- การใช้ตัวระบุรูปแบบ
- โดยใช้
%b,%d,%h,%m,%t, คุณสามารถสร้างบันทึกที่ชัดเจนและเป็นประโยชน์มากขึ้น.
- โดยใช้
- ตัวอย่างการใช้งานจริง
- ใส่
$displayลงใน test bench เพื่อเฝ้าติดตามความคืบหน้า. - ใช้ข้อความแบบมีเงื่อนไขเพื่อให้การดีบักมีประสิทธิภาพ.
- ใส่
- การประยุกต์ในควบคุมการแสดงผล
$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” อย่างชัดเจน.

