Altifigence Academy

30 / 37 · 概念

Ready/valid 與單格彈性緩衝區

在可暫停資料路徑中設計無遺失、無重複的傳遞條件與同時輸入輸出。

Valid 與 ready 在同一邊緣為 1 才傳送

傳送端有有效資料時設 valid=1,接收端能接收時設 ready=1。是否傳送,由時脈邊緣同時取樣兩訊號決定。

transferk=validk∧readyk\mathrm{transfer}_k=\mathrm{valid}_k\land\mathrm{ready}_k

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 延遲。

Ready/valid:等待與連續傳輸
查看波形資料
波形資料:每個字元表示一個區間;句點保持先前狀態;p 表示一個時脈週期。
訊號波形匯流排值
clkp.....
valid01...0
ready10.1..
傳輸0..1.0
datax3..4xA → B

Valid 連續多週期為 1,不表示只傳一次。Ready 也為 1 的每個邊緣,都是獨立傳送。

建立可存一筆的緩衝區

若緩衝為空,或目前資料可在此邊緣送出,就有空間接新資料。

in_ready=¬out_valid∨out_ready\mathrm{in\_ready}=\neg\mathrm{out\_valid}\lor\mathrm{out\_ready}
SystemVerilog
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_readyin_valid邊緣動作
空0 或 11儲存輸入,valid=1
滿00 或 1保持目前資料與 valid
滿10送出輸出並清空
滿11同時傳舊輸出、存新輸入

因最後一列,填滿後可每週期處理一筆。有延遲不代表吞吐量吞吐量是單位時間內可接受或完成的作業數。管線即使不縮短單筆作業的延遲,也能提高吞吐量。 詳細內容也減半。

驗證資料順序的模型

參考模型用長度最多一的佇列。每邊緣依舊值判斷輸出傳送與輸入接受;有輸出先與頭部比較,再把新輸入加尾。Dequeue、enqueue 可同邊緣發生,須明確規定順序。

0≤Naccepted−Ndelivered≤10\le N_{\mathrm{accepted}}-N_{\mathrm{delivered}}\le1

上述不變量成立於 reset 後重新開始計數的區間。另需檢查 stall 時資料穩定、傳遞順序保留、同一資料不重複傳送。只有數量不變量,不能驗證資料值正確。

多個緩衝的 ready 若組合串接過長,反向時序路徑會變長。連接結構時也要檢查是否形成組合迴路。

延伸閱讀:AMD UG934 — READY/VALID Handshake

自己試試看

緩衝區已滿且存 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 的邊緣才輸出傳送。

此選擇適用於本瀏覽器,隨時可從頁尾變更。