FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

BOOM (Berkeley Out-of-Order Machine) のマイクロアーキテクチャドキュメントを読む (6)

RISC-VのアウトオブオーダコアであるBOOM (Berkely Out-of-Order Machine) について勉強を進めている。以下のドキュメントを日本語に訳しながら読んでいくことにした。

docs.boom-core.org


デコードステージ

デコード ステージは、フェッチバッファから命令を受け取り、デコードし、各命令に必要なリソースを割り当てます。 デコード ステージは、すべてのリソースが利用可能でない場合、必要に応じてストールします。

RVCの変更

RVCのデコードは、Rocketの RVCExpander を使ってRVC命令を展開することで行われます。 これは デコード ステージの通常の機能を変更するものではありません。

リネームステージ

リネーム ステージでは、各命令の ISA (または 論理 )レジスタ指定子を 物理 レジスタ指定子にマッピングします。

リネームの目的

リネーム は、命令の ISA (または 論理 )レジスタ指定子を、 新しい 物理 レジスタの空間にマッピングすることで、名前を変更する技術です。 レジスタリネームの目的は、命令間の出力依存性(WAW)と逆依存性(WAR)を断ち切り、 真の依存性(RAW)だけを残すことです。 これは、a) 指定子として使用できるISAレジスタの数が限られていること、 b)ループはその性質上、ループの反復ごとに同じレジスタ指定子を使用する、ということに対して効果があります。

明示的なリネームのデザイン

PRF vs Data-in-ROB design

Fig. 14 物理レジスタ(左)とROB中データのデザイン(右)

BOOMは、「明示的リネーム」または「物理レジスタファイル」によるアウトオブオーダーのコアデザインです。 物理レジスタファイル は、ISAが規定するよりも多くのレジスタを含み、 コミットされたアーキテクチャレジスタ状態と投機的なレジスタ状態の両方を保持します。 リネームマップテーブル には、コミットされた状態を回復するために必要な情報が含まれています。 命令がリネームされると、そのレジスタ指定子は物理レジスタファイルにある物理レジスタを指すように明示的に更新されます。 1

これは、「暗黙のリネーム」や「データインROB」と呼ばれるアウトオブオーダーのコアデザインとは対照的でです。 ARF (アーキテクチャレジスタファイル: Architectural Register File) はコミットされたレジスタの状態のみを保持し、 ROBは投機的なライトバックデータを保持しています。 コミット時には、ROBは投機的データを ARF[2]_ に転送します。

リネームマップテーブル

The Rename Stage

Fig. 15 リネームステージ。論理レジスタ指定子はリネームマップテーブルを読み込んで物理レジスタ指定子を取得します。 スーパースカラのリネームでは、マップテーブルの変更は依存する命令にバイパスされなければなりません。 その後、物理ソース指定子はビジーテーブルを読むことができます。 Stale指定子は、命令が後にコミットしたときにどの物理レジスタが解放されるかを追跡するために使用されます。 物理レジスタファイルのP0は常に0です。

リネームマップテーブル (マップテーブルと略す)は、ISAレジスタから物理レジスタへの投機的なマッピングを保持します。

各分岐命令はリネームマップテーブルのコピーを取得します[3]。 分岐の予測が外れた場合、リネームマップテーブルは予測が外れた分岐命令の リネームマップテーブルのコピーから即座にリセットすることができます。

RV64G ISAでは、レジスタ指定子の位置が固定されているため (暗黙のレジスタ指定子はない)、 命令がデコードされる前にマップテーブルを読み取ることができます。 そのため、 デコードリネーム のステージを組み合わせることができます。

例外とフラッシュによるリセット

オプションで追加される「コミットマップテーブル」は、コミットされたアーキテクチャ状態のリネームマップを保持します。 この機能を有効にすると、フラッシュ時や例外発生時にパイプラインを1サイクルでリセットすることができます (現在のマップテーブルがコミットされたマップテーブルにリセットされます)。 そうでない場合、パイプラインのフラッシュには、コミットポイントでリネーム状態に書き戻すためにROBを「アンワインド」するための複数サイクルが必要となり、 1サイクルに1つのROB行が必要となります。

ジーテーブル

ジーテーブル は、各物理レジスタの準備状態を追跡します。 すべての物理オペランドの準備が整っていれば、命令の発行が可能になります。

フリーリスト

フリーリスト は、現在使用されていない物理レジスタを追跡し、 リネーム ステージを通過した命令に新しい物理レジスタを割り当てるために使用されます。

フリーリストはビットベクターとして実装されます。 優先度デコーダは、最初のフリーレジスタを見つけるために使用されます。 BOOMでは、カスケード式の優先度デコーダを使用して、1サイクルに複数のレジスタを割り当てています。4

分岐命令(またはJALR)ごとに、リネームマップテーブルがスナップショットされ、 分岐予測の誤りを1サイクルで回復できるようになっています。 同様に、フリーリストもゼロに初期化された新しい「アロケーション・リスト」を確保します。 新しい物理レジスタが割り当てられると、各分岐の「アロケーションリスト」が更新され、 分岐後に割り当てられたすべての物理レジスタが追跡されます。 誤検知が発生した場合は、そのブランチの「アロケーションリスト」と「フリーリスト」を 論理和 することで、 「フリーリスト」に戻します。5

古くなったリネームレジスタ

レジスタを書き込む命令では、マップテーブルが読み込まれ、 古くなった物理レジスタ指定子 (“stale pdst”)が取得されます。 命令がコミットされると、以降の命令では読み取れないため、 stale pdst はフリーリストに戻されます。