xref: /XiangShan/src/main/scala/xiangshan/backend/datapath/WbArbiterParams.scala (revision 39c59369af6e7d78fa72e13aae3735f1a6e98f5c)
1package xiangshan.backend.datapath
2
3import chipsalliance.rocketchip.config.Parameters
4import chisel3.Output
5import chisel3.util.{DecoupledIO, MixedVec, ValidIO, log2Up}
6import xiangshan.backend.BackendParams
7import xiangshan.backend.Bundles.WriteBackBundle
8import xiangshan.backend.datapath.DataConfig.{FpData, IntData, VecData}
9import xiangshan.backend.datapath.WbConfig.{IntWB, PregWB, VfWB}
10import xiangshan.backend.regfile.PregParams
11
12case class WbArbiterParams(
13  wbCfgs    : Seq[PregWB],
14  pregParams: PregParams,
15  backendParams: BackendParams,
16) {
17
18  def numIn = wbCfgs.length
19
20  def numOut = wbCfgs.head match {
21    case _: WbConfig.IntWB => pregParams.numWrite.getOrElse(backendParams.getWbPortIndices(IntData()).size)
22    case _: WbConfig.VfWB => pregParams.numWrite.getOrElse(backendParams.getWbPortIndices(VecData()).size)
23    case x =>
24      assert(assertion = false, s"the WbConfig in WbArbiterParams should be either IntWB or VfWB, found ${x.getClass}")
25      0
26  }
27
28  def dataWidth = pregParams.dataCfg.dataWidth
29
30  def addrWidth = log2Up(pregParams.numEntries)
31
32  def genInput(implicit p: Parameters) = {
33    MixedVec(wbCfgs.map(x => DecoupledIO(new WriteBackBundle(x, backendParams))))
34  }
35
36  def genOutput(implicit p: Parameters): MixedVec[ValidIO[WriteBackBundle]] = {
37    Output(MixedVec(Seq.tabulate(numOut) {
38      x =>
39        ValidIO(new WriteBackBundle(
40          wbCfgs.head.dataCfg match {
41            case IntData() => IntWB(port = x)
42            case FpData() => VfWB(port = x)
43            case VecData() => VfWB(port = x)
44            case _ => ???
45          },
46          backendParams
47        )
48        )
49    }
50    )
51    )
52  }
53}
54