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