Altifigence Academy

10 / 37 · Khái niệm

RTL tổ hợp và phép gán đầy đủ

Biểu diễn cùng hàm bằng toán tử điều kiện và always_comb; tìm thiếu phép gán gây latch.

Đầu ra tổ hợp do đầu vào hiện tại quyết định

Viết MUXBộ chọn kênh Mạch tổ hợp nối một trong nhiều đầu vào tới đầu ra theo tín hiệu chọn. Phải quy định quan hệ giữa bit chọn và số đầu vào. Tìm hiểu thêm trực tiếp nhất là assign y = sel ? b : a;. Khi tính nhiều đầu ra cùng lúc, có thể dùng always_comb.

SystemVerilog
always_comb begin
  y = a;
  if (sel) y = b;
end

Gán mặc định trước định nghĩa cả đường sel=0. Nếu chỉ còn if (sel) y = b;, khi sel=0 phải giữ y quá khứ, nên không còn hàm tổ hợp thuần túy. Đừng bỏ qua cảnh báo công cụ hoặc chỉ tin từ khóa always_comb.

Gán y=a mặc định rồi chỉ chọn b khi sel=1 có cùng chức năng tổ hợp 0/1 với mạch dưới. Ngay cả sel=0, đầu ra vẫn phải xác định.

Hai đường được phép gán mặc định bao phủ

y = sel ? b : a

Đừng chỉ đọc cú pháp thủ tục như thứ tự phần mềm

Khối tổ hợp thường dùng blocking = để tính kết quả tạm. Nếu biểu thức sau đọc giá trị vừa gán trước trong cùng khối, phụ thuộc ấy trở thành đường tổ hợp. Phân biệt với 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ũ. Tìm hiểu thêm <= dùng cập nhật 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 tuần tự.

SystemVerilog
always_comb begin
  next_y = sel ? b : a;
  inverted_y = ~next_y;
end

Một quy tắc khác là không lái một đầu ra từ nhiều khối. Khi chia nhiều mô-đun, cần theo dõi “ai là nguồn lái duy nhất của tín hiệu này” trong giao diện.

Khớp độ rộng hai dữ liệu trước

Nếu chọn giữa 8 bit và 12 bit, nêu rõ độ rộng y và mở rộng dấu. Quyết định phạm vi đầu vào trong thiết kế, thay vì tình cờ xác nhận mở rộng ngầm bằng dạng sóng. Ngoài mô hình 0/1, khi sel=X, toán tử điều kiện có thể khác if đơn giản; không khái quát kết quả hai trạng thái thành toàn bộ bốn trạng thái.

Tự thử

Trong always_comb chỉ có if(en) y=d;. Sửa thế nào để thành mạch tổ hợp xuất 0 khi enable không hoạt động?

Đọc giải thích

Gán y=0 đầu khối, rồi ghi đè bằng d khi en; hoặc dùng biểu thức có độ rộng rõ tương đương assign y = en ? d : 0. Giữ giá trị cũ khi en=0 là đặc tả riêng của thanh ghi/latch, không giống xuất 0.

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.