FPGA開発日記

FPGAというより、コンピュータアーキテクチャかもね! カテゴリ別記事インデックス https://sites.google.com/site/fpgadevelopindex/

RoCC アクセラレータ付きの構成をFPGA向けに合成する(1. 構成の追加とFPGA合成)

RISC-VのRocket Chipを使う構成で、FPGAインプリメントするためのパッケージとしては以下の2つがあるだろう。

それぞれに特徴があるだろう。Freedomのリポジトリを利用すると、Arty, VC707 がメインになるがSiFiveのデバッグツールなどを利用することができる。 一方で、UCBのfpga-zynqでは、ZedBoard, Zybo, ZC706などのボードのための構成が用意されている。

今回は、より一般的な構成(になっていそうな)fpga-zynqリポジトリを使って、RoCCのアクセラレータを搭載したRISC-VのFPGAデザインを作るためにはどうしたらよいのか調査した。

RISC-VのRocket Chipには様々なコンフィギュレーションが存在し、その中に、RoCC(Rocket Custom Coprocessor)にアクセラレータを接続した構成が存在する。 今回私がRoCCの試行に使用しているのもその構成の一つだ。RoccExampleConfigという構成でRocket Chipをコンパイルすれば、アクセラレータ付きのデザインがコンパイルされVerilogが生成される。

fpga-zynqのREADME.mdには、make rocket CONFIG=MyFPGAConfig などと例が載っており、自分の必要なRocket Chipの構成してFPGAを作成することができる。

デフォルトでは、コンフィグレーションはZynqConfigとなっている。これは、リポジトリ内の、common/Makefragから分かる。

  • common/Makefrag
CONFIG ?= ZynqConfig

それ以外に、いくつか構成が存在する。良く知られたところではDefaultConfigなどがRocket Chipのシミュレーションなどに使用される。 これらのコンフィグレーションはどこで定義されているかというと、common/src/main/scala/Configs.scala を参照すれば分かる。

...
class ZynqConfig extends Config(new WithZynqAdapter ++ new DefaultFPGAConfig)
class ZynqSmallConfig extends Config(new WithSmallCores ++ new ZynqConfig)
...

つまりZynqConfigというのは、DefaultFPGAConfigというものと、WithZynqAdapterというコンフィグレーションから構成されている。ではこのDefaultFPGAConfigとは何なのかというと、rocket-chip/src/main/scala/rocketchip/Configs.scalaに定義されてある。

  • rocket-chip/src/main/scala/rocketchip/Configs.scala
class DefaultFPGAConfig extends Config(new FPGAConfig ++ new BaseConfig)

ベースのコンフィグレーションに対して、FPGAConfigというものを付け加えたものがDefaultFPGAConfigというものになるらしい。同様に、RoccExampleConfigはどのようになっているのかというと、

  • rocket-chip/src/main/scala/rocketchip/Configs.scala
class RoccExampleConfig extends Config(new WithRoccExample ++ new BaseConfig)

と定義されており、ベースのコンフィグレーションに対して、RoCCのアクセラレータを付加したものになっている。 では、これにFPGAConfigを付け加えてFPGA向けのRoCCアクセラレータ付きのコンフィグレーションとして定義できるだろうか。 以下を付け加えた。

  • rocket-chip/src/main/scala/rocketchip/Configs.scala
diff --git a/src/main/scala/rocketchip/Configs.scala b/src/main/scala/rocketchip/Configs.scala
index e253bfb..a7b93f0 100644
--- a/src/main/scala/rocketchip/Configs.scala
+++ b/src/main/scala/rocketchip/Configs.scala
@@ -146,6 +146,8 @@ class DualChannelDualBankL2Config extends Config(

 class RoccExampleConfig extends Config(new WithRoccExample ++ new BaseConfig)

+class RoccFPGAConfig extends Config(new FPGAConfig ++ new WithRoccExample ++ new BaseConfig)
+
 class WithEdgeDataBits(dataBits: Int) extends Config(
   (pname, site, here) => pname match {
     case EdgeDataBits => dataBits

RoccFPGAConfigを作成した。これをさらにfpga-zynq側のリポジトリFPGA合成用の構成として定義する。 ここでは新たにRoccZynqConfigを作成した。

diff --git a/common/src/main/scala/Configs.scala b/common/src/main/scala/Configs.scala
index 7ae2c38..bf52376 100644
--- a/common/src/main/scala/Configs.scala
+++ b/common/src/main/scala/Configs.scala
@@ -41,6 +41,8 @@ class WithSmallCores extends Config(
 class ZynqConfig extends Config(new WithZynqAdapter ++ new DefaultFPGAConfig)
 class ZynqSmallConfig extends Config(new WithSmallCores ++ new ZynqConfig)

+class RoccZynqConfig extends Config(new WithZynqAdapter ++ new RoccFPGAConfig)
+
 class WithIntegrationTest extends Config(
   (pname, site, here) => pname match {
     case BuildSerialDriver =>

これでFPGA用のVerilogファイルを生成してみよう。以下で実行可能だ。

make rocket CONFIG=RoccZynqConfig
make project
make vivado

これでVivadoのGUIが立ち上がり、合成が可能となる。Verilogファイルを確認し、RoCCアクセラレータが含まれていること、一応合成を試行し、FPGAのbitファイルが生成されることを確認した。

f:id:msyksphinz:20170914020118p:plain

f:id:msyksphinz:20170914020622p:plain