9 / 24 · 概念
パイプラインの境界でトランザクション全体を保持する
valid、タグ、ビット幅の対応を保ちながら、加算と定数倍を分割します。
レッスンは無料で読めます。受講登録すると進捗を保存できます。
レジスタの境界はビットとともに意味を運ぶ
f(a,b)=3(a+b)を2段に分割します。第1段は符号なし8ビットのオペランド2個の和を9ビットで保持します。第2段は11ビットの定数倍した値を作り、その下位8ビットを保持します。広い幅での最大結果は1530です。この整数式では中間の和を縮小しても最終的な256を法とする値は偶然保たれますが、オーバーフローの報告や後の比較に必要な情報は失われます。中間値の幅を明示してください。
各段はデータとともにvalidとタグを保持します。validがゼロならバブルです。空の段に古いデータのビットが残っていても、それをトランザクションとして数えてはいけません。タグには値と同じレジスタ遅延が必要です。データ用レジスタが2個なのにタグ用が1個だけだと、トランザクションAの結果にBの識別情報が付いてしまいます。
このコアはストールがなく、ポートが常にreadyであることを前提とします。乗算の前にs1を拡張し、定数の幅も指定します。第2段は更新前のs1とt1を読むため、新しい入力が1つのエッジで両レジスタを通過することはありません。
logic [8:0] s1;
logic [7:0] s2, t1, t2;
logic v1, v2;
logic [10:0] scaled;
assign scaled = {2'b00, s1} * 11'd3;
always_ff @(posedge clk) begin
if (rst) begin
v1 <= 1'b0;
v2 <= 1'b0;
end else begin
v1 <= in_valid;
v2 <= v1;
if (in_valid) begin
s1 <= {1'b0, a} + {1'b0, b};
t1 <= in_tag;
end
if (v1) begin
s2 <= scaled[7:0];
t2 <= t1;
end
end
endエッジ0でA=(1,2)を受け入れると、その後s1=3になります。エッジ1でB=(250,10)を受け入れると、s1は260になり、s2にはAの結果9が格納されます。Aはエッジ1の後に有効になり、エッジ2で転送できます。Bは後に780を256を法として縮小した12を出力します。
バブルもvalidレジスタを通して移動させます。入力がないのに古いv1=1を保持すると、トランザクションを重複させる可能性があります。リセットはvalid状態をクリアし、古いデータが新しい結果にならないようにします。各境界で、演算、タグ、例外、アドレス、パケット終端マーカなど、付随するすべてのフィールドを列挙してください。これらがパイプライン全体で1つのトランザクションとして保たれることを検査します。
自分で考えてみましょう
A=(1,2,tag=10)とB=(250,10,tag=11)を連続して受け入れます。t2<=in_tagを使うと、Aの結果にはどのタグが付きますか。正しい接続を示してください。
解説を見る
エッジ1でs2は古いトランザクションAを計算しますが、現在のin_tagは11なので、結果9にタグ11が付きます。t2<=t1を使い、Aの第1段にある更新前のタグ10を取り込みます。