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の説明であり、取得したハードウェア波形ではありません。
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を低くし、out_validとAを保持します。生成側はin_validとBを保持します。安定した項目は後で正確に1回転送できます。