FPGA開発日記

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

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

f:id:msyksphinz:20220103010108p:plain

メモ:Chipyard tag 1.5.0はMediumBoomConfigの生成に失敗する。master`ブランチを使った方が良い。

commit 02adf86b8261ca4b5baf35b3257e15cdbabd7f87 (HEAD, origin/master, origin/HEAD)
Author: Abraham Gonzalez <abe.j.gonza@gmail.com>
Date:   Thu Dec 2 09:25:51 2021 -0800

    Force FIRRTL 1.4.1 (#1053)

前回試行したコンフィグレーションはコンパイルに失敗してしまった。以下のアサーションが入っており上手く行かない。

  • chipyard/generators/boom/src/main/scala/common/parameters.scala
   val mulDivParams = boomParams.mulDiv.getOrElse(MulDivParams())
   // TODO: Allow RV32IF
   require(!(xLen == 32 && usingFPU), "RV32 does not support fp")

別にFPUを使わなくてもいいんだけどな... 試しにusingFPUをOFFにしてみてもなぜか同じアサーションで失敗した。

/**
 * 2-wide BOOM.
 */
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) => {
/* 中略 */
              nPerfCounters = 6,
              usingFPU = false,    // これを追加してみる
              fpu = Some(freechips.rocketchip.tile.FPUParams(sfmaLatency=4, dfmaLatency=4, divSqrt=true))
            ),
            dcache = Some(
              DCacheParams(rowBits = site(SystemBusKey).beatBits, nSets=64, nWays=4, nMSHRs=2, nTLBWays=8)

仕方がない。目的は32ビットの乗除算器のモジュールを手に入れることなのでBOOMから生成することはとりあえず諦めてRocketの32ビット版から取得しよう。以下のコマンドでVerilogを生成する。

make debug CONFIG=RV32RocketConfig

これで32ビット版のMulDivモジュールを取得できる。BOOMで生成した場合にはTagに関するポートが生成されていなかった。これはコンフィグレーションの違いで生成されているのだろうか。とりあえず32ビットと64ビットのモジュールの共存場合はこれらのポートをifdefで切り取ることにする。

  • RV32RocketConfigで生成した32ビット版MulDiv
module MulDiv(
  input         clock,
  input         reset,
  output        io_req_ready,
  input         io_req_valid,
  input  [3:0]  io_req_bits_fn,
  input  [31:0] io_req_bits_in1,
  input  [31:0] io_req_bits_in2,
  input  [4:0]  io_req_bits_tag,
  input         io_kill,
  input         io_resp_ready,
  output        io_resp_valid,
  output [31:0] io_resp_bits_data,
  output [4:0]  io_resp_bits_tag
);
  • MediumBoomConfigで生成した64ビット版MulDiv
module MulDiv(
  input         clock,
  input         reset,
  output        io_req_ready,
  input         io_req_valid,
  input  [3:0]  io_req_bits_fn,
  input         io_req_bits_dw,
  input  [63:0] io_req_bits_in1,
  input  [63:0] io_req_bits_in2,
  input         io_kill,
  input         io_resp_ready,
  output        io_resp_valid,
  output [63:0] io_resp_bits_data
);