15 / 37 · Khái niệm
Nonblocking và cập nhật trạng thái đồng thời
Tách giá trị cũ và mới để đọc đúng RTL pipeline, bộ đếm.
Bài học miễn phí. Đăng ký để lưu tiến độ học tập.
Vế phải được tính từ trạng thái cũ
Trong khối tuần tự theo clock, <= đánh giá vế phải rồi áp kết quả ở bước cập nhật nonblockingNonblocking Phép gán <= trong RTL tuần tự. Đánh giá vế phải rồi lên lịch cập nhật, cho các thanh ghi cùng cạnh tính từ trạng thái cũ.. Khi nhiều thanh ghiThanh ghi Mạch lưu trạng thái nhiều bit. Thanh ghi đồng bộ trong khóa học lưu đầu vào đã quy định tại cạnh clock. Tìm hiểu thêm cập nhật cùng cạnh, có thể viết để giá trị mới không truyền dây chuyền chỉ vì thứ tự dòng mã.
always_ff @(posedge clk) begin
if (rst) begin
a <= 8'd0;
b <= 8'd0;
end else begin
a <= d;
b <= a;
end
endBan đầu a=b=0, đầu vào 5, 9, 2 thì sau cạnh (a,b) là (5,0), (9,5), (2,9). Hiểu dòng hai đọc a vừa cập nhật tương đương xóa một tầng pipelinePipeline Chia tính toán thành các tầng ngăn bởi thanh ghi để xử lý nhiều đầu vào chồng lấp. Dữ liệu, valid và điều khiển phải thẳng hàng theo tầng. Tìm hiểu thêm.
Mỗi cột ghi lại quan sát tại một cạnh lênCạnh lên Khoảnh khắc clock chuyển 0 sang 1, khác với mức cao chỉ cả khoảng CLK=1. Tìm hiểu thêm. Đầu vào là giá trị ngay trước cạnh, còn trạng thái có tên chứa after là giá trị ngay sau cập nhật. Cách căn cột thể hiện thứ tự lấy mẫu, không mô tả độ trễ lan truyềnĐộ trễ lan truyền Thời gian từ khi đầu vào đổi đến khi đầu ra ổn định ở giá trị đúng. Tương đương logic và đặc tính thời gian là hai vấn đề riêng. Tìm hiểu thêm vật lý. Bắt đầu a=b=0. a lưu d mới trong khi b lưu a cũ, nên hai hàng lệch một tầng.
Xem dữ liệu dạng sóng
| Tín hiệu | Dạng sóng | Giá trị bus |
|---|---|---|
| edge | 234 | E0 → E1 → E2 |
| d | 234 | 5 → 9 → 2 |
| a after | 234 | 5 → 9 → 2 |
| b after | 234 | 0 → 5 → 9 |
Vì sao đổi sang blocking có rủi ro
Đổi cùng khối thành a=d; b=a; có thể làm b dùng a đã đổi trong khối ấy. Tương tác lịch với khối tuần tự khác còn có thể tạo race. Lấy blocking cho tính tổ hợp, nonblocking cho lưu trạng thái làm nguyên tắc; chỉ dùng ngoại lệ khi giải thích được ngữ nghĩa sự kiện.
Tránh gán cùng thanh ghi nhiều lần
Nhiều phép gán nonblocking vào q trong cùng thủ tục có thể khiến phép cuối quyết định kết quả. Đừng giấu ưu tiên trong nhiều if độc lập; dùng if / else if / else hoặc biến next-state rõ ràng. Tránh lái cùng thanh ghi từ nhiều khối.
Khi rà RTL, viết một phương trình trạng thái kế tiếp cho mỗi thanh ghi rất hữu ích. Nếu có hai phương trình hoặc có điều kiện chưa định nghĩa, đó là dấu hiệu cần kiểm tra lại ưu tiên điều khiển.
Tự thử
Ban đầu a=1, b=4, chạy a<=b; b<=a; trong cùng khối clock. Trạng thái sau một và hai cạnh là gì?
Đọc giải thích
Sau một cạnh (a,b)=(4,1), sau hai cạnh (1,4). Mỗi phép gán đọc cùng trạng thái cũ nên hoán đổi được. Viết a=b; b=a; có thể khiến cả hai thành b cũ theo thứ tự, không cùng chức năng.