32ビット版の乗除算器のVerilogだけ欲しくて、Chipyardで構成されるChiselの乗除算器のVerilogだけを持ってこようとしている。
通常、BOOMのコンフィグレーションを構成するためには、以下のようにしてVerilogファイルを生成する。
make CONFIG=MediumBoomConfig # 中堅サイズのコンフィグレーション作成 make CONFIG=MegaBoomConfig # 大きめのコンフィグレーション作成
ただしここにはビットサイズに関する指定が無いので、デフォルトで64ビットのコンフィグレーションが生成されてしまうので、32ビット版の乗除算器を生成できない。BOOMのVerilog生成において32ビット版をどのように生成するのか調査してみる。
BOOMのソースコードを読んでみると、config-mixin.scala
にて以下の記述があった。
boom/src/main/scala/common/config-mixins.scala
/** * 3-wide BOOM. Try to match the Cortex-A15. */ class WithNLargeBooms(n: Int = 1, overrideIdOffset: Option[Int] = None) extends Config( new WithTAGELBPD ++ // Default to TAGE-L BPD new Config((site, here, up) => { case TilesLocated(InSubsystem) => { val prev = up(TilesLocated(InSubsystem), site) val idOffset = overrideIdOffset.getOrElse(prev.size) (0 until n).map { i => BoomTileAttachParams( tileParams = BoomTileParams( core = BoomCoreParams( fetchWidth = 8, decodeWidth = 3, numRobEntries = 96, issueParams = Seq( IssueParams(issueWidth=1, numEntries=16, iqType=IQT_MEM.litValue, dispatchWidth=3), IssueParams(issueWidth=3, numEntries=32, iqType=IQT_INT.litValue, dispatchWidth=3), IssueParams(issueWidth=1, numEntries=24, iqType=IQT_FP.litValue , dispatchWidth=3)), numIntPhysRegisters = 100, numFpPhysRegisters = 96, numLdqEntries = 24, numStqEntries = 24, maxBrCount = 16, numFetchBufferEntries = 24, ftq = FtqParameters(nEntries=32), fpu = Some(freechips.rocketchip.tile.FPUParams(sfmaLatency=4, dfmaLatency=4, divSqrt=true)) ), dcache = Some( DCacheParams(rowBits = site(SystemBusKey).beatBits, nSets=64, nWays=8, nMSHRs=4, nTLBWays=16) ), icache = Some( ICacheParams(rowBits = site(SystemBusKey).beatBits, nSets=64, nWays=8, fetchBytes=4*4) ), hartId = i + idOffset ), crossingParams = RocketCrossingParams() ) } ++ prev } case SystemBusKey => up(SystemBusKey, site).copy(beatBytes = 16) case XLen => 64 }) ) // DOC include end: LargeBoomConfig
ここで、XLen
の値が決め打ちになっているため、以下のようにしてXLENのパラメータを埋め込んでみる。
diff --git a/src/main/scala/common/config-mixins.scala b/src/main/scala/common/config-mixins.scala index fc20726c..489b4c57 100644 --- a/src/main/scala/common/config-mixins.scala +++ b/src/main/scala/common/config-mixins.scala @@ -129,7 +129,7 @@ class WithNSmallBooms(n: Int = 1, overrideIdOffset: Option[Int] = None) extends /** * 2-wide BOOM. */ -class WithNMediumBooms(n: Int = 1, overrideIdOffset: Option[Int] = None) extends Config( +class WithNMediumBooms(xlen: Int = 64, n: Int = 1, overrideIdOffset: Option[Int] = None) extends Config( new WithTAGELBPD ++ // Default to TAGE-L BPD new Config((site, here, up) => { case TilesLocated(InSubsystem) => { @@ -169,7 +169,7 @@ class WithNMediumBooms(n: Int = 1, overrideIdOffset: Option[Int] = None) extends } ++ prev } case SystemBusKey => up(SystemBusKey, site).copy(beatBytes = 8) - case XLen => 64 + case XLen => xlen }) ) // DOC include start: LargeBoomConfig
そして、Chipyard側のコンフィグレーションを追加する。
generators/chipyard/src/main/scala/config/BoomConfigs.scala
diff --git a/generators/chipyard/src/main/scala/config/BoomConfigs.scala b/generators/chipyard/src/main/scala/config/BoomConfigs.scala index 9e1f558a..2a1922b1 100644 --- a/generators/chipyard/src/main/scala/config/BoomConfigs.scala +++ b/generators/chipyard/src/main/scala/config/BoomConfigs.scala @@ -11,7 +11,11 @@ class SmallBoomConfig extends Config( new chipyard.config.AbstractConfig) class MediumBoomConfig extends Config( - new boom.common.WithNMediumBooms(1) ++ // medium boom config + new boom.common.WithNMediumBooms(64, 1) ++ // medium boom config + new chipyard.config.AbstractConfig) + +class MediumBoom32Config extends Config( + new boom.common.WithNMediumBooms(32, 1) ++ // medium boom config new chipyard.config.AbstractConfig) class LargeBoomConfig extends Config(
これでVerilog生成に挑戦してみる。少し生成に時間がかかるので、結果は後日確認する。
make CONFIG=MediumBoom32Config debug