FIFO đầy mà vừa đọc vừa ghi: không mất băng thông
Module cần viết: fifo4 · 6 case (2 mẫu) · giới hạn 4 s/case · ~30 phút
FIFO đồng bộ sâu 4. Đặc tả này khác bài fifo8 ở một điểm, và chính điểm đó là bẫy: khi FIFO đầy mà cùng một nhịp có cả đọc và ghi, lệnh ghi được nhận, vì lệnh đọc giải phóng đúng một ô. Nhờ vậy FIFO giữ được băng thông tối đa, một dữ liệu mỗi nhịp, kể cả khi đầy.
module fifo4 (
input logic clk,
input logic rst_n, // reset bất đồng bộ: rỗng
input logic wr,
input logic [7:0] wdata,
input logic rd,
output logic [7:0] rdata, // phần tử đầu (first-word fall-through), hợp lệ khi !empty
output logic wr_ok, // tổ hợp: lệnh ghi ở nhịp này được nhận
output logic rd_ok, // tổ hợp: lệnh đọc ở nhịp này được nhận
output logic full, empty,
output logic [2:0] count
);
rd_ok = rd && !empty. Rỗng thì không đọc được, kể cả khi cùng nhịp có ghi.wr_ok = wr && (!full || rd). Đầy mà có đọc cùng nhịp thì vẫn ghi được.- Ở sườn lên, lệnh được nhận thì thực hiện: ghi
wdatavào cuối, bỏ phần tử đầu.countcập nhật theo. full = (count == 4),empty = (count == 0).
Testbench đặt tín hiệu ở sườn xuống, rồi 1 ns sau đọc wr_ok, rd_ok, rdata và các cờ.
Các case
- Ghi 2, đọc 2mẫu
- Đầy + đọc + ghi cùng nhịpmẫu
Cùng 4 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.