Altifigence Academy

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,並非擷取的硬體追蹤。

SystemVerilog
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
暫停下被接受的傳輸
查看波形資料
波形資料:每個字元表示一個區間;句點保持先前狀態;p 表示一個時脈週期。
訊號波形匯流排值
clockp....
valid01111
ready01011
fire01011

自己試試看

輸出級在 out_ready=0 時保持 A,輸入 B 同時有效。下一個邊緣,該級與產生端必須如何處理?

查看解說

該級將 in_ready 拉低,並保持 A 與 out_valid。產生端保持 B 與 in_valid。穩定的項目之後可恰好傳輸一次。

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