7 / 24 · 概念
記憶體請求與回應的時序契約
區分同步讀取、延遲標籤與同位址衝突。
單元可免費閱讀,註冊課程即可儲存學習進度。
記憶體不只是大型暫存器陣列
記憶體介面除了容量,也需要時序契約。非同步讀取會在位址改變時改變組合輸出。同步讀取則在邊緣取樣位址,然後改變輸出。兩種模型需要不同排程。能否推導為裝置的記憶體資源,也取決於撰寫方式與目標工具。這裡指定十六筆八位元項目,並採用同步讀取。
在邊緣 k 取樣位址與標籤。對應資料與延遲後的標籤會在該邊緣之後出現;第一次可消費它們的時機是邊緣 k+1。一週期讀取並不表示立即的組合回應。回應 valid 必須經過相同延遲。將延遲值與當前輸入標籤組合,會破壞連續請求的對應關係。
logic [7:0] mem [0:15];
logic [7:0] rd_data;
logic [3:0] rd_tag;
logic rd_valid;
always_ff @(posedge clk) begin
if (wr_en) mem[wr_addr] <= wr_data;
rd_valid <= req_valid;
if (req_valid) begin
rd_data <= mem[req_addr];
rd_tag <= req_tag;
end
if (rst) rd_valid <= 1'b0;
end在此行為模型中,同時讀寫同一個位址會傳回舊值,因為非阻塞賦值讀取舊狀態。實際記憶體原語有明確的衝突模式與限制;請參閱 AMD UG901 的讀寫模式,並依目標與合成結果驗證所需模式。重設 valid 並不會初始化陣列。
| 邊緣 | 接受的請求 | 效果 |
|---|---|---|
| 2 | addr=3,tag=7 | 擷取舊 mem[3]=42 |
| 3 | addr=4,tag=8 | 消費 42,7 並擷取下一個值 |
| 4 | 無請求 | 清除回應 valid |
此排程假設消費端永遠不會停頓。若它在邊緣 3 停頓,下一筆回應就可能覆寫 rd_data。應增加回應儲存空間,或根據可用容量限制請求,容量計算也必須包含已在途的回應。檢查數值前,明確初始化測試記憶體。除了回應資料,也要驗證位址與標籤的對應關係;正確的值若連到錯誤的請求,仍然是失敗。
自己試試看
mem[3]=42 時,在同一個邊緣讀取位址 3 並寫入 99。此模型會將什麼值放入 rd_data?新的記憶體值是多少?輸出停頓需要哪些機制?
查看解說
rd_data 變為 42,而 mem[3] 變為 99。兩個賦值都讀取舊狀態。停頓需要回應儲存空間,以及計入在途回應的請求准入控制。應另行驗證實際目標記憶體的衝突模式。
✓ 已學習