1*de93b508SzhanglyGitpackage xiangshan.backend.issue 2*de93b508SzhanglyGit 3*de93b508SzhanglyGitimport chipsalliance.rocketchip.config.Parameters 4*de93b508SzhanglyGitimport chisel3._ 5*de93b508SzhanglyGitimport chisel3.util._ 6*de93b508SzhanglyGitimport freechips.rocketchip.diplomacy.{LazyModule, LazyModuleImp} 7*de93b508SzhanglyGitimport utility.HasCircularQueuePtrHelper 8*de93b508SzhanglyGitimport xiangshan._ 9*de93b508SzhanglyGitimport xiangshan.backend.fu.{FuConfig, FuType} 10*de93b508SzhanglyGitimport xiangshan.mem.{MemWaitUpdateReq, SqPtr} 11*de93b508SzhanglyGitimport xiangshan.backend.Bundles.{DynInst, IssueQueueIssueBundle, IssueQueueWakeUpBundle} 12*de93b508SzhanglyGitimport xiangshan.backend.datapath.DataConfig._ 13*de93b508SzhanglyGitimport xiangshan.backend.exu.ExeUnitParams 14*de93b508SzhanglyGit 15*de93b508SzhanglyGitclass FuBusyTableRead(val idx: Int, isWb: Boolean, isVf: Boolean = false)(implicit p: Parameters, iqParams: IssueBlockParams) extends XSModule { 16*de93b508SzhanglyGit val io = IO(new FuBusyTableReadIO(idx, isWb, isVf)) 17*de93b508SzhanglyGit 18*de93b508SzhanglyGit val fuBusyTableSplit = if (!isWb) io.in.fuBusyTable.asBools.reverse else io.in.fuBusyTable.asBools 19*de93b508SzhanglyGit val latencyMap = if (!isWb) iqParams.exuBlockParams(idx).fuLatencyMap 20*de93b508SzhanglyGit else if (isVf) iqParams.exuBlockParams(idx).vfFuLatencyMap 21*de93b508SzhanglyGit else iqParams.exuBlockParams(idx).intFuLatencyMap 22*de93b508SzhanglyGit val fuTypeRegVec = io.in.fuTypeRegVec 23*de93b508SzhanglyGit 24*de93b508SzhanglyGit 25*de93b508SzhanglyGit val isReadLatencyNumVec2 = fuBusyTableSplit.zipWithIndex.map { case (en, latencyIdx) => 26*de93b508SzhanglyGit val latencyHitVec = WireInit(0.U(iqParams.numEntries.W)) 27*de93b508SzhanglyGit when(en) { 28*de93b508SzhanglyGit latencyHitVec := VecInit(fuTypeRegVec.map { case futype => 29*de93b508SzhanglyGit val latencyHitFuType = latencyMap.get.filter(_._2 == latencyIdx).map(_._1) 30*de93b508SzhanglyGit val isLatencyNum = Cat(latencyHitFuType.map(_.U === futype)).asUInt.orR 31*de93b508SzhanglyGit isLatencyNum 32*de93b508SzhanglyGit }).asUInt 33*de93b508SzhanglyGit } 34*de93b508SzhanglyGit latencyHitVec 35*de93b508SzhanglyGit } 36*de93b508SzhanglyGit 37*de93b508SzhanglyGit io.out.fuBusyTableMask := isReadLatencyNumVec2.fold(0.U(iqParams.numEntries.W))(_ | _) 38*de93b508SzhanglyGit} 39*de93b508SzhanglyGit 40*de93b508SzhanglyGitclass FuBusyTableReadIO(val idx: Int, isWb: Boolean, isVf: Boolean)(implicit p: Parameters, iqParams: IssueBlockParams) extends XSBundle { 41*de93b508SzhanglyGit val in = new Bundle { 42*de93b508SzhanglyGit val fuBusyTable = if (!isWb) Input(UInt(iqParams.exuBlockParams(idx).latencyValMax.get.W)) 43*de93b508SzhanglyGit else if (isVf) Input(UInt((iqParams.exuBlockParams(idx).vfLatencyValMax.get + 1).W)) 44*de93b508SzhanglyGit else Input(UInt((iqParams.exuBlockParams(idx).intLatencyValMax.get + 1).W)) 45*de93b508SzhanglyGit val fuTypeRegVec = Input(Vec(iqParams.numEntries, FuType())) 46*de93b508SzhanglyGit } 47*de93b508SzhanglyGit val out = new Bundle { 48*de93b508SzhanglyGit val fuBusyTableMask = Output(UInt(iqParams.numEntries.W)) 49*de93b508SzhanglyGit } 50*de93b508SzhanglyGit}