14 / 24 · 概念
Ready/valid 與停頓狀態
輸出級在 out_ready=0 時保持 A,輸入 B 同時有效。下一個邊緣,該級與產生端必須如何處理?
單元可免費閱讀,註冊課程即可儲存學習進度。
只在傳輸時前進
產生端在當前項目可用時宣告 valid。消費端能接受該項目時宣告 ready。兩者皆成立的上升緣,發生一次傳輸。只有這時才推進像素座標、行緩衝器狀態與相關累加輸入。只依 valid 前進,會在消費端暫停時遺失資料;只依 ready 前進,則計入不存在的輸入。
valid 為高、ready 為低時,保持相同資料與 valid。若要在輸出阻塞時繼續接受輸入,必須提供儲存空間,並由剩餘容量推導 ready。範例 RTL 是單項級:空的時候,或當前項目可離開時,接受新項目。
傳輸順序範例
週期零到四,valid=[0,1,1,1,1]、ready=[0,1,0,1,1] 產生 fire=[0,1,0,1,1]。五個時脈接受三個像素。週期二停頓的項目保持到週期三。寬度四的列計數器尚未完成第一列。若計算時脈而非傳輸,之後所有視窗座標都會偏移。
若該級保持 A,out_valid 為高、out_ready 為低,in_ready 便為低,A 保持儲存。out_ready 變高時,可在同一邊緣送出 A 並接受 B。沒有替換輸入時,清除輸出 valid。記錄是否允許同時替換,以及其延遲意義。
重設除了資料,也清除有效性。新影格需要明確的座標與視窗 valid 重設。接收最後輸入不同於消費最後輸出;過早宣告 done,可能讓新影格覆寫尚未完成的工作。
程式是傳輸級,不是完整卷積引擎。若已安裝工作流程支援 SystemVerilog 編輯與模擬,可手動建立檔案,測試暫停下的穩定與同時替換。此處不宣稱 RTL 模擬器已執行。圖示展示 fire,並非擷取的硬體追蹤。
module sample_stage (
input logic clk, reset,
input logic in_valid,
output logic in_ready,
input logic signed [7:0] in_data,
output logic out_valid,
input logic out_ready,
output logic signed [7:0] out_data
);
assign in_ready = !out_valid || out_ready;
always_ff @(posedge clk) begin
if (reset) begin
out_valid <= 1'b0;
out_data <= '0;
end else if (in_ready) begin
out_valid <= in_valid;
if (in_valid) out_data <= in_data;
end
end
endmodule查看波形資料
| 訊號 | 波形 | 匯流排值 |
|---|---|---|
| clock | p.... | |
| valid | 01111 | |
| ready | 01011 | |
| fire | 01011 |
自己試試看
輸出級在 out_ready=0 時保持 A,輸入 B 同時有效。下一個邊緣,該級與產生端必須如何處理?
查看解說
該級將 in_ready 拉低,並保持 A 與 out_valid。產生端保持 B 與 in_valid。穩定的項目之後可恰好傳輸一次。