FPGA開発日記

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

RISC-Vのアウトオブオーダ実装 BOOM v2の内部構成

少し前に、RISC-VのRocket Coreのアウトオブオーダ版、BOOM(Berkeley Out-of-Order Machine) のVersion2がリリースされたことがアナウンスされたが、CARRV (RISC-Vの学術ワークショップ) に向けてその詳細が公開されたので読んでみた。

BOOM v2: an open-source out-of-order RISC-V core | EECS at UC Berkeley

詳細を読み進めていくと、BOOM v2は、BOOM v1で問題となったクリティカルパスの問題を解決すべく設計されたプロセッサのようだ。 一方で、性能(IPC)は約20%低下している。これらの設計情報や性能情報の定量的なものは不明だが、構造的なものについてザックリと説明してある。

まず、BOOM v1を解析した結果、クリティカルパスは以下の4つに存在するとしている。

  • Issue select
  • Register Rename Busy Table Read
  • Conditional Branch Predictor Redirect
  • Register File Read

まず、大まかな構成として、

  • フロントエンド (命令フェッチから分岐予測) : 3ステージ
  • デコードからリネーミング : 2ステージ
  • レジスタリードと命令発行 : 2ステージ

と、BOOMv1からパイプラインステージは伸びている。また、これまでほ整数レジスタファイルと浮動小数レジスタファイルが同じSRAMとして実装されていたが、これを分離することでFanOutを減少させている。

f:id:msyksphinz:20170927231702p:plain

次に分岐予測だが、BPD(Conditional Branch Predictor)がクリティカルパスになっていたものを、予測のために1サイクル使えるように変更した。図によると、BPDのインデックスを参照するために最初にPCからインデックスを生成するのだが、これを丸々1サイクルかけて実行し、次のステージでBPDのテーブルを参照している。 BPDの結果が分かるまでに余計に1サイクルかかるため、分岐予測の実質の性能は落ちるものと思われるが、それよりも動作周波数を選択した結果だということが出来る。

f:id:msyksphinz:20170927231329p:plain

命令発行のためのエントリは、BOOM v1では20エントリだったものを、BOOM v2では整数、浮動小数点、メモリアクセスでそれぞれ16エントリ持たせることで、全体で48エントリと倍以上にしている。

最後にレジスタファイルのクリティカルパス解消だが、まずは上記にも示した通り、命令発行ステージとレジスタリードのステージを分離することでクリティカルパスを削減している。

さらに問題になるのが、70個もの物理レジスタファイルをどのようにして配置配線するかという問題だ。BOOM v2は整数レジスタで6Read, 3Writeができる構成となっており、配線が非常に混雑する。 この問題を解消するために、3-stateバッファを用いたレジスタ制御の方式が利用されている (これをどのようにしてChiselに落とし込んでいるのかはちゃんと見ていないが)。

f:id:msyksphinz:20170927232611p:plain

64bitレジスタならば、上記のブロックが横方向に64bit分ならび、縦方向に70エントリ分並ぶことになる。アドレスデコーダは自分のブロックのアドレスが指定されているかどうかを検査する。検査の結果、このブロックの指定するアドレスが有効の場合、有効信号をアサートする。これを6ポート分用意する。 アドレスが有効な場合、上から流れてくる信号をトライステートバッファに取り込み、下方向に流す。アドレス指定によりどのブロックを使うかは一意に決まるため、横方向のデコードと縦方向のデータの流れで綺麗にレジスタファイルを作ることが出来るというわけだ。

以上これらの方式を用いて、BOOM v2では動作周波数の向上に取り組んだ。詳細な定量的なデータは、CARRVにて発表されるものと思われるので、要注目。