ハードウェアの気になるあれこれ

技術的に興味のあることを調べて書いてくブログ。主にハードウェアがネタ。

Rocket ChipのGeneratorのソースの解析メモ(9) - サンプルに沿ってPWMモジュールをTileLinkバスに追加してみる(3)

スポンサーリンク

随分間が空いたけど「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に組み込むために行った修正についてをまとめる。