Thành thạo $display trong Verilog: Các kỹ thuật gỡ lỗi hiệu quả và kiểm soát hiển thị

目次

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:

  1. 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 .
  2. 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 , $strobe$monitor .
  3. 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 , %s và 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.
  4. Ứ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

  1. Nắm bắt tiến trình mô phỏng Bằng cách chèn $display tạ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.
  2. 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.
  3. Hiển thị thông báo có điều kiện Kết hợp với câu lệnh if bạ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$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 ý

  1. Tránh xuất quá mức Nếu bạn sử dụng $display mỗi chu kỳ đồng hồ, log sẽ lớn và độ đọc giảm. → Sử dụng điều kiện để giảm đầu ra.
  2. Sử dụng hiển thị thời gian Việc xuất $time hoặc $realtime cho phép bạn nắm bắt chính xác thời gian của các thao tác.
  3. Nhiệm vụ chỉ dành cho mô phỏng $display khô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 $display có thể hiển thị giá trị trung gian, $strobe hiể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 khi a hoặc b thay đổi.

Bảng tóm tắt

Nhiệm vụDòng mớiThời điểm xuấtTrường hợp sử dụng chính
$displayKhi được gọiLog cơ bản
$writeKhi được gọiĐịnh dạng cạnh nhau
$strobeSau khi chu kỳ mô phỏng kết thúcKiểm tra giá trị ổn định
$monitorTự động khi tín hiệu thay đổiGiá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 $write khi bạn muốn một dòng kết hợp .
  • Sử dụng $strobe khi bạn cần giá trị ổn định sau khi thay đổi .
    Sử dụng $monitor khi 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ạngMô tảVí dụ đầu ra
%bnhị phân1010
%dthập phân10
%hthập lục phânA
%obát phân12
%cký tự ASCIIA
%schuỗiHello`
%tthời gian mô phỏng#100 vv.
%mtên phân cấp moduletop.u1.u2

Ví dụ thực tế

  1. 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)

  2. Kiểm tra phân cấp module $display("Current module hierarchy is %m"); → Ví dụ đầu ra: Current module hierarchy is top.u1.counter

  3. Hiể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 %d xử lý giá trị dưới dạng có dấu, %u xử 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 %d có 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 %b sẽ hiển thị trực tiếp x hoặc z.

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 resetcount. 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 $display trong 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

  • $displayđầ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ề $display vớ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

  1. $display như nhật ký gỡ lỗi
    • Xuất các biến hoặc tín hiệu quan trọng bằng $display tra 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ả.
  2. 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);
  3. 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

  1. 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.
  2. Đ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 $display trong 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.
  3. 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ừ $display cho 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 $display chỉ 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$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. $displaytá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:

  1. 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ư printf trong C.
  2. 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
  3. 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.
  4. Ví dụ thực tế
    • Chèn $display và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ả.
  5. Ứng dụng trong điều khiển hiển thị
    • $display chỉ 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, $display cải tiến, v.v.).
  • Kết hợp với trình xem waveform → Bằng cách kết hợp log $display và 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”.