Menu
CoddyTech

Độ trễ phép gán

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 69 trên 90.

Trong các bài học trước, chúng ta đã tìm hiểu về độ trễ tổng quát (#10 a = b;) và độ trễ cổng (and #5 (out, a, b);). Bây giờ, chúng ta sẽ tìm hiểu về độ trễ phép gán, tức là độ trễ xảy ra bên trong một khối thủ tục (như initial hoặc always) trong một câu lệnh gán.

Độ trễ khi gán sẽ chờ trong một khoảng thời gian nhất định, sau đó thực hiện phép gán. Độ trễ nằm sau ký hiệu # và trước phép gán.

Cú pháp:

variable = #delay expression;

Khác với độ trễ chung #10 a = b; (chờ rồi gán), độ trễ phép gán a = #10 b; lấy giá trị của b tại thời điểm đó, chờ 10 đơn vị thời gian rồi gán giá trị đó cho a.

Độ trễ gán và độ trễ tổng quát

 Độ trễ tổng quátĐộ trễ gán
Cú pháp#10 a = b;a = #10 b;
Khi nào đọc giá trị?Tại thời điểm gán (sau độ trễ)Ngay lập tức (trước độ trễ)
Giá trị nào được gán?Giá trị của b tại thời điểm đóGiá trị của b tại thời điểm 0 (hoặc thời điểm đọc)
Khi nào giá trị được gán?Sau độ trễSau độ trễ

Ví dụ: sự khác biệt

initial begin
  b = 1;
  #5 b = 0;
  
  // Độ trễ chung
  #10 a1 = b;     // Chờ 10, rồi đọc b (b=0) → a1=0
  
  // Độ trễ khi gán
  a2 = #10 b;     // Đọc b ngay (b=0), chờ 10, rồi gán → a2=0
end

Cả hai đều cho cùng một kết quả ở đây. Sự khác biệt xuất hiện khi b thay đổi trong lúc chờ.

Ví dụ về điểm khác biệt chính

To show b changing during the delay, we need two separate initial blocks that run in parallel:

initial begin
  b = 1;
  a1 = #10 b;     // Đọc b=1 tại thời điểm 0, gán a1=1 tại thời điểm 10
end

initial begin
  #5 b = 0;       // Đổi b thành 0 tại thời điểm 5 (trong thời gian chờ)
end
  • Tại thời điểm 0: a1 đọc b = 1
  • Tại thời điểm 5: b đổi thành 0 (trong khi a1 vẫn đang chờ)
  • Tại thời điểm 10: a1 được gán 1 (giá trị được đọc tại thời điểm 0), không phải 0

Với độ trễ tổng quát #10 a2 = b; trong một khối riêng, b sẽ được đọc tại thời điểm 10 (giá trị 0).

Các quy tắc quan trọng

Quy tắcGiải thích
= đứng trước #a = #10 b; chứ không phải a #10 = b;
Giá trị được đọc ngay lập tứcVế phải được đánh giá ngay lập tức
Phép gán diễn ra sau một khoảng trễVế trái nhận giá trị sau đó
Chỉ dùng cho các khối thủ tụcDùng trong initial hoặc always
challenge icon

Thử thách

Cần làm:

Thêm độ trễ còn thiếu vào phép gán để a nhận giá trị của b sau 15 đơn vị thời gian, nhưng đọc b ngay lập tức.

Tự làm thử

module assignment_challenge;
  reg a, b;
  
  // Khối lệnh (block) riêng để thay đổi b trong thời gian chờ
  initial begin
    b = 1;
    // TODO: Thêm độ trễ khi gán
    // a cần nhận giá trị của b sau 15 đơn vị thời gian
    // Đọc b ngay, gán sau thời gian chờ

  end
  
  initial begin
    #5 b = 0;      // Thay đổi b trong thời gian chờ
    #20 $display("Time %0t: a = %b", $time, a);
    $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