FIFO đồng bộ sâu 8
Module cần viết: fifo8 · 10 case (2 mẫu) · giới hạn 4 s/case · ~40 phút
Viết FIFO đồng bộ, rộng 8 bit, sâu 8 phần tử:
module fifo8 (
input logic clk,
input logic rst_n, // reset BẤT ĐỒNG BỘ, tích cực mức thấp
input logic wr_en,
input logic [7:0] din,
input logic rd_en,
output logic [7:0] dout,
output logic full,
output logic empty,
output logic [3:0] count // số phần tử đang chứa: 0..8
);
Tại mỗi sườn lên clk, dùng trạng thái trước sườn clock:
- Ghi thật khi
wr_en && !full: lưudinvào cuối hàng. - Đọc thật khi
rd_en && !empty:dout ←phần tử ở đầu hàng (phần tử cũ nhất), rồi bỏ nó khỏi hàng. doutgiữ nguyên khi không đọc thật (kể cả khird_en = 1lúc FIFO rỗng).- Có thể đọc và ghi thật trong cùng một chu kỳ. Khi rỗng thì chỉ ghi thật; khi đầy thì chỉ đọc thật, và lệnh ghi bị bỏ qua, không ghi đè.
counttăng/giảm theo số lần ghi/đọc thật.full = (count == 8),empty = (count == 0).- Reset: FIFO rỗng,
count = 0,dout = 0,full = 0,empty = 1.
Testbench đổi đầu vào ở sườn xuống và đọc mọi ngõ ra ở sườn xuống kế tiếp.
Ví dụ (case 1): ghi A1, B2, C3 rồi đọc ba lần. Sau mỗi lần đọc, dout lần lượt là A1, B2, C3 và count giảm 3 → 2 → 1 → 0.
Các case
- Ghi 3, đọc 3: đúng thứ tựmẫu
- Ghi tới đầy: full lên khi count = 8mẫu
Cùng 8 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.