Altifigence Academy

14 / 24 · 概念

Ready/validとストール中の状態

out_ready=0で出力段がAを保持し、入力Bが有効です。次のエッジで段と生成側は何をしますか。

転送でだけ進める

生成側は現在の項目が利用可能ならvalidを上げ、消費側は受け入れ可能ならreadyを上げます。両方がアサートされた立ち上がりエッジで1転送です。そのときだけ画素座標、ラインバッファ状態、対応する累積入力を進めます。validだけで進めると消費側の停止中にデータを失い、readyだけで進めると存在しない入力を数えます。

validが高くreadyが低い間、同じデータとvalidを保持します。出力がブロック中も入力を受け入れるには、記憶領域を用意し、残容量からreadyを導きます。RTL例は1項目の段で、空または現在の項目が出られるとき新しい項目を受け入れます。

転送順の計算例

サイクル0から4でvalid=[0,1,1,1,1]、ready=[0,1,0,1,1]ならfire=[0,1,0,1,1]です。5クロックで3画素を受け入れます。サイクル2でストールした項目は3まで残ります。幅4の行カウンタはまだ最初の行を完了していません。転送でなくクロックを数えると、その後の全ウィンドウ座標がずれます。

段が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 はクロック 1 周期を表します。
信号波形バスの値
clockp....
valid01111
ready01011
fire01011

自分で考えてみましょう

out_ready=0で出力段がAを保持し、入力Bが有効です。次のエッジで段と生成側は何をしますか。

解説を見る

段はin_readyを低くし、out_validとAを保持します。生成側はin_validとBを保持します。安定した項目は後で正確に1回転送できます。

選択はこのブラウザに適用されます。フッターからいつでも変更できます。