Altifigence Academy

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つのエッジで両レジスタを通過することはありません。

SystemVerilog
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を取り込みます。

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