Độ 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
endCả 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đọcb = 1 - Tại thời điểm 5:
bđổi thành0(trong khia1vẫn đang chờ) - Tại thời điểm 10:
a1được gán1(giá trị được đọc tại thời điểm 0), không phải0
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ắc | Giả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ức | Vế 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ục | Dùng trong initial hoặc always |
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
endmoduleBà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
1Giới thiệu
Verilog là gìPhần cứng và phần mềmModule đầu tiênChú thíchCác mức trừu tượng hóa thiết kế4Toán tử phần 1
Toán tử số họcToán tử moduloToán tử so sánhÔn tập: phép tính đơn giảnToán tử thao tác bit7Gán và cổng logic
Gán liên tụcGán bằng toán tửCác cổng nguyên thủy tích hợp sẵnCổng AND, OR, NOTCổng XOR, XNORÔn tập: mạch cổng logic10Ra quyết định
Câu lệnh ifIf và elseÔn tập: Bộ so sánh đơn giảnCâu lệnh caseCasex và casezÔn tập: Thiết kế ALU13Thời gian và độ trễ
Độ trễ là gìĐộ trễ cổngĐộ trễ phép gánChỉ thị timescaleTạo xung nhịpÔn tập về điều khiển thời gian5Các toán tử, phần 2
Toán tử logicToán tử rút gọnToán tử dịch bitToán tử nốiToán tử điều kiệnÔn tập: thử thách về toán tử11Vòng lặp
Vòng lặp forVòng lặp whileVòng lặp repeatVòng lặp vô hạnCâu lệnh vô hiệu hóaÔn tập: các mẫu vòng lặp3Hệ thống số
Biểu diễn nhị phânSố có kích thướcSố không có kích thướcSố âmCác giá trị đặc biệt X và ZÔn tập: định dạng số6Module
Cấu trúc moduleCổng đầu vào và đầu raCổng vào ra hai chiềuKhởi tạo moduleÁnh xạ cổng theo tênÁnh xạ cổng theo thứ tựÔn tập: xây dựng module9Khối thủ tục
Khối alwaysKhối initialDanh sách độ nhạyPhép gán chặnPhép gán không chặnÔn tập: always và initial12Dự án bộ ghép kênh
Thiết kế bộ ghép kênh 2 thành 1Thiết kế bộ ghép kênh 4 thành 115Bộ điều khiển đèn giao thông
Xác định các trạng tháiLogic máy trạng tháiTự luyện tập: Trình biên dịch Verilog online