FPGA開発日記

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

RoCC を使ったRocket Coreの拡張方法の調査

RISC-VのRocketCoreを拡張する方法にはいろいろあって、まずは命令を拡張してALUにいろいろ手を加える方法と、アクセラレータを外部に接続してそれに対するアクセスを実行するためのRoCCという方法がある。

命令を拡張してパイプラインの内部に手を入れる方法は以前紹介した。

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

次に、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というのが用意されている。

github.com

さらに、RoCCの詳細資料として、以下のドキュメントも公開されている。

docs.google.com

RoCCの概要については、以下の図が分かりやすい。上記の"CS250 Discussion 2 RISC-V, Rocket, and RoCC"から抜粋した。

f:id:msyksphinz:20170825021220p:plain

RoCCの制御は、RISC-Vのカスタム命令領域と密接に関わっている。custom命令に対して、命令ビットフィールドの上位のroccinstフィールドを使ってアクセラレータに具体的に何を指せるのかを指定する。

f:id:msyksphinz:20170819134638p:plain

f:id:msyksphinz:20170825020738p:plain

実際にRoCCに接続されたアクセラレータには、

が渡され、RoCCインタフェースを通じてコアとアクセラレータの通信が行われる。

さらに、RoCCアクセラレータはコアのL1 Dキャッシュとのインタフェースを持っており、L1からデータを読み込んで演算に使用できる。こうして、L1内のデータに対して一気にデータ処理を行うというわけだ。

これを使うといろいろ面白そうなものが作れそうだ。まずは単純なアクセラレータから、最終的には行列乗算など、ちょっと複雑なことまで実現してみたい。