xref: /XiangShan/src/main/scala/xiangshan/backend/datapath/WbArbiterParams.scala (revision 45d40ce719a8202e16a540541c72fd4de6dfde60)
1730cfbc0SXuan Hupackage xiangshan.backend.datapath
2730cfbc0SXuan Hu
383ba63b3SXuan Huimport org.chipsalliance.cde.config.Parameters
4730cfbc0SXuan Huimport chisel3.Output
5730cfbc0SXuan Huimport chisel3.util.{DecoupledIO, MixedVec, ValidIO, log2Up}
639c59369SXuan Huimport xiangshan.backend.BackendParams
7730cfbc0SXuan Huimport xiangshan.backend.Bundles.WriteBackBundle
8*45d40ce7Ssinsanctionimport xiangshan.backend.datapath.DataConfig._
960f0c5aeSxiaofeibaoimport xiangshan.backend.datapath.WbConfig._
10730cfbc0SXuan Huimport xiangshan.backend.regfile.PregParams
11730cfbc0SXuan Hu
12730cfbc0SXuan Hucase class WbArbiterParams(
1339c59369SXuan Hu  wbCfgs    : Seq[PregWB],
14730cfbc0SXuan Hu  pregParams: PregParams,
1539c59369SXuan Hu  backendParams: BackendParams,
16730cfbc0SXuan Hu) {
17730cfbc0SXuan Hu
18730cfbc0SXuan Hu  def numIn = wbCfgs.length
19730cfbc0SXuan Hu
2039c59369SXuan Hu  def numOut = wbCfgs.head match {
2139c59369SXuan Hu    case _: WbConfig.IntWB => pregParams.numWrite.getOrElse(backendParams.getWbPortIndices(IntData()).size)
2260f0c5aeSxiaofeibao    case _: WbConfig.FpWB => pregParams.numWrite.getOrElse(backendParams.getWbPortIndices(FpData()).size)
2339c59369SXuan Hu    case _: WbConfig.VfWB => pregParams.numWrite.getOrElse(backendParams.getWbPortIndices(VecData()).size)
24*45d40ce7Ssinsanction    case _: WbConfig.V0WB => pregParams.numWrite.getOrElse(backendParams.getWbPortIndices(V0Data()).size)
25*45d40ce7Ssinsanction    case _: WbConfig.VlWB => pregParams.numWrite.getOrElse(backendParams.getWbPortIndices(VlData()).size)
2639c59369SXuan Hu    case x =>
27*45d40ce7Ssinsanction      assert(assertion = false, s"the WbConfig in WbArbiterParams should be either IntWB or FpWB or VfWB or V0WB or VlWB, found ${x.getClass}")
2839c59369SXuan Hu      0
2939c59369SXuan Hu  }
30730cfbc0SXuan Hu
31730cfbc0SXuan Hu  def dataWidth = pregParams.dataCfg.dataWidth
32730cfbc0SXuan Hu
33730cfbc0SXuan Hu  def addrWidth = log2Up(pregParams.numEntries)
34730cfbc0SXuan Hu
35730cfbc0SXuan Hu  def genInput(implicit p: Parameters) = {
3639c59369SXuan Hu    MixedVec(wbCfgs.map(x => DecoupledIO(new WriteBackBundle(x, backendParams))))
37730cfbc0SXuan Hu  }
38730cfbc0SXuan Hu
39730cfbc0SXuan Hu  def genOutput(implicit p: Parameters): MixedVec[ValidIO[WriteBackBundle]] = {
40730cfbc0SXuan Hu    Output(MixedVec(Seq.tabulate(numOut) {
41730cfbc0SXuan Hu      x =>
42730cfbc0SXuan Hu        ValidIO(new WriteBackBundle(
43730cfbc0SXuan Hu          wbCfgs.head.dataCfg match {
44730cfbc0SXuan Hu            case IntData() => IntWB(port = x)
4560f0c5aeSxiaofeibao            case FpData()  => FpWB(port = x)
460162f462Sczw            case VecData() => VfWB(port = x)
47*45d40ce7Ssinsanction            case V0Data()  => V0WB(port = x)
48*45d40ce7Ssinsanction            case VlData()  => VlWB(port = x)
49730cfbc0SXuan Hu            case _ => ???
5039c59369SXuan Hu          },
5139c59369SXuan Hu          backendParams
52730cfbc0SXuan Hu        )
53730cfbc0SXuan Hu        )
54730cfbc0SXuan Hu    }
55730cfbc0SXuan Hu    )
56730cfbc0SXuan Hu    )
57730cfbc0SXuan Hu  }
58730cfbc0SXuan Hu}
59