Vừa

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

fifocorner-casethroughputtrap

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 wdata vào cuối, bỏ phần tử đầu. count cậ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

  1. Ghi 2, đọc 2mẫu
  2. Đầ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.

Đang kết nối máy chấm…
Đang nạp bản nháp…

Tab để thụt lề. Nhấn Esc rồi Tab để rời trình soạn. Bản nháp tự lưu trong trình duyệt.

Gợi ý

Mỗi gợi ý mở trước khi AC giảm 10% điểm của đề.

Lời giải và phân tích

Lịch sử nộp bài

Chưa có lượt nào.

Độ khó: Vừa. Điểm gốc 40.