Arbiter round-robin 4 requester
Module cần viết: rr_arb4 · 7 case (2 mẫu) · giới hạn 4 s/case · ~35 phút
Nhiều master cùng muốn dùng một tài nguyên (bus, bộ nhớ, cổng ghi FIFO), nhưng mỗi lúc chỉ một master được dùng. Arbiter round-robin cấp quyền luân phiên: ai vừa được cấp thì xếp cuối hàng. Nhờ vậy không master nào bị "bỏ đói". Đây là câu phỏng vấn thiết kế RTL rất phổ biến.
module rr_arb4 (
input logic clk,
input logic rst_n, // reset BẤT ĐỒNG BỘ, tích cực mức thấp
input logic [3:0] req, // req[i] = 1: requester i muốn dùng tài nguyên
output logic [3:0] gnt // one-hot (hoặc 0): requester được cấp trong chu kỳ này
);
Tại mỗi sườn lên clk:
- Nếu
req != 0: xét lần lượt các requester bắt đầu từ ngay sau requester được cấp gần nhất, theo vòng 0 → 1 → 2 → 3 → 0. Requester đầu tiên córeq = 1được cấp:gnt= one-hot của nó, và nó trở thành "được cấp gần nhất". - Nếu
req == 0:gnt = 0, giữ nguyên "được cấp gần nhất".
gnt là ngõ ra thanh ghi. rst_n = 0 đưa gnt về 0 ngay lập tức và đặt "được cấp gần nhất" là requester 3, nên lần đầu requester 0 được xét trước.
| chu kỳ | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|
| req | 1111 | 1111 | 1111 | 0000 | 1111 | 0101 | 0101 |
| gnt | 0001 | 0010 | 0100 | 0000 | 1000 | 0001 | 0100 |
Testbench đổi req ở sườn xuống clk và đọc gnt ở sườn xuống kế tiếp.
Các case
- Cả 4 cùng yêu cầu suốt 8 chu kỳmẫu
- Chỉ requester 0 và 2 yêu cầumẫu
Cùng 5 case ẩn kiểm các yêu cầu còn lại của đề. Case ẩn chỉ báo đúng/sai, không nói chi tiết: tự tìm chỗ sai từ đề, hoặc mở gợi ý.
Testbench có mô hình tham chiếu riêng, độc lập với lời giải mẫu. Lời giải mẫu đã chạy qua mọi case trên simulator thật, và 3 bản lỗi mẫu đều bị ít nhất một case bắt. Case mẫu sai sẽ cho biết chỗ sai đầu tiên (giá trị mong đợi so với giá trị nhận được); case ẩn chỉ báo đúng/sai.