30 / 37 · 概念
Ready/valid 與單格彈性緩衝區
在可暫停資料路徑中設計無遺失、無重複的傳遞條件與同時輸入輸出。
單元可免費閱讀,註冊課程即可儲存學習進度。
Valid 與 ready 在同一邊緣為 1 才傳送
傳送端有有效資料時設 valid=1,接收端能接收時設 ready=1。是否傳送,由時脈邊緣同時取樣兩訊號決定。
Valid=1、ready=0 期間,傳送端必須保持 valid 與資料。若等 ready 升高才提出 valid,依對方規則可能形成死鎖。此處假設所有訊號同一時脈域;ready/valid交握(handshake)規定傳送端的 valid 與接收端的 ready 在同一邊緣皆為 1 時,才確定完成傳輸。等待期間如何保持資料也是契約的一部分。 本身不解決 CDC。
等待的資料只傳一次
下方欄依序為第 0~5 個取樣週期,訊號讀作對應上升緣上升緣是時脈由 0 變成 1 的瞬間。它與表示整段 CLK=1 期間的高準位不同。 詳細內容前的值。A 等待的第 1、2 週期 valid=1、ready=0,所以資料與 valid 保持。第 3 邊緣接受 A,第 4 邊緣接受 B。線條對齊只說明契約,不模擬 setup建立時間(setup)是輸入資料在時脈擷取邊緣之前,必須保持穩定的最短時間。若違反此條件,便無法保證儲存結果。 詳細內容/hold 延遲。
查看波形資料
| 訊號 | 波形 | 匯流排值 |
|---|---|---|
| clk | p..... | |
| valid | 01...0 | |
| ready | 10.1.. | |
| 傳輸 | 0..1.0 | |
| data | x3..4x | A → B |
Valid 連續多週期為 1,不表示只傳一次。Ready 也為 1 的每個邊緣,都是獨立傳送。
建立可存一筆的緩衝區
若緩衝為空,或目前資料可在此邊緣送出,就有空間接新資料。
module elastic_buffer (
input logic clk,
input logic rst,
input logic in_valid,
output logic in_ready,
input logic [7:0] in_data,
output logic out_valid,
input logic out_ready,
output logic [7:0] out_data
);
assign in_ready = !out_valid || out_ready;
always_ff @(posedge clk) begin
if (rst) begin
out_valid <= 1'b0;
end else if (in_ready) begin
out_valid <= in_valid;
if (in_valid) out_data <= in_data;
end
end
endmodule空緩衝接受輸入後,out_valid、out_data 在邊緣後更新。沒有組合 bypass,因此不能把新值計為同邊緣已輸出傳送。Reset 期間不計傳送,out_valid=0 時 out_data 無意義,所以不一定要重設重設將狀態回復至規格指定的初始值。必須一併定義它是同步或非同步,以及是否優先於其他控制訊號。 詳細內容資料暫存器暫存器儲存多個位元的狀態。本課程中的同步暫存器會在時脈邊緣儲存指定的輸入。 詳細內容本身。
已滿時也能替換
| 邊緣前狀態 | out_ready | in_valid | 邊緣動作 |
|---|---|---|---|
| 空 | 0 或 1 | 1 | 儲存輸入,valid=1 |
| 滿 | 0 | 0 或 1 | 保持目前資料與 valid |
| 滿 | 1 | 0 | 送出輸出並清空 |
| 滿 | 1 | 1 | 同時傳舊輸出、存新輸入 |
因最後一列,填滿後可每週期處理一筆。有延遲不代表吞吐量吞吐量是單位時間內可接受或完成的作業數。管線即使不縮短單筆作業的延遲,也能提高吞吐量。 詳細內容也減半。
驗證資料順序的模型
參考模型用長度最多一的佇列。每邊緣依舊值判斷輸出傳送與輸入接受;有輸出先與頭部比較,再把新輸入加尾。Dequeue、enqueue 可同邊緣發生,須明確規定順序。
上述不變量成立於 reset 後重新開始計數的區間。另需檢查 stall 時資料穩定、傳遞順序保留、同一資料不重複傳送。只有數量不變量,不能驗證資料值正確。
多個緩衝的 ready 若組合串接過長,反向時序路徑會變長。連接結構時也要檢查是否形成組合迴路。
自己試試看
緩衝區已滿且存 A,新輸入 B 的 in_valid=1。第一邊緣 out_ready=0,下一邊緣 out_ready=1,各邊緣如何處理 A、B?傳送端需保持 B 到何時?
查看解說
第一邊緣 in_ready=0,A 保持、B 未被接受,傳送端須保持 B 與 in_valid=1。下一邊緣 in_ready=1,傳出 A 同時存 B。該邊緣後緩衝輸出為 B,但不表示 B 已傳出;B 要到之後 out_valid、out_ready 同為 1 的邊緣才輸出傳送。