FPGA開発日記

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

Chipyardで32-bit版BOOMを生成するための調査 (1. コンフィグレーション調査)

f:id:msyksphinz:20220103010108p:plain

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