FIFO first-word-fall-through trên SRAM đọc đồng bộ
Module cần viết: fifo_fwft · 6 case (2 mẫu) · giới hạn 4 s/case · ~60 phút
FIFO first-word-fall-through (FWFT, còn gọi là show-ahead) đưa phần tử đầu ra dout ngay khi có: empty = 0 nghĩa là dout đã hợp lệ, và rd_en chỉ là lệnh "đã dùng xong, đưa phần tử kế". Giao tiếp này khớp với valid/ready nên rất phổ biến. Khó ở chỗ bộ nhớ thật (SRAM, block RAM của FPGA) đọc đồng bộ: dữ liệu ra sau cạnh clock, không thể đọc tổ hợp.
Bộ nhớ đã cho sẵn (có trong môi trường chấm, không nộp lại):
module sram_1r1w #(parameter int W = 8, parameter int D = 4) (
input logic clk,
input logic we, input logic [$clog2(D)-1:0] waddr, input logic [W-1:0] wdata,
input logic re, input logic [$clog2(D)-1:0] raddr,
output logic [W-1:0] rdata // = m[raddr] sau cạnh lên có re = 1
);
// đọc và ghi cùng địa chỉ trong một nhịp: rdata là giá trị CŨ
Viết:
module fifo_fwft (
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,
output logic full,
input logic rd_en,
output logic [7:0] dout,
output logic empty
);
Yêu cầu:
- Dữ liệu phải lưu trong một
sram_1r1w #(.W(8), .D(4)). Ngoài SRAM chỉ được dùng tối đa 2 thanh ghi dữ liệu 8 bit. - Ghi khi
wr_en && !fulltại cạnh lên; lấy ra khird_en && !empty. Gọi n = số lần ghi − số lần lấy ra:full = (n == 4)chính xác. empty = 0thìdoutlà phần tử cũ nhất chưa lấy ra.- Một phần tử ghi ở cạnh k phải xuất hiện ở
dout(nếu nó là phần tử đầu) chậm nhất sau cạnh k + 2. - Khi
wr_en = rd_en = 1liên tục, FIFO phải lấy ra được ở mọi nhịp sau giai đoạn khởi động (thông lượng 1 phần tử/nhịp).
Testbench đổi đầu vào ở cạnh xuống và kiểm full, empty, dout 1 ns sau đó. Yêu cầu 1 không được testbench kiểm, nhưng là một phần của đề: lời giải dùng nhiều thanh ghi hơn thì chỉ đang tránh bài toán.
Các case
- Ghi một, đọc mộtmẫu
- Ghi ba rồi đọc hếtmẫ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à 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.