色々訳あってRISC-VのOoOデザインであるSonicBOOMの構成を読み解くことにした。SonicBOOMのデザインは、デザインそのものはriscv-boom
リポジトリから入手できるが、合成及びRTLシミュレーションを行うためにはChipyardを使う必要がある(boom-templateというシミュレーション環境があった気がしたが、どうも調べてみたらdeprecatedになっていた。今はChipyardに統一されているようだ)。
一応展開してデザインを見ている。まずはSoCの状態。Tileを含むテストパタンの構成状況を確認してみる。
図. BOOMにおけるSoCの構成状況
TileはCPUが定義されている部分。以下の4つのバスが定義されている。
- PBus (Peripheral Bus)
- CBus (Control Bus)
- SBus (System Bus)
- MBus (Memory Bus)
そしてL2のラッパーが含まれている。割り込みとしてはPLICから2本、CLINTからは1本、デバッガからは1本が挿入されている。
次にTileの内部を見てみる。Diplomacyで見るよりもモジュール構成を見た方が良い気がするのでブロック図を作って内部を確認する。
まだ完全に読み解いているわけではないのだが、どうやらフロントエンドは主に2つのブロックに分けられていて、
- s0(f0)ステージ:ICacheにPCを送ってリクエストを行う。Hit/Missの結果はs2(f2)ステージで判明する
- s2ステージでICacheにヒットするとデータを取得できる。しかしそうでなければICacheのDiplomacyノードを通じて外部にリクエストが発行され、外部から直接レスポンスを取得する。
- f3はQueueに命令を入力する。ここでf3とf4がキューで連続しているのだが、これを分けている理由はまだ良く分かっていない。
- f4から出力されたQueueは、fb (Fetch Buffer) / ftq (FetchTargetQueue) に分配されCore部(CPUのバックエンド)に渡される。
- どうもコミットステージまではfb も ftqも命令をずっと保持しているようだ。この辺りの詳細な動きはまだわかっていない。今後追いかけていくことにする。