Sync FIFO: phân biệt request, acceptance và dữ liệu trả về
Tiên quyết
- Module A7: Hành vi & ngữ nghĩa mô phỏng: Đang tải
- Module A5: FSM: Đang tải
- RAM, ROM và LIFO: phần tử nhớ phải có hợp đồng đọc: Đang tải
Sau bài này bạn sẽ
- Định nghĩa accepted read/write ở empty/full và đồng thời
- Kiểm pointer wrap cho depth1 và depth không phải power-of-two
- Dùng queue oracle độc lập để bắt mất dữ liệu, đảo thứ tự và sai flags
Enables là yêu cầu, không phải sự kiện đã nhận
Wr_en1 khi FIFO full có thể không lưu gì. Rd_en1 khi empty không được đọc một word chưa hợp lệ. Muốn scoreboard đúng phải tính acceptance theo contract, không tăng/giảm expected size chỉ từ hai tín hiệu request. FIFO bài này dùng một clock cho cả hai phía. [1]
Output đăng ký, không bypass từ empty
Dout được cập nhật sau accepted read ở cạnh clock và giữ giá trị trước khi không read. Không có fall-through hoặc combinational bypass. Sau reset, count 0/empty 1/full 0/dout 0; array chưa bị xóa. Vì vậy dữ liệu mới viết vào empty không tự xuất hiện ở dout ngay cùng request.
Hai phương trình acceptance làm rõ ưu tiên
Take_read là rd_en và không empty. Take_write là wr_en và (không full hoặc take_read). Tại full, một read hợp lệ giải phóng chỗ cho write trong cùng cạnh. Tại empty, read chưa hợp lệ nên both request chỉ nhận write. Các chính sách khác có thể đúng ở thiết kế khác, nhưng expected phải đổi theo yêu cầu trước khi đổi RTL.
Full replacement phải trả head cũ
Khi full và cả hai request cùng 1, read trả word cũ ở head, write đưa din vào tail, count giữ nguyên. Với depth 1, hai địa chỉ trùng nhau; NBA đọc RHS cũ trước write giúp giữ đúng word cần pop trong RTL này. Đây cũng là ca dễ lộ khác biệt primitive read-during-write, cần kiểm lại nếu đổi mapping.
Depth 3 không được wrap theo modulo 4
Pointer width đủ biểu diễn địa chỉ nhưng mã nhị phân tối đa chưa chắc là địa chỉ cuối. RTL so với DEPTH-1 để quay về 0; không dựa riêng vào overflow của vector. Depth 1 dùng width tối thiểu 1, không tạo range âm khi clog2(1)=0. Count cần biểu diễn cả capacity nên suy ra từ DEPTH+1. Không override PW/CW trái các ràng buộc ấy.
Queue dịch khác cấu trúc ring buffer DUT
Reference model lưu head ở phần tử 0 và dịch sau pop, không sao lại wr_ptr/rd_ptr. Khi nhận cả hai, model pop trước rồi append vào size mới. Nhờ vậy lỗi wrap hoặc read/write address không tự được lặp lại nguyên trong oracle. Mỗi cạnh so count, full, empty và dout bằng dữ liệu expected, kể cả khi không có read.
Dung lượng dùng được không tự là depth-1
Nguồn tham khảo có thiết kế phân biệt full/empty bằng pointer và để trống một slot. Thiết kế count-based của bài dùng đủ DEPTH slot. Không trộn hai cách định nghĩa rồi sửa expected cho hợp snapshot. Generic synth mặc định depth 4 có 27 FF/0 latch; chưa claim RAM primitive, MTBF hoặc mọi interleaving bằng formal. [2]
Ba cấu hình,1536 cycle-configuration
Trước chạy, directed prefix bảo đảm mỗi depth gặp overflow reject, underflow reject và full replacement. Sau đó các command/data biến thiên tiếp tục qua 512 cycle cho mỗi depth 4/3/1.
TB có watchdog, kiểm đủ cờ boundary đã gặp, và queue oracle so dữ liệu từng cạnh. Depth 3 và 1 là biên thiết kế, không chỉ tăng số seed của depth 4. [3]
Tự kiểm tra
Chốt chính sách biên trước khi kiểm throughput
Ghi rõ accepted operation, latency, output hold, capacity, reset và replacement. Một FIFO không mất dữ liệu phải đúng cả thứ tự và điều kiện nhận, không chỉ count cuối. Bài giữ draft/LRM needs-spec-check.
Nguồn và mức độ đối chiếu
- Synchronous FIFO — bản chụp trong resources.zip, Khái niệm sync FIFO. Trích dẫn; nguồn đã đọc các mục liên quan.
- Thí nghiệm nguyên bản ex.a8.fifo, Phạm vi mô hình. Trích dẫn; nguồn đã đọc toàn văn.
- Thí nghiệm nguyên bản ex.a8.fifo, Bằng chứng. Trích dẫn; nguồn đã đọc toàn văn.
- IEEE 1800-2023 SystemVerilog LRM, fifo semantics. Chưa đối chiếu với văn bản nguồn (chưa mở).
- Thí nghiệm nguyên bản ex.a8.fifo, Code, metadata, self-checks và verification.json. Trích dẫn; nguồn đã đọc toàn văn.
- IEEE 1800-2023 SystemVerilog LRM, fifo RTL/simulation semantics. Chưa đối chiếu với văn bản nguồn (chưa mở).
- Synchronous FIFO — bản chụp trong resources.zip, What is a synchronous FIFO?; What are the main IO ports?; How does it work?. Trích dẫn; nguồn đã đọc các mục liên quan.
- Thí nghiệm nguyên bản ex.a8.fifo, Source, assertions, metadata và verification.json. Trích dẫn; nguồn đã đọc toàn văn.