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