随分間が空いたけど「Rocket Chipに自分のモジュールを追加してみる」の3回目。 残りの2つは短いので今回でまとめて扱う。
Configs.scala
参照するソースコードは以下。
src/main/scala/example/Configs.scala
ただいろいろなコンフィグが存在していて分かりにくいので、必要なものだけ抜粋して掲載すると以下のものが残る。
package example import chisel3._ import freechips.rocketchip.config.{Parameters, Config} import freechips.rocketchip.subsystem.{WithRoccExample, WithNMemoryChannels, WithNBigCores, WithRV32} import freechips.rocketchip.devices.tilelink.BootROMParams import freechips.rocketchip.diplomacy.{LazyModule, ValName} import freechips.rocketchip.tile.XLen import testchipip._ import icenet._ object ConfigValName { implicit val valName = ValName("TestHarness") } import ConfigValName._ class WithBootROM extends Config((site, here, up) => { case BootROMParams => BootROMParams( contentFileName = s"./testchipip/bootrom/bootrom.rv${site(XLen)}.img") }) class WithPWM extends Config((site, here, up) => { case BuildTop => (clock: Clock, reset: Bool, p: Parameters) => Module(LazyModule(new ExampleTopWithPWM()(p)).module) }) class BaseExampleConfig extends Config( new WithBootROM ++ new freechips.rocketchip.system.DefaultConfig) class PWMConfig extends Config(new WithPWM ++ new BaseExampleConfig)
Rocke Chipの他の設定を試す時と同様にfreechips.rocketchip.system.DefaultConfig
をベースにして、それに追加したモジュールが含まれるExampleTopWithPWM
を実体化する処理を追加したWithPWM
をくっつけたものがPWMConfig
となる。
このWithPWM
に含まているmatch式の処理を使って最上位層となるTestHarness
でPWMモジュール付きのデザインを実体化する。
Top.scala
参照するソースコード自体は以下のもの。
src/main/scala/example/TestHarness.scala
これもRocket ChipのExampleTop
をインスタンスするための記述とほぼ同等。違いは大きくは以下の2つくらい。
- ExampleTopの実体の引き出し方
- 接続するモジュールの違い
ExampleTop
はこちらの方法ではBuildTop
というField
を継承したケースオブジェクトを作成し、与えた関数オブジェクトでExampleTopModuleImp
を直接引き出す形になっている。その処理自体は先ほどみたWithPWM
トレイトに実装されていたものだ。
package example import chisel3._ import freechips.rocketchip.diplomacy.LazyModule import freechips.rocketchip.config.{Field, Parameters} import freechips.rocketchip.util.GeneratorApp case object BuildTop extends Field[(Clock, Bool, Parameters) => ExampleTopModuleImp[ExampleTop]] class TestHarness(implicit val p: Parameters) extends Module { val io = IO(new Bundle { val success = Output(Bool()) }) val dut = p(BuildTop)(clock, reset.toBool, p) dut.debug := DontCare dut.connectSimAXIMem() dut.dontTouchPorts() dut.tieOffInterrupts() io.success := dut.connectSimSerial() } object Generator extends GeneratorApp { val longName = names.topModuleProject + "." + names.topModuleClass + "." + names.configs generateFirrtl generateAnno }
ということでこれでFiresim環境に含まれているPWMモジュールを追加する例のコードの確認は完了した。 次回はここまで見てきたものをRocket Chipに組み込むために行った修正についてをまとめる。