30 / 37 · 概念
Ready/valid と 1 要素のエラスティックバッファ
停止可能なデータパスで、欠落や重複のない転送条件と同時入出力を設計する。
レッスンは無料で読めます。受講登録すると進捗を保存できます。
valid と ready が同じエッジで 1 なら転送する
送信側は有効なデータを出すときに valid を 1 とし、受信側は受け取れるときに ready を 1 とする。クロックエッジで二つの信号を同時にサンプリングして、転送の有無を決定する。
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 の遅延をモデル化してはいない。
波形データを表示
| 信号 | 波形 | バスの値 |
|---|---|---|
| clk | p..... | |
| valid | 01...0 | |
| ready | 10.1.. | |
| transfer | 0..1.0 | |
| data | x3..4x | A → B |
valid が複数サイクルにわたって 1 でも、転送が一度だけとは限らない。ready も 1 であるエッジごとに、別の転送が起こる。
1 項目を保持するバッファを作る
バッファが空か、現在のデータを今回のエッジで送り出せるなら、新しいデータを受け取る余地がある。
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_ready | in_valid | エッジでの動作 |
|---|---|---|---|
| 空 | 0 または 1 | 1 | 入力を格納し valid=1 |
| 満杯 | 0 | 0 または 1 | 現在のデータと valid を保持 |
| 満杯 | 1 | 0 | 出力を渡して空にする |
| 満杯 | 1 | 1 | 以前の出力を渡し、新しい入力を同時に格納 |
最後の行により、一度満たされた後は毎サイクル 1 項目を処理できる。遅延があるからといって、スループットスループット 単位時間に受け入れる、または完了する処理の数です。パイプラインは個々の処理の遅延を短くしなくても、スループットを高められます。 詳しく見るまで半分になるわけではない。
データ順序を検証するモデル
参照モデルには最大長 1 のキューを使う。各エッジの以前の値から出力転送と入力受け付けを判断し、出力があればキューの先頭と比較してから、新しい入力を末尾へ追加する。同じエッジで dequeue と enqueue の両方が可能なので、順序を明確にする。
この不変条件は、reset で記録を再開した区間内で成り立つ。さらに、stall 中のデータの安定、転送順序の保持、同じデータを二度渡さないことを検査する。個数の不変条件だけでは、データ値の正しさまでは検証できない。
複数のバッファの ready を組み合わせ回路で長くつなぐと、逆方向のタイミング経路が長くなる。構造を接続するときは、組み合わせループがないかも確認する。
自分で考えてみましょう
バッファは 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 となるエッジで起こる。