- 1 1. Giới thiệu: Tầm quan trọng và Mục đích của “display” trong Verilog
- 2 3. So sánh các System Task xuất log: $display, $write, $strobe, $monitor
- 3 4. Định dạng và kỹ thuật hiển thị nâng cao
- 4 5. Ví dụ thực tế: Sử dụng $display trong Test Bench và Module
- 5 6. Ứng dụng Điều khiển Hiển thị (Pixel/Text/Image Display)
- 6 7. Cách Sử Dụng Phù Hợp và Mẹo Dựa Trên Các Kịch Bản Ứng Dụng
- 7 8. FAQ (Các Câu Hỏi Thường Gặp)
- 7.1 Q1. Sự khác nhau giữa $display và $monitor là gì?
- 7.2 Q2. Khi nào nên dùng $strobe?
- 7.3 Q3. Mục đích của định dạng %m là gì?
- 7.4 Q4. Log của tôi trở nên khổng lồ vì đã dùng quá nhiều $display. Tôi nên làm gì?
- 7.5 Q5. $display có thể dùng cho synthesis (FPGA/ASIC) không?
- 7.6 Q6. Làm sao để hiển thị văn bản hoặc hình ảnh trên phần cứng thực?
- 8 9. Kết luận & Các Bước Tiếp Theo
1. Giới thiệu: Tầm quan trọng và Mục đích của “display” trong Verilog
“display” có nghĩa là gì trong Verilog?
Trong Verilog, $display là một system task được dùng như một công cụ để “hiển thị” trạng thái nội bộ của thiết kế trong quá trình mô phỏng. Tương tự như printf của C, nó cho phép bạn xuất các tín hiệu, giá trị biến và chuỗi ký tự ra terminal hoặc console—đóng vai trò trung tâm trong việc gỡ lỗi và xác minh chức năng.
Tại sao $display lại quan trọng đối với việc phát triển Verilog?
- Cải thiện hiệu quả gỡ lỗi : Trong các thiết kế mạch phức tạp, việc quan sát xem các tín hiệu nội bộ có hoạt động đúng hay không là rất quan trọng. Bằng cách sử dụng
$display, bạn có thể kiểm tra ngay các giá trị của các tín hiệu quan tâm trong quá trình mô phỏng. - Trực quan hoá mô phỏng : Khi theo dõi sự chuyển đổi giá trị tại các thời điểm cụ thể, sóng dạng (waveform) đôi khi không đủ. Các log hiển cung cấp một cách đáng tin cậy để chỉ ra những khoảnh khắc chính xác đó.
- Cũng hữu ích cho tài liệu : Khi truyền đạt ý định thiết kế hoặc các quy tắc vận hành cho các kỹ sư khác, việc chèn các log hiển thị có chú thích có thể nâng cao khả năng hiểu mã nguồn.
Mục đích và Cấu trúc của Bài viết này
Trong bài viết này, chúng tôi sẽ giải thích một cách có hệ thống các nội dung sau:
- Cú pháp và cách dùng cơ bản : Giới thiệu cẩn thận về cú pháp nền tảng và cách sử dụng
$display. - So sánh với các system task khác : Chúng tôi sẽ tổ chức các khác biệt giữa các task liên quan đến display như
$write,$strobevà$monitor. - Các định dạng và kỹ thuật sử dụng nâng cao : Sử dụng các định dạng như
%d,%b,%h,%svà các kỹ thuật hiển thị đặc biệt sẽ được thiệu. Ví dụ thực tế : Chúng tôi sẽ trình bày các ví dụ cụ thể trong test bench và mã nguồn, cung cấp kiến thức có thể áp dụng ngay. - Ứng dụng điều khiển hiển thị : Các trường hợp sử dụng sẽ bao gồm đầu ra phần cứng như LCD hoặc điều khiển màn hình và hiển thị văn bản/hình ảnh.
Với cấu trúc này, cả người mới bắt đầu và người dùng trung cấp đều có thể hiểu đúng $display trong Verilog và áp dụng nó vào thực tế. Trong mỗi phần tiếp theo, tôi sẽ trình bày rõ ràng bằng các ví dụ và sơ đồ khi có thể## 2. Cơ bản về $display: Cú pháp, Trường hợp sử dụng và Lưu ý
Cú pháp cơ bản của $display
Khi sử dụng $display trong Verilog, cú pháp cơ bản như sau.
$display("string or format specifiers", signal1, signal2, ...);
- Phần chuỗi : Viết bất kỳ văn bản hoặc các định dạng (ví dụ:
%d,%b,%h). - Đối số : Liệt kê tên tín hiệu hoặc biến để xuất ra theo định dạng tương ứng.
Ví dụ: Hiển thị số đếm đồng hồ và giá trị tín hiệu
$display("Time=%0t : clk=%b, reset=%b", $time, clk, reset);
Trong ví dụ này, thời gian mô phỏng và giá trị của các tín hiệu clock/reset được xuất ra.
Trường hợp sử dụng $display
- Nắm bắt tiến trình mô phỏng Bằng cách chèn
$displaytại các điểm cụ thể trong thiết kế, bạn có thể xác nhận phần mã nào đã được thực thi. - Kiểm tra giá trị tín hiệu Ngay cả khi các công cụ xem waveform khiến việc hiểu các nhánh điều kiện hoặc chuyển trạng thái trở nên khó, việc xuất ra dạng văn bản giúp dễ dàng nắm bắt hơn.
- Hiển thị thông báo có điều kiện Kết hợp với câu lệnh
ifbạn có thể ghi log chỉ khi các điều kiện nhất định được thỏa mãn.if (reset) $display("Reset asserted at %0t", $time);
Sự khác nhau giữa $display và $write
$display tự động thêm ký tự xuống dòng ở cuối output. Ngược lại, $write tiếp tục xuất mà không thêm ký tự xuống dòng.
Ví dụ:
$display("Hello");
$display("World");
Output:
Hello
World
$write("Hello");
$write("World");
Output:
HelloWorld
Nếu bạn cần log rõ ràng từng dòng, hãy dùng $display. Khi muốn định dạng nhiều thông tin trên một dòng, hãy dùng $write.
Lưu ý
- Tránh xuất quá mức Nếu bạn sử dụng
$displaymỗi chu kỳ đồng hồ, log sẽ lớn và độ đọc giảm. → Sử dụng điều kiện để giảm đầu ra. - Sử dụng hiển thị thời gian Việc xuất
$timehoặc$realtimecho phép bạn nắm bắt chính xác thời gian của các thao tác. - Nhiệm vụ chỉ dành cho mô phỏng
$displaykhông thể dùng cho synthesis (cài đặt FPGA/ASIC). Nó là công cụ gỡ lỗi chỉ dành cho mô phỏng.
3. So sánh các System Task xuất log: $display, $write, $strobe, $monitor
Verilog cung cấp các system task ngoài $display để xuất. Các trường hợp sử dụng và thời điểm khác nhau khiến việc hiểu cách dùng chúng một cách riêng biệt trở nên hiệu quả.
$display: Task hiển thị chuẩn
- Đặc điểm Tự động thêm ký tự xuống dòng và ghi một dòng mỗi lần gọi.
- Trường hợp sử dụng Thường được dùng nhất như một phương pháp gỡ lỗi cơ bản; bạn có thể gọi nó bất kỳ lúc nào để xuất một lần.
$write: Hiển thị không xuống dòng
- Đặc điểm Không thêm ký tự xuống dòng nên tiếp tục xuất trên cùng một dòng.
- Trường hợp sử dụng Hữu ích khi bạn muốn hiển thị nhiều giá trị cạnh nhau.
- Ví dụ
$write("A=%d, ", a); $write("B=%dn", b);→ Kết quả:A=5, B=10.
$strobe: Xuất vào cuối chu kỳ mô phỏng
- Đặc điểm In các giá trị sau khi tất cả các đánh giá mô phỏng trong bước hiện tại đã hoàn thành.
- Trường hợp sử dụng Hữu ích khi tránh các race condition (khi nhiều tín hiệu đổi đồng thời).
- Ví dụ
$strobe("Time=%0t, signal=%b", $time, sig);→ Trong khi$displaycó thể hiển thị giá trị trung gian,$strobehiển thị giá trị ổn định.
$monitor: Xuất tự động theo dõi
- Đặc điểm Tự động xuất khi bất kỳ tín hiệu nào được theo dõi thay đổi.
- Trường hợp sử dụng Tiện lợi khi bạn muốn giám sát một tập hợp tín hiệu liên tục.
- Ví dụ
$monitor("At %0t: a=%b, b=%b", $time, a, b);→ Ghi lại khiahoặcbthay đổi.
Bảng tóm tắt
| Nhiệm vụ | Dòng mới | Thời điểm xuất | Trường hợp sử dụng chính |
|---|---|---|---|
$display | Có | Khi được gọi | Log cơ bản |
$write | Khi được gọi | Định dạng cạnh nhau | |
$strobe | Có | Sau khi chu kỳ mô phỏng kết thúc | Kiểm tra giá trị ổn định |
$monitor | Có | Tự động khi tín hiệu thay đổi | Giám sát liên tục |
Mẹo sử dụng hiệu quả
- Mặc định sử dụng
$display: Dễ đọc và dễ cho người mới bắt đầu. - Sử dụng
$writekhi bạn muốn một dòng kết hợp . - Sử dụng
$strobekhi bạn cần giá trị ổn định sau khi thay đổi .
Sử dụng$monitorkhi bạn cần giám sát tín hiệu liên tục* .
4. Định dạng và kỹ thuật hiển thị nâng cao
Với các task như $display hoặc $write, bạn có thể chèn “định dạng” (format specifiers) trong chuỗi để xuất tín hiệu hoặc biến theo định dạng mong muốn. Vì nó giống printf của C, việc sử dụng đúng chúng tùy theo mục đích sẽ nâng cao hiệu quả gỡ lỗi đáng kể.
Các định dạng cơ bản
| Định dạng | Mô tả | Ví dụ đầu ra |
|---|---|---|
%b | nhị phân | 1010 |
%d | thập phân | 10 |
%h | thập lục phân | A |
%o | bát phân | 12 |
%c | ký tự ASCII | A |
%s | chuỗi | Hello` |
%t | thời gian mô phỏng | #100 vv. |
%m | tên phân cấp module | top.u1.u2 |
Ví dụ thực tế
Hiển thị một tín hiệu ở nhiều định dạng
reg [7:0] data = 8'b10101010; $display("data = %b (bin), %d (dec), %h (hex)", data, data, data);→ Ví dụ đầu ra:data = 10101010 (bin), 170 (dec), AA (hex)Kiểm tra phân cấp module
$display("Current module hierarchy is %m");→ Ví dụ đầu ra:Current module hierarchy is top.u1.counterHiển thị thời gian mô phỏng
$display("Time=%0t: clk=%b", $time, clk);→ Ví dụ đầu ra:Time=100: clk=1
Kỹ thuật hiển thị nâng cao
- Zero-padding & field width Bạn có thể chỉ định zero‑padding hoặc độ rộng trường như
%0d. Ví dụ:$display("Count=%04d", count);→ Kết quả:Count=0012 - Signed vs unsigned distinction
%dxử lý giá trị dưới dạng có dấu,%uxử lý dưới dạng không dấu Nếu một giá trị âm không hiển thị như mong đợi, hãy sửa lại chỉ định. - Multi-line messages formatting Sử dụng
\nđể ngắt dòng nhằm tăng tính đọc được. Ví dụ:$display("Start of test\nSignal A=%b\nSignal B=%b", A, B);
Lưu ý
- Chú ý độ rộng bit : Các tín hiệu Verilog có thể có độ rộng khác nhau; việc dùng
%dcó thể gây ra hiện tượng cắt bớt hoặc mở rộng dấu. - Xử lý giá trị không xác định (X, Z) : Nếu bạn bao gồm các bit không việc dùng
%bsẽ hiển thị trực tiếpxhoặcz.
5. Ví dụ thực tế: Sử dụng $display trong Test Bench và Module
Từ đây chúng ta sẽ giới thiệu các cách sử dụng hiệu quả của $display thông qua các ví dụ mã Verilog thực tế, bao gồm các kiến thức cơ bản về test bench cho tới việc ghi log có điều kiện.
Ví dụ cơ bản: Xuất kết quả trong một Test Bench
Bằng cách chèn $display vào test bench, bạn có thể quan sát hành vi trong quá trình mô phỏng.
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
Trong ví dụ này, mỗi lần lên cạnh lên của clock sẽ kích hoạt việc xuất reset và count. Vì bạn có thể kiểm tra cả log văn bản lẫn waveform, việc theo dõi hành vi trở nên dễ dàng hơn.
Ví dụ hiển thị có điều kiện
Kết hợp với các câu lệnh if để chỉ ghi log khi các điều kiện cụ thể được thỏa mãn.
always @(posedge clk) begin
if (count == 4'd10) begin
$display("Count has reached 10 (Time=%0t)", $time);
end
end
→ Điều này giúp bạn tránh các log thừa thãi trong khi vẫn xác định được các sự kiện quan trọng.
Ví dụ thông điệp debug
Trong quá trình debug thiết kế, việc bắt được khi một tín hiệu vào “trạng thái không mong đợi” là rất hữu ích.
always @(posedge clk) begin
if (count > 4'd12) begin
$display("WARNING: count overflow detected! Time=%0t, value=%d", $time, count);
end
end
→ Bạn có thể nhanh chóng phát hiện lỗi thiết kế hoặc hành vi mô phỏng bất thường.
Giám sát nhiều tín hiệu cùng lúc
Khi xuất nhiều tín hiệu, việc gom chúng vào một dòng bằng $display làm cho log dễ đọc hơn.
$display("Time=%0t | clk=%b | reset=%b | A=%h | B=%h | SUM=%h",
$time, clk, reset, A, B, SUM);

Tóm tắt các mẹo thực tiễn
- Đặt
$displaytrong test bench để quan sát tiến trình - Sử dụng nhánh có điều kiện để tinh chỉnh log
- Tạo thông điệp cảnh báo để phát hiện bất thường
- Kết hợp nhiều tín hiệu trong một dòng để cải thiện khả năng đọc
6. Ứng dụng Điều khiển Hiển thị (Pixel/Text/Image Display)
Cho đến nay, chúng ta đã giới thiệu $display cho log mô phỏng. Đồng thời, Verilog cũng được sử dụng rộng rãi cho “điều khiển hiển thị” trong các triển khai phần cứng (LCD, VGA, HDMI). Trong phần này, chúng tôi sẽ giới thiệu ngắn gọn cách thực hiện hiển thị màn hình ở mức phần cứng.
Khái niệm cơ bản về Điều khiển Hiển thị
Để hiển thị văn bản hoặc hình ảnh trên màn hình, bạn phải tạo ra các tín hiệu video thay vì chỉ dùng $display.
Các tín hiệu điều khiển điển hình bao gồm:
- HSYNC (Horizontal Sync) : Tín hiệu đánh dấu kết thúc mỗi dòng
- VSYNC (Vertical Sync) : Tín hiệu đánh dấu kết thúc mỗi khung hình
- RGB Data : Tín hiệu đại diện cho màu của mỗi pixel (ví dụ, 8‑bit × 3 = 24‑bit màu)
Trong Verilog, bạn điều khiển các tín hiệu này bằng các bộ đếm và máy trạng thái và xuất chúng dựa trên thời gian để thực hiện “hiển thị trên màn hình”.
Ví dụ 1: Hiển thị các dải màu
Ví dụ cơ bản nhất là xuất các thanh màu theo chiều ngang trên màn hình.
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
→ Điều này tạo ra các thanh màu đỏ, xanh lá và xanh d được sắp xếp ngang trên toàn màn hình.
Ví dụ 2: Hiển thị Văn bản
Để hiển thị văn bản, bạn chuẩn bị một font ROM và chuyển đổi mẫu chấm của mỗi ký tự thành các pixel.
// 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
→ Điều này vẽ một ký tự cụ thể (ví dụA”) trên màn hình.
Ví dụ 3: Hiển thị Hình ảnh
Để hiển thị một hình ảnh, bạn đọc dữ liệu bitmap đã lưu trước (ROM hoặc bộ nhớ ngoài) và chuyển đổi chúng thành đầu ra pixel.
rgb <= image_rom[addr]; // Retrieve color data from ROM
Trong các hệ thống nhúng sử dụng FPGA, phương pháp này cho phép bạn hiển thị các biểu tượng hoặc logo đơn giản.
Sự Khác Biệt So Với Lệnh Gỡ Lỗi $display
$displaylà đầu ra văn bản (chỉ mô phỏng)- Điều khiển hiển thị là tạo tín hiệu video (có thể thực hiện bằng phần cứng)
Mặc dù mục đích của chúng khác nhau, người học Verilog thường nhầm lẫn hai khái niệm này.
- “Tôi muốn xác minh hành vi trong quá trình mô phỏng” → Sử dụng
$display - “Tôi muốn xuất ra màn hình thực tế trên FPGA” → Thiết kế logic tín hiệu video
Mở Rộng Ứng Dụng
- Khi học các bo mạch FPGA, Verilog thường được dùng cho hiển thị LED 7 đoạn hoặc màn hình LCD nhỏ.
- Khi tiến xa hơn, bạn có thể xây dựng các hệ thống hỗ trợ đầu ra VGA/HDMI cho phát triển trò chơi hoặc hiển thị GUI.
- Bằng cách kết hợp kiến thức về
$displayvới logic điềuển hiển thị, bạn có thể xử lý “hiển thị” cả trong mô phỏng và phần cứng thực tế.
7. Cách Sử Dụng Phù Hợp và Mẹo Dựa Trên Các Kịch Bản Ứng Dụng
Khi chúng ta nói về “display” trong Verilog, có hai khía cạnh: các tác vụ $display chỉ dành cho mô phỏng, và điều khiển hiển thị trong triển khai phần cứng. Sử dụng chúng một cách phù hợp sẽ dẫn đến việc phát triển và gỡ lỗi hiệu quả.
Sử Dụng Trong Mô Phỏng
$displaynhư nhật ký gỡ lỗi- Xuất các biến hoặc tín hiệu quan trọng bằng
$displaytra xem thiết kế của bạn có hoạt động như mong đợi không. - Xác minh “giá trị trong các điều kiện cụ thể” hoặc “bộ đếm đạt đến các điểm” qua nhật ký là hiệu quả.
- Xuất các biến hoặc tín hiệu quan trọng bằng
- Tránh xuất quá mức
- Xuất ra ở mỗi chu kỳ đồng hồ sẽ làm ngập nhật ký và giảm khả năng đọc. Hãy thu hẹp các điều kiện.
- Ví dụ:
if (state == ERROR) $display(" occured at %0t", $time);
- Phân biệt các tác vụ
$monitor→ Đối với các tín hiệu bạn muốn theo dõi liên tục$strobe→ Khi bạn cần xuất các giá trị đã ổn định$write→ Đối với đầu ra ngang có định dạng
Sử Dụng Trong Điều Khiển Hiển Thị Phần Cứng
- Hiển thị 7 đoạn cho việc học
- Trong các dự án FPGA dành cho người mới bắt đầu, hiển thị giá trị bộ đếm trên LED 7 đoạn là tiêu chuẩn.
- Kết hợp với đầu ra mô phỏng
$displayđể tăng cường hiểu biết về sự khác nhau giữa hiển thị và mô phỏng.
- Điều khiển màn hình LCD hoặc VGA
- Sử dụng font ROM hoặc image ROM để hiển thị văn bản hoặc hình ảnh.
- Bằng cách cũng sử dụng
$displaytrong mô phỏng, bạn có thể kiểm tra gấp đôi rằng việc tạo tín hiệu video là chính xác.
- Lớp phủ gỡ lỗi trong phần cứng
- Bạn có thể chồng lên “giá trị bộ đếm”, “tọa độ”, “tin nhắn gỡ lỗi” trên đầu ra video thực tế.
- Trong phát triển FPGA, thường “biến màn hình thành công cụ gỡ lỗi”.
Mẹo Thực Tế
- Theo mô phỏng → luồng phần cứng Đầu tiên dùng
$displayđể xác minh hành vi trong mô phỏng, sau đó chuyển sang logic điều khiển hiển thị cho việc triển khai phần cứng. - Kết hợp log và waveform Các log văn bản từ
$displaycho biết “thời gian sự kiện”, trong khi waveform hiển thị “các chuyển đổi chi tiết”. Sử dụng cả hai sẽ nâng cao độ chính xác debug. - Chuẩn hoá định dạng tin nhắn trong phát triển nhóm Việc chuẩn hoá định dạng tin nhắn
$display(tiền tố, hiển thị thời gian, v.v.) giúp việc phân tích log dễ dàng hơn khi nhiều người cùng làm việc.
Tóm tắt
- Các tác vụ kiểu
$displaychỉ dành cho mô phỏng “công cụ quan sát” - Điều khiển hiển thị nghĩa là triển khai phần cứng “phương pháp hiển thị”
- Khi sử dụng mỗi loại một cách phù hợp và kết hợp chúng, bạn có thể đạt được quá trình phát triển hiệu quả
8. FAQ (Các Câu Hỏi Thường Gặp)
Q1. Sự khác nhau giữa $display và $monitor là gì?
A. $display xuất ra một lần tại thời điểm nó được gọi. Ngược lại, $monitor tự động xuất ra mỗi khi một tín hiệu đã đăng ký thay đổi.
- Đối với việc debug một lần →
$display - Đối với việc giám sát liên tục →
$monitor
Q2. Khi nào nên dùng $strobe?
A.strobexuất ra giá trị ổn định vào cuối một chu kỳ mô phỏng. Ví dụ, khi nhiều tín hiệu thay đổi đồng thời ở cạnh clock,$displaycó thể hiển thị các giá trị trung gian. Trong những trường hợp này$strobe` tiện lợi để hiển thị các giá trị cuối cùng.
Q3. Mục đích của định dạng %m là gì?
A. %m xuất ra tên phân cấp mô-đun hiện tại. Trong các thiết kế lớn, việc log “phân cấp nào đã sinh ra tin nhắn” giúp việc phân tích dễ dàng hơn rất nhiều.
$display("Current module: %m");
Example output:
Current module: top.u1.counter
Q4. Log của tôi trở nên khổng lồ vì đã dùng quá nhiều $display. Tôi nên làm gì?
A. Các biện pháp sau hiệu quả:
- Dùng câu lệnh
ifđể lọc đầu ra - Chỉ xuất ra khi phát hiện lỗi hoặc các sự kiện cụ thể
- Dùng
$monitorđể giám sát chỉ các tín hiệu tối thiểu cần thiết - Xuất ra file log và áp dụng công cụ lọc trong quá trình phân tích
Q5. $display có thể dùng cho synthesis (FPGA/ASIC) không?
A. Không. $display là tác vụ chỉ dành cho mô phỏng. Các công cụ synthesis sẽ bỏ qua nó nên không xuất hiện trong phần cứng thực tế. Nếu muốn hiển thị kết quả trên phần cứng thực, bạn phải thiết kế với “đèn LED 7 đoạn”, “LCD”, “logic điều khiển VGA”, v.v., trong Verilog.
Q6. Làm sao để hiển thị văn bản hoặc hình ảnh trên phần cứng thực?
A. Không phải qua $display, mà bằng cách tạo tín hiệu video.
- Đèn LED 7 đoạn → Đối với hiển thị số hoặc ký tự đơn giản
- VGA → Tạo tín hiệu HSYNC, VSYNC, RGB và điều khiển chúng
- Văn bản → Dùng ROM font và xuất mẫu điểm ảnh
- Hình ảnh → Lưu bitmap trong ROM hoặc bộ nhớ ngoài và xuất các pixel tương ứng
9. Kết luận & Các Bước Tiếp Theo
Tóm tắt Bài Viết Này
Trong bài này chúng ta đã đề cập đến “display” trong Verilog từ những nguyên tắc cơ bản đến các ứng dụng. Các điểm chính bao gồm:
- Cơ bản về
$display- Một tác vụ mô phỏng hiển thị tín hiệu hoặc biến, sử dụng tương tự như
printftrong C.
- Một tác vụ mô phỏng hiển thị tín hiệu hoặc biến, sử dụng tương tự như
- Sự khác nhau với các tác vụ liên quan
$write→ Hiển thị mà không xuống dòng$strobe→ Xuất giá trị ổn định vào cuối chu kỳ mô phỏng$monitor→ Tự động giám sát thay đổi tín hiệu
- Sử dụng các định dạng
- Bằng cách dùng
%b,%d,%h,%m,%t, bạn có thể tạo log rõ ràng và thực tế hơn.
- Bằng cách dùng
- Ví dụ thực tế
- Chèn
$displayvào test bench để theo dõi tiến trình. - Dùng tin nhắn có điều kiện để bật debug hiệu quả.
- Chèn
- Ứng dụng trong điều khiển hiển thị
$displaychỉ dành cho mô phỏng; triển khai phần cứng sử dụng HSYNC, VSYNC, RGB để xuất văn bản/hình ảnh.- Từ việc học đèn LED 7 đoạn đến điều khiển VGA/HDMI nâng cao thể mở rộng thêm nhiều tính năng.
Các Bước Tiếp Theo
- Tiến tới SystemVerilog → Trong ngôn ngữ kế thừa SystemVerilog, bạn có thể sử dụng các tính năng gỡ lỗi nâng cao hơn (assertions,
$displaycải tiến, v.v.). - Kết hợp với trình xem waveform → Bằng cách kết hợp log
$displayvà dữ liệu waveform, bạn có thể phân tích cả giá trị số và các chuyển đổi, nâng cao độ chính xác của việc gỡ lỗi. - Học đầu ra hiển thị phần cứng → Trong một dự án bo mạch FPGA nhỏ, hãy thử xuất ra trên đèn 7 đoạn hoặc LCD để cảm nhận sự khác biệt giữa “hiển thị mô phỏng” và “điều khiển hiển thị phần cứng”.
- Áp dụng trong phát triển nhóm → Bằng cách chuẩn hoá định dạng thông điệp
$display, bạn cải thiện hiệu quả phân tích log trong môi trường phát triển đa người.
Kết luận
$display không chỉ là “đầu ra văn bản” đơn thuần. Nó là một công cụ mạnh mẽ cho việc gỡ lỗi mô phỏng. Và khi bạn bước vào thế giới điều khiển hiển thị, bạn sẽ trải nghiệm niềm vui khi hiển thị đồ họa trên màn hình thực tế thông qua FPGA.
Hy vọng bài viết này giúp người học Verilog hiểu rõ cả “gỡ lỗi mô phỏng” và “đầu ra hiển thị phần cứng”.

