RAM, ROM và LIFO: phần tử nhớ phải có hợp đồng đọc
Tiên quyết
Sau bài này bạn sẽ
- Định nghĩa latency và read-during-write của RAM thay vì đoán theo tên
- Phân biệt ROM chọn dữ liệu hằng với state stack
- Kiểm biên full/empty và độ rộng địa chỉ khi LIFO đạt capacity
Một array không cho biết mọi hành vi memory
Khai báo mem 4 x 4 chỉ cho biết hình dạng dữ liệu. Nó chưa trả lời đọc tổ hợp hay đăng ký, giá trị khi đọc lúc ghi cùng địa chỉ, reset xóa những gì, hoặc target dùng FF hay SRAM macro. Bài tách RAM, ROM và stack để các câu hỏi ấy có contract cụ thể.
Depth, width và loại port
RAM có 4 word, mỗi word 4 bit; địa chỉ 2 bit chọn 0..3. Chỉ một địa chỉ chung được dùng cho đọc/ghi trong ví dụ. Không suy từ chữ single-port rằng mọi primitive đều có cùng hành vi read-during-write hoặc cùng kiểu data bus. Nguồn đào tạo dùng một giao diện khác; code dự án dùng input/output tách để tập trung vào semantics. [1]
Đọc đăng ký và initialization có chủ ý
Ở mỗi posedge, q lấy mem[addr] của lần đọc; write enable quyết định có ghi word hay không. Array không bị reset hàng loạt. TB chủ động ghi cả 4 địa chỉ trước khi dùng nội dung đã biết, và dùng Icarus để xác nhận các lần đọc word chưa khởi tạo vẫn X. Reset một output hoặc pointer không tự chứng minh memory đã được xóa.
Cùng địa chỉ ghi, output cũ hay mới?
Hai NBA trong cùng process của RAM lấy RHS trước khi cập nhật array: overwrite địa chỉ 2 từ 7 thành 14, q của cạnh ghi vẫn 7; lần đọc sau mới 14. Đây là old-data/read-first của RTL đang xét. Nếu mapping sang memory primitive, mode hỗ trợ và collision behavior phải được đối chiếu; không suy mọi FPGA/ASIC sẽ giữ cùng mode chỉ vì RTL simulation pass.
ROM hằng chưa có state cập nhật
ROM nhỏ chọn 2/7/1/f theo bốn địa chỉ nhị phân, được mô tả bằng case đầy đủ. Test kiểm cả 4 entry. Generic synthesis không cần FF/latch cho bảng hằng này; nhưng chưa có claim đã dùng đúng một block ROM vật lý. Cũng không claim mọi địa chỉ X/Z được xử lý như một mạch có thể phát hiện unknown ngoài silicon.
LIFO trả item mới nhất trước
Stack chứa tối đa 4 nibble. Push A/B/C/D, sau đó pop phải cho D/C/B/A. Count biểu diễn 0..4, nên cần 3 bit dù địa chỉ array chỉ 2 bit. Khi full, push bị chặn; khi empty, pop bị chặn và popped giữ kết quả trước. Cả push và pop cùng 1 được contract bài này định nghĩa là không làm gì; không mặc định mọi LIFO có chính sách đó. [2]
Ngữ cảnh biểu thức địa chỉ có thể làm lộ lỗi ở full
Prototype ban đầu dùng trực tiếp count[1: 0]-2'd1 làm index. Khi count 4, pop đọc X thay vì D. Probe riêng in biểu thức có 2 bit/giá trị 11 nhưng read array trực tiếp vẫn X, trong khi qua wire 2 bit cho D. Bản sửa khai báo top_index2 bit rõ ràng rồi dùng nó cho array; không đổi expected hoặc chấp nhận X. Không dùng kết quả bits ở một context để mặc định mọi context khác có cùng sizing; quy tắc đầy đủ vẫn needs-spec-check.
Kiểm RAM, ROM và 14 ca stack
Expected tính trước gồm RAM 5/6/7/8, overwrite old 7/new 14; ROM 2/7/1/15; stack 14 check có full reject, empty reject, simultaneous ignore, thứ tự D/C/B/A và reset cuối 0.
Yosys generic kiểm RAM 20 FF (16 data+4 output), ROM 0 FF/0 latch và LIFO 23 FF (16 data+3 count+4 output). Đây không phải số macro SRAM/BRAM hoặc target area. [3]
Tự kiểm tra
Viết bảng cycle trước khi chọn primitive
Ghi latency, collision mode, reset, số entry hợp lệ và chính sách biên. Dùng dữ liệu khác nhau để bắt nhầm thứ tự, kiểm đủ địa chỉ nhỏ và đối chiếu mapping khi có target. Bài giữ draft/LRM needs-spec-check.
Nguồn và mức độ đối chiếu
- Verilog Single Port RAM — bản chụp trong resources.zip, Depth và width. Trích dẫn; nguồn đã đọc các mục liên quan.
- Verilog Stack or LIFO — bản chụp trong resources.zip, LIFO operations. Trích dẫn; nguồn đã đọc các mục liên quan.
- Thí nghiệm nguyên bản ex.a8.memories, Bằng chứng. Trích dẫn; nguồn đã đọc toàn văn.
- IEEE 1800-2023 SystemVerilog LRM, memories 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.memories, Code, metadata, self-checks và verification.json. Trích dẫn; nguồn đã đọc toàn văn.
- IEEE 1800-2023 SystemVerilog LRM, memories RTL/simulation semantics. Chưa đối chiếu với văn bản nguồn (chưa mở).
- Verilog Single Port RAM — bản chụp trong resources.zip, What is a single port RAM?. Trích dẫn; nguồn đã đọc các mục liên quan.
- Verilog Stack or LIFO — bản chụp trong resources.zip, What is a stack or LIFO?; 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.memories, Source, assertions, metadata và verification.json. Trích dẫn; nguồn đã đọc toàn văn.