ちょっと気になったのだけれども、現在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
は使わないのか?)。