Menu
CoddyTech

Độ trễ là gì

Thuộc phần Kiến thức nền tảng trong hành trình Verilog của Coddy. Bài học 67 trên 90.

Trong Verilog, độ trễ kiểm soát thời điểm một câu lệnh được thực thi hoặc thời điểm một tín hiệu thay đổi. Chúng được dùng để mô phỏng hành vi định thời của phần cứng thực tế.

Lý do cần có độ trễ

Phần cứng thực tế cần thời gian để tín hiệu truyền qua dây dẫn và cổng logic. Độ trễ giúp bạn mô phỏng đặc tính thời gian này.

  • Trong mô phỏng, nếu không có độ trễ, mọi thứ đều diễn ra tại thời điểm 0
  • Độ trễ giúp bạn phân bố các sự kiện theo thời gian
  • Chúng giúp kiểm thử các thiết kế nhạy cảm với thời gian, như đồng hồ và máy trạng thái

Các loại độ trễ

Loại độ trễMục đích
Độ trễ cổng logicĐộ trễ qua các cổng logic
Độ trễ phép gánĐộ trễ khi gán giá trị
Chỉ thị thang thời gianThiết lập đơn vị thời gian cho mô phỏng

Cú pháp cơ bản

Độ trễ được viết bằng # theo sau là một số:

#10 clk = ~clk;   // Chờ 10 đơn vị thời gian, rồi đảo trạng thái clock
#5 a = b;         // Chờ 5 đơn vị thời gian, rồi gán a = b

Số sau # là số đơn vị thời gian cần chờ.

Ví dụ đơn giản

initial begin
  a = 0;
  #10 a = 1;   // Sau 10 đơn vị thời gian, a chuyển thành 1
  #5 a = 0;    // Sau thêm 5 đơn vị thời gian, a chuyển thành 0
end

Thời điểm:

  • Thời điểm 0: a = 0
  • Thời điểm 10: a = 1
  • Thời điểm 15: a = 0

Độ trễ trong khối always

always #5 clk = ~clk;   // Đảo trạng thái xung nhịp sau mỗi 5 đơn vị thời gian

Lệnh này tạo ra tín hiệu xung nhịp liên tục (với điều kiện clk được khởi tạo bằng 0 trong một khối initial trước đó. Nếu không, ~x vẫn giữ nguyên giá trị x).

Quy tắc quan trọng

Quy tắcGiải thích
Ký hiệu #Đánh dấu độ trễ
Số sau #Số đơn vị thời gian cần chờ
Các độ trễ được cộng dồn#10 rồi đến #20 thì tổng thời gian chờ là 30
Không thể tổng hợpĐộ trễ chỉ dùng cho mô phỏng
challenge icon

Thử thách

Cần làm:

Thêm các khoảng trễ còn thiếu để đoạn code này in ra thông báo tại các thời điểm 0, 10, 25 và 40.

Tự làm thử

module delay_challenge;
  
  initial begin
    $display("Time %0t: Start", $time);
    // TODO: Thêm khoảng trễ để đạt mốc thời gian 10
    $display("Time %0t: After first delay", $time);
    // TODO: Thêm khoảng trễ để đạt mốc thời gian 25
    $display("Time %0t: After second delay", $time);
    // TODO: Thêm khoảng trễ để đạt mốc thời gian 40
    $display("Time %0t: End", $time);
    $finish;
  end
  
endmodule

quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Kiến thức nền tảng

Tự luyện tập: Trình biên dịch Verilog online