FIFO bất đồng bộ hai clock (con trỏ Gray)
Module cần viết: afifo · 8 case (2 mẫu) · giới hạn 4 s/case · ~60 phút
Khi dữ liệu đi giữa hai miền clock không liên quan, ví dụ từ bộ thu 125 MHz sang bus hệ thống 100 MHz, người ta dùng FIFO bất đồng bộ. Đây là câu phỏng vấn "boss" của mảng RTL: nó gom gần đủ mọi thứ về CDC (clock domain crossing). Bài này theo kiến trúc kinh điển: con trỏ mã Gray đi qua bộ đồng bộ 2 flip-flop.
module afifo (
// miền ghi
input logic wclk,
input logic wrst_n, // reset bất đồng bộ, tích cực thấp
input logic winc, // ghi wdata ở sườn lên này (bị bỏ qua nếu wfull = 1)
input logic [7:0] wdata,
output logic wfull,
// miền đọc
input logic rclk,
input logic rrst_n,
input logic rinc, // lấy phần tử đầu ra khỏi FIFO ở sườn lên này (bị bỏ qua nếu rempty = 1)
output logic [7:0] rdata, // phần tử đầu: hợp lệ khi rempty = 0 (first-word fall-through)
output logic rempty
);
Sâu 8 phần tử. Yêu cầu:
- Đúng dữ liệu: mọi phần tử ghi vào đều đọc ra đúng thứ tự, không mất, không lặp.
rdataluôn là phần tử đầu, không cần chờ một nhịp saurinc. - Bảo vệ:
winckhiwfull = 1vàrinckhirempty = 1bị bỏ qua. - Cờ chính xác trong miền của chính nó: nếu bên đọc không đọc thì
wfulllên ngay sau lần ghi thứ 8 tính từ lúc rỗng. Nếu bên ghi không ghi thìremptylên ngay sau khi đọc phần tử cuối. - Cờ ở miền bên kia được phép bi quan, nhưng trễ có giới hạn: sau một lần ghi vào FIFO rỗng,
remptyvề 0 trong tối đa 4 sườnrclk. Sau một lần đọc từ FIFO đầy,wfullvề 0 trong tối đa 4 sườnwclk. wfullvàremptylà ngõ ra flip-flop. Sau reset (cả hai reset cùng lúc):rempty = 1,wfull = 0.
Testbench đổi tín hiệu của mỗi miền ở sườn xuống của clock miền đó, và chỉ ghi khi wfull = 0, chỉ đọc khi rempty = 0 (trừ các case cố ý vi phạm để kiểm yêu cầu 2).
Mô phỏng RTL không có metastability. Dùng con trỏ nhị phân đi thẳng qua miền kia cũng có thể qua test, nhưng sẽ hỏng trên silicon. Lời giải đúng phải dùng Gray + 2 flip-flop. Phần lời giải giải thích vì sao.
Các case
- Ghi 3, đọc 3, hai clock cùng tần số lệch phamẫu
- Sau reset: rempty = 1, wfull = 0mẫu
Cùng 6 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à 4 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.