Altifigence Academy

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.

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ã.

SystemVerilog
always_ff @(posedge clk) begin
  if (rst) begin
    a <= 8'd0;
    b <= 8'd0;
  end else begin
    a <= d;
    b <= a;
  end
end
ak+1=dk,bk+1=aka_{k+1}=d_k,\qquad b_{k+1}=a_k

Ban đầ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.

a và b cùng đọc trạng thái cũ
Xem dữ liệu dạng sóng
Dữ liệu dạng sóng: mỗi ký tự là một khoảng; dấu chấm giữ trạng thái trước; p là một chu kỳ đồng hồ.
Tín hiệuDạng sóngGiá trị bus
edge234E0 → E1 → E2
d2345 → 9 → 2
a after2345 → 9 → 2
b after2340 → 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.

Lựa chọn áp dụng cho trình duyệt này. Có thể đổi ở chân trang bất cứ lúc nào.