FPGA開発日記

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

Chipyardで32-bit版BOOMを生成するための調査 (3. RV32向けにF拡張限定BOOMを生成)

f:id:msyksphinz:20220103010108p:plain

ちょっと気になったのだけれども、現在BOOMは32ビットモードでのFPUをサポートしていないらしい(アサーションが組まれている)。

じゃあ無理やりそれを外して動作する様にしたらどうなるか、ということでやってみる。つまり、以下のアサーションコメントアウトして、 無理やりChiselでの生成に挑戦してみる。

diff --git a/src/main/scala/common/parameters.scala b/src/main/scala/common/parameters.scala
index 4f22b197..f0507bdb 100644
--- a/src/main/scala/common/parameters.scala
+++ b/src/main/scala/common/parameters.scala
@@ -176,7 +176,7 @@ trait HasBoomCoreParameters extends freechips.rocketchip.tile.HasCoreParameters

   val mulDivParams = boomParams.mulDiv.getOrElse(MulDivParams())
   // TODO: Allow RV32IF
-  require(!(xLen == 32 && usingFPU), "RV32 does not support fp")
+  // require(!(xLen == 32 && usingFPU), "RV32 does not support fp")

   //************************************
   // Pipelining

そうすると、まずはLSUの所で失敗してしまった。

[error] java.lang.IllegalArgumentException: requirement failed
[error]         ...
[error]         at boom.lsu.LSU.<init>(lsu.scala:882)
[error]         at boom.common.BoomTileModuleImp.$anonfun$lsu$2(tile.scala:160)
[error]         at chisel3.Module$.do_apply(Module.scala:54)
[error]         at boom.common.BoomTileModuleImp.$anonfun$lsu$1(tile.scala:160)
[error]         at chisel3.internal.plugin.package$.autoNameRecursively(package.scala:52)

対応するソースコード

         "[lsu] Incoming store is overwriting a valid data entry")
     }
   }
   val will_fire_stdf_incoming = io.core.fp_stdata.fire()
   require (xLen >= fLen) // for correct SDQ size

   //-------------------------------------------------------------
   //-------------------------------------------------------------

あ、そういうことですか... もうこの時点でRV32に対してD拡張を突っ込めないような仕様になっているんだな。 これ、やろうと思えば修正できそうだけど、今回はそれが目的ではないのでもうコンフィグレーションの方を書き換えてしまう。

diff --git a/src/main/scala/common/config-mixins.scala b/src/main/scala/common/config-mixins.scala
index fc20726c..bdf20bdf 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) => {
@@ -154,7 +154,8 @@ class WithNMediumBooms(n: Int = 1, overrideIdOffset: Option[Int] = None) extends
               numFetchBufferEntries = 16,
               ftq = FtqParameters(nEntries=32),
               nPerfCounters = 6,
-              fpu = Some(freechips.rocketchip.tile.FPUParams(sfmaLatency=4, dfmaLatency=4, divSqrt=true))
+              usingFPU = false,
+              fpu = Some(freechips.rocketchip.tile.FPUParams(fLen = xlen, sfmaLatency=4, dfmaLatency=4, divSqrt=true))
             ),
             dcache = Some(
               DCacheParams(rowBits = site(SystemBusKey).beatBits, nSets=64, nWays=4, nMSHRs=2, nTLBWays=8)
@@ -169,7 +170,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
   })
 )

要点としては、fpuの生成オプションのところにfLen = xLenのオプションを突っ込み、RV32ではF拡張(単精度浮動小数点)しか生成しないように変更してみる。 これですべてのアサーションをクリアして、一応Verilogファイルの生成までは出来るようになった。

ちなみにusingFPUをFalseにしてみたが無視されてFPUが生成されている。なぜだ(というかBOOMではusingFPUは使わないのか?)。