RISC-VのRocketCoreを拡張する方法にはいろいろあって、まずは命令を拡張してALUにいろいろ手を加える方法と、アクセラレータを外部に接続してそれに対するアクセスを実行するためのRoCCという方法がある。
命令を拡張してパイプラインの内部に手を入れる方法は以前紹介した。
次に、RoCCを使った方法について調べてみる。RoCCというのは"Rocket Custom Coprocessor"の略称で、Rocket Coreに対してカスタムのアクセラレータを接続できるようになる。
このあたりを解説した論文や資料などは、
- A Hardware Accelerator for Computing an Exact Dot Product
https://aspire.eecs.berkeley.edu/wp/wp-content/uploads/2017/05/exact-dot-product-arith2017.pdf
- CS250 Discussion 2 RISC-V, Rocket, and RoCC
https://inst.eecs.berkeley.edu/~cs250/sp16/disc/Disc02.pdf
- RISC-V “Rocket Chip” Tutorial
https://riscv.org/wp-content/uploads/2015/01/riscv-rocket-chip-tutorial-bootcamp-jan2015.pdf
その中で、RocketChipのカスタムデザインを使用するためのテンプレートとして、githubにrocc-templateというのが用意されている。
さらに、RoCCの詳細資料として、以下のドキュメントも公開されている。
RoCCの概要については、以下の図が分かりやすい。上記の"CS250 Discussion 2 RISC-V, Rocket, and RoCC"から抜粋した。
RoCCの制御は、RISC-Vのカスタム命令領域と密接に関わっている。custom命令に対して、命令ビットフィールドの上位のroccinstフィールドを使ってアクセラレータに具体的に何を指せるのかを指定する。
実際にRoCCに接続されたアクセラレータには、
が渡され、RoCCインタフェースを通じてコアとアクセラレータの通信が行われる。
さらに、RoCCアクセラレータはコアのL1 Dキャッシュとのインタフェースを持っており、L1からデータを読み込んで演算に使用できる。こうして、L1内のデータに対して一気にデータ処理を行うというわけだ。
これを使うといろいろ面白そうなものが作れそうだ。まずは単純なアクセラレータから、最終的には行列乗算など、ちょっと複雑なことまで実現してみたい。