14 / 24 · 概念
1スロットの弾力的レジスタを設計する
空のスロットへ受け入れるか、同時に消費される項目を置き換えます。
レッスンは無料で読めます。受講登録すると進捗を保存できます。
利用可能な記憶領域からreadyを導く
1スロットのバッファはfullビットとペイロードレジスタを持ちます。空なら、受け取り側がストールしていても入力を受け入れられます。満杯なら、そのエッジで受け取り側が現在の出力を消費する場合に置き換えを受け入れられます。したがって入力readyは!full OR output-ready、出力validはfullです。このレジスタ付きバッファに組み合わせのデータ直通はありません。
入力readyが高ければ、次のfullは入力validに等しくなります。入力があればペイロードを取り込み、なければ空にします。入力readyが低ければfullとペイロードを保持します。出力が転送されたというだけでfullをクリアすると、同時の置き換えを失います。入力validだけで取り込むと、満杯でストールしたスロットを上書きします。
module elastic_byte (
input logic clk, rst,
input logic in_valid,
output logic in_ready,
input logic [7:0] in_data, in_tag,
output logic out_valid,
input logic out_ready,
output logic [7:0] out_data, out_tag
);
logic full;
assign in_ready = !full || out_ready;
assign out_valid = full;
always_ff @(posedge clk) begin
if (rst) full <= 1'b0;
else if (in_ready) begin
full <= in_valid;
if (in_valid) begin
out_data <= in_data;
out_tag <= in_tag;
end
end
end
endmodule| 更新前のfull | out-ready | in-valid | 動作 |
|---|---|---|---|
| 0 | 0 | 1 | 入力を格納 |
| 1 | 0 | 1 | 入力を拒否し、出力を保持 |
| 1 | 1 | 1 | 古い項目を引き渡し、置き換えを格納 |
| 1 | 1 | 0 | 古い項目を引き渡し、スロットを空にする |
エッジ0でtag0,y9を格納し、エッジ1でストールします。エッジ2でtag0を消費し、tag1,y12を格納します。スロットは満杯のままです。エッジ3でtag1を消費し、入力がなければ空にします。置き換えにより毎サイクル1トランザクションが可能です。
多段接続は逆方向の組み合わせready経路を作ります。readyをレジスタ化する場合、ストール通知が有効になる前の到着分のために追加記憶領域が必要です。バス固有の組み合わせ経路制限は別に確認してください。ペイロード幅に関係なく、データとすべての付随フィールドを同じ条件で格納し、4つの更新ケースすべてを検証します。
自分で考えてみましょう
full=1、out-ready=1、in-valid=1のエッジで、tag7を消費しtag8を提示します。次のfullとout-tagは何ですか。消費時に必ずfullをクリアすると何が起きますか。
解説を見る
入力readyが高いのでtag8を格納し、full=1を維持します。Out-tagは8になります。常にfullをクリアすると、受け入れたtag8を失います。