Altifigence Academy

30 / 37 · 概念

Ready/valid と 1 要素のエラスティックバッファ

停止可能なデータパスで、欠落や重複のない転送条件と同時入出力を設計する。

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ハンドシェイク 送信側の valid と受信側の ready が同じエッジでともに 1 のときに転送を確定する取り決めです。待機中のデータ保持規則も含みます。 自体は CDC を解決しない。

待機したデータを一度だけ転送する

以下の列は順にサンプリングサイクル 0~5 を表す。信号値は、対応する立ち上がりエッジ立上りエッジ クロックが 0 から 1 に変わる瞬間です。CLK=1 の区間全体を指すレベルとは区別します。 詳しく見る直前の値として読む。A が待機するサイクル 1・2 では valid=1、ready=0 なので、データと valid を保持する。エッジ 3 で A、エッジ 4 で B を受け付ける。クロックと信号線の整列は契約を説明する図であり、setupセットアップ 取り込みクロックエッジの前に、入力データが安定していなければならない最小時間です。違反すると記憶結果を保証できません。 詳しく見る/hold の遅延をモデル化してはいない。

Ready/valid・待機と連続転送
波形データを表示
波形データ:各文字は一つの区間、ドットは前の状態の保持、p はクロック 1 周期を表します。
信号波形バスの値
clkp.....
valid01...0
ready10.1..
transfer0..1.0
datax3..4xA → B

valid が複数サイクルにわたって 1 でも、転送が一度だけとは限らない。ready も 1 であるエッジごとに、別の転送が起こる。

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 が更新される。組み合わせバイパスはないため、その新しい値を同じエッジで出力転送したとは数えない。reset 中は転送を数えず、out_valid=0 のときの out_data は意味を持たない。そのため、データレジスタレジスタ 複数ビットの状態を記憶する回路です。このコースの同期式レジスタは、クロックエッジで定められた入力を記憶します。 詳しく見る自体を必ずリセットリセット 状態を仕様で定めた初期値に戻す制御です。同期式か非同期式か、他の制御より優先されるかを合わせて定めます。 詳しく見るする必要はない。

満杯でも入れ替えられる

エッジ直前の状態out_readyin_validエッジでの動作
空0 または 11入力を格納し valid=1
満杯00 または 1現在のデータと valid を保持
満杯10出力を渡して空にする
満杯11以前の出力を渡し、新しい入力を同時に格納

最後の行により、一度満たされた後は毎サイクル 1 項目を処理できる。遅延があるからといって、スループットスループット 単位時間に受け入れる、または完了する処理の数です。パイプラインは個々の処理の遅延を短くしなくても、スループットを高められます。 詳しく見るまで半分になるわけではない。

データ順序を検証するモデル

参照モデルには最大長 1 のキューを使う。各エッジの以前の値から出力転送と入力受け付けを判断し、出力があればキューの先頭と比較してから、新しい入力を末尾へ追加する。同じエッジで 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 となるエッジで起こる。

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