1package xiangshan.backend.datapath 2 3import chipsalliance.rocketchip.config.Parameters 4import chisel3.Output 5import chisel3.util.{DecoupledIO, MixedVec, ValidIO, log2Up} 6import xiangshan.backend.Bundles.WriteBackBundle 7import xiangshan.backend.datapath.DataConfig.{FpData, IntData, VecData} 8import xiangshan.backend.datapath.WbConfig.{IntWB, VfWB, WbConfig} 9import xiangshan.backend.regfile.PregParams 10 11case class WbArbiterParams( 12 wbCfgs : Seq[WbConfig], 13 pregParams: PregParams, 14) { 15 16 def numIn = wbCfgs.length 17 18 def numOut = pregParams.numWrite 19 20 def dataWidth = pregParams.dataCfg.dataWidth 21 22 def addrWidth = log2Up(pregParams.numEntries) 23 24 def genInput(implicit p: Parameters) = { 25 MixedVec(wbCfgs.map(x => DecoupledIO(new WriteBackBundle(x)))) 26 } 27 28 def genOutput(implicit p: Parameters): MixedVec[ValidIO[WriteBackBundle]] = { 29 Output(MixedVec(Seq.tabulate(numOut) { 30 x => 31 ValidIO(new WriteBackBundle( 32 wbCfgs.head.dataCfg match { 33 case IntData() => IntWB(port = x) 34 case FpData() => VfWB(port = x) 35 case VecData() => VfWB(port = x) 36 case _ => ??? 37 } 38 ) 39 ) 40 } 41 ) 42 ) 43 } 44} 45