1730cfbc0SXuan Hupackage xiangshan.backend.issue 2730cfbc0SXuan Hu 383ba63b3SXuan Huimport org.chipsalliance.cde.config.Parameters 4730cfbc0SXuan Huimport chisel3._ 5730cfbc0SXuan Huimport chisel3.util._ 6730cfbc0SXuan Huimport freechips.rocketchip.diplomacy.{LazyModule, LazyModuleImp} 744f2941bSJiru Sunimport utility.HasPerfEvents 844f2941bSJiru Sunimport utils.OptionWrapper 9730cfbc0SXuan Huimport xiangshan._ 1010fe9778SXuan Huimport xiangshan.backend.Bundles._ 11c720aa49Ssinsanctionimport xiangshan.backend.datapath.DataConfig._ 12c720aa49Ssinsanctionimport xiangshan.backend.datapath.WbConfig._ 13e62b6911SXuan Huimport xiangshan.backend.fu.FuType 14730cfbc0SXuan Huimport xiangshan.backend.regfile.RfWritePortWithConfig 152d270511Ssinsanctionimport xiangshan.mem.{LsqEnqCtrl, LsqEnqIO, MemWaitUpdateReq, SqPtr, LqPtr} 16c720aa49Ssinsanctionimport xiangshan.backend.datapath.WbConfig.V0WB 17c720aa49Ssinsanctionimport xiangshan.backend.regfile.VlPregParams 18955b4beaSsinsanctionimport xiangshan.backend.regcache.RegCacheTagTable 19730cfbc0SXuan Hu 20730cfbc0SXuan Husealed trait SchedulerType 21730cfbc0SXuan Hu 22730cfbc0SXuan Hucase class IntScheduler() extends SchedulerType 2360f0c5aeSxiaofeibaocase class FpScheduler() extends SchedulerType 24730cfbc0SXuan Hucase class MemScheduler() extends SchedulerType 25730cfbc0SXuan Hucase class VfScheduler() extends SchedulerType 26730cfbc0SXuan Hucase class NoScheduler() extends SchedulerType 27730cfbc0SXuan Hu 28730cfbc0SXuan Huclass Scheduler(val params: SchdBlockParams)(implicit p: Parameters) extends LazyModule with HasXSParameter { 291ca4a39dSXuan Hu override def shouldBeInlined: Boolean = false 301ca4a39dSXuan Hu 3139c59369SXuan Hu val numIntStateWrite = backendParams.numPregWb(IntData()) 3260f0c5aeSxiaofeibao val numFpStateWrite = backendParams.numPregWb(FpData()) 3339c59369SXuan Hu val numVfStateWrite = backendParams.numPregWb(VecData()) 3407b5cc60Sxiaofeibao val numV0StateWrite = backendParams.numPregWb(V0Data()) 3507b5cc60Sxiaofeibao val numVlStateWrite = backendParams.numPregWb(VlData()) 36730cfbc0SXuan Hu 37730cfbc0SXuan Hu val issueQueue = params.issueBlockParams.map(x => LazyModule(new IssueQueue(x).suggestName(x.getIQName))) 38730cfbc0SXuan Hu 3983ba63b3SXuan Hu lazy val module: SchedulerImpBase = params.schdType match { 40730cfbc0SXuan Hu case IntScheduler() => new SchedulerArithImp(this)(params, p) 4160f0c5aeSxiaofeibao case FpScheduler() => new SchedulerArithImp(this)(params, p) 42730cfbc0SXuan Hu case MemScheduler() => new SchedulerMemImp(this)(params, p) 43730cfbc0SXuan Hu case VfScheduler() => new SchedulerArithImp(this)(params, p) 44730cfbc0SXuan Hu case _ => null 45730cfbc0SXuan Hu } 46730cfbc0SXuan Hu} 47730cfbc0SXuan Hu 487f8233d5SHaojin Tangclass SchedulerIO()(implicit params: SchdBlockParams, p: Parameters) extends XSBundle { 4968d13085SXuan Hu // params alias 507f8233d5SHaojin Tang private val LoadQueueSize = VirtualLoadQueueSize 510a7d1d5cSxiaofeibao val fromDispatchUopNum = params.issueBlockParams.filter(x => x.StdCnt == 0).map(_.numEnq).sum 520a7d1d5cSxiaofeibao val allIssueParams = params.issueBlockParams.filter(_.StdCnt == 0) 530a7d1d5cSxiaofeibao val IssueQueueDeqSum = allIssueParams.map(_.numDeq).sum 540a7d1d5cSxiaofeibao val maxIQSize = allIssueParams.map(_.numEntries).max 55730cfbc0SXuan Hu val fromTop = new Bundle { 56730cfbc0SXuan Hu val hartId = Input(UInt(8.W)) 57730cfbc0SXuan Hu } 582e0a7dc5Sfdy val fromWbFuBusyTable = new Bundle{ 592e0a7dc5Sfdy val fuBusyTableRead = MixedVec(params.issueBlockParams.map(x => Input(x.genWbFuBusyTableReadBundle))) 602e0a7dc5Sfdy } 61dd970561SzhanglyGit val wbFuBusyTable = MixedVec(params.issueBlockParams.map(x => Output(x.genWbFuBusyTableWriteBundle))) 620a7d1d5cSxiaofeibao val IQValidNumVec = Output(Vec(IssueQueueDeqSum, UInt((maxIQSize).U.getWidth.W))) 63dd970561SzhanglyGit 64730cfbc0SXuan Hu val fromCtrlBlock = new Bundle { 65730cfbc0SXuan Hu val flush = Flipped(ValidIO(new Redirect)) 66730cfbc0SXuan Hu } 67730cfbc0SXuan Hu val fromDispatch = new Bundle { 680a7d1d5cSxiaofeibao val uops = Vec(fromDispatchUopNum, Flipped(DecoupledIO(new DynInst))) 69730cfbc0SXuan Hu } 7039c59369SXuan Hu val intWriteBack = MixedVec(Vec(backendParams.numPregWb(IntData()), 71730cfbc0SXuan Hu new RfWritePortWithConfig(backendParams.intPregParams.dataCfg, backendParams.intPregParams.addrWidth))) 7260f0c5aeSxiaofeibao val fpWriteBack = MixedVec(Vec(backendParams.numPregWb(FpData()), 7360f0c5aeSxiaofeibao new RfWritePortWithConfig(backendParams.fpPregParams.dataCfg, backendParams.fpPregParams.addrWidth))) 7439c59369SXuan Hu val vfWriteBack = MixedVec(Vec(backendParams.numPregWb(VecData()), 75730cfbc0SXuan Hu new RfWritePortWithConfig(backendParams.vfPregParams.dataCfg, backendParams.vfPregParams.addrWidth))) 7607b5cc60Sxiaofeibao val v0WriteBack = MixedVec(Vec(backendParams.numPregWb(V0Data()), 77c720aa49Ssinsanction new RfWritePortWithConfig(backendParams.v0PregParams.dataCfg, backendParams.v0PregParams.addrWidth))) 7807b5cc60Sxiaofeibao val vlWriteBack = MixedVec(Vec(backendParams.numPregWb(VlData()), 79c720aa49Ssinsanction new RfWritePortWithConfig(backendParams.vlPregParams.dataCfg, backendParams.vlPregParams.addrWidth))) 80*9df83ee5Sxiaofeibao val intWriteBackDelayed = MixedVec(Vec(backendParams.numPregWb(IntData()), 81*9df83ee5Sxiaofeibao new RfWritePortWithConfig(backendParams.intPregParams.dataCfg, backendParams.intPregParams.addrWidth))) 82*9df83ee5Sxiaofeibao val fpWriteBackDelayed = MixedVec(Vec(backendParams.numPregWb(FpData()), 83*9df83ee5Sxiaofeibao new RfWritePortWithConfig(backendParams.fpPregParams.dataCfg, backendParams.fpPregParams.addrWidth))) 84*9df83ee5Sxiaofeibao val vfWriteBackDelayed = MixedVec(Vec(backendParams.numPregWb(VecData()), 85*9df83ee5Sxiaofeibao new RfWritePortWithConfig(backendParams.vfPregParams.dataCfg, backendParams.vfPregParams.addrWidth))) 86*9df83ee5Sxiaofeibao val v0WriteBackDelayed = MixedVec(Vec(backendParams.numPregWb(V0Data()), 87*9df83ee5Sxiaofeibao new RfWritePortWithConfig(backendParams.v0PregParams.dataCfg, backendParams.v0PregParams.addrWidth))) 88*9df83ee5Sxiaofeibao val vlWriteBackDelayed = MixedVec(Vec(backendParams.numPregWb(VlData()), 89*9df83ee5Sxiaofeibao new RfWritePortWithConfig(backendParams.vlPregParams.dataCfg, backendParams.vlPregParams.addrWidth))) 9059ef6009Sxiaofeibao-xjtu val toDataPathAfterDelay: MixedVec[MixedVec[DecoupledIO[IssueQueueIssueBundle]]] = MixedVec(params.issueBlockParams.map(_.genIssueDecoupledBundle)) 91730cfbc0SXuan Hu 92c720aa49Ssinsanction val vlWriteBackInfo = new Bundle { 93d88d4328SZiyue Zhang val vlFromIntIsZero = Input(Bool()) 94d88d4328SZiyue Zhang val vlFromIntIsVlmax = Input(Bool()) 95d88d4328SZiyue Zhang val vlFromVfIsZero = Input(Bool()) 96d88d4328SZiyue Zhang val vlFromVfIsVlmax = Input(Bool()) 97b6279fc6SZiyue Zhang } 98b6279fc6SZiyue Zhang 99bf35baadSXuan Hu val fromSchedulers = new Bundle { 100c0be7f33SXuan Hu val wakeupVec: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpInValidBundle) 101*9df83ee5Sxiaofeibao val wakeupVecDelayed: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpInValidBundle) 102bf35baadSXuan Hu } 103bf35baadSXuan Hu 104bf35baadSXuan Hu val toSchedulers = new Bundle { 105c0be7f33SXuan Hu val wakeupVec: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = params.genIQWakeUpOutValidBundle 106bf35baadSXuan Hu } 107bf35baadSXuan Hu 108c0be7f33SXuan Hu val fromDataPath = new Bundle { 10910fe9778SXuan Hu val resp: MixedVec[MixedVec[OGRespBundle]] = MixedVec(params.issueBlockParams.map(x => Flipped(x.genOGRespBundle))) 110be9ff987Ssinsanction val og0Cancel = Input(ExuVec()) 111ea46c302SXuan Hu // Todo: remove this after no cancel signal from og1 112be9ff987Ssinsanction val og1Cancel = Input(ExuVec()) 113f8b278aaSsinsanction // replace RCIdx to Wakeup Queue 114f8b278aaSsinsanction val replaceRCIdx = OptionWrapper(params.needWriteRegCache, Vec(params.numWriteRegCache, Input(UInt(RegCacheIdxWidth.W)))) 115c0be7f33SXuan Hu // just be compatible to old code 116c0be7f33SXuan Hu def apply(i: Int)(j: Int) = resp(i)(j) 117c0be7f33SXuan Hu } 118c0be7f33SXuan Hu 1198a66c02cSXuan Hu val loadFinalIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.LdExuCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x))))))) 1203bba894fSxiaofeibao val vecLoadFinalIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.VlduCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x))))))) 1218a66c02cSXuan Hu val memAddrIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.LdExuCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x))))))) 1227e471bf8SXuan Hu val vecLoadIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.VlduCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x))))))) 1230f55a0d3SHaojin Tang 1246810d1e8Ssfencevma val ldCancel = Vec(backendParams.LduCnt + backendParams.HyuCnt, Flipped(new LoadCancelIO)) 125c0be7f33SXuan Hu 126730cfbc0SXuan Hu val fromMem = if (params.isMemSchd) Some(new Bundle { 1277b753bebSXuan Hu val ldaFeedback = Flipped(Vec(params.LduCnt, new MemRSFeedbackIO)) 1287b753bebSXuan Hu val staFeedback = Flipped(Vec(params.StaCnt, new MemRSFeedbackIO)) 1298f1fa9b1Ssfencevma val hyuFeedback = Flipped(Vec(params.HyuCnt, new MemRSFeedbackIO)) 130fd490615Sweiding liu val vstuFeedback = Flipped(Vec(params.VstuCnt, new MemRSFeedbackIO(isVector = true))) 131fd490615Sweiding liu val vlduFeedback = Flipped(Vec(params.VlduCnt, new MemRSFeedbackIO(isVector = true))) 132730cfbc0SXuan Hu val stIssuePtr = Input(new SqPtr()) 133730cfbc0SXuan Hu val lcommit = Input(UInt(log2Up(CommitWidth + 1).W)) 134730cfbc0SXuan Hu val scommit = Input(UInt(log2Ceil(EnsbufferWidth + 1).W)) // connected to `memBlock.io.sqDeq` instead of ROB 135fc45ed13SXuan Hu val wakeup = Vec(params.LdExuCnt, Flipped(Valid(new DynInst))) 1362d270511Ssinsanction val lqDeqPtr = Input(new LqPtr) 1372d270511Ssinsanction val sqDeqPtr = Input(new SqPtr) 138730cfbc0SXuan Hu // from lsq 139730cfbc0SXuan Hu val lqCancelCnt = Input(UInt(log2Up(LoadQueueSize + 1).W)) 140730cfbc0SXuan Hu val sqCancelCnt = Input(UInt(log2Up(StoreQueueSize + 1).W)) 141730cfbc0SXuan Hu val memWaitUpdateReq = Flipped(new MemWaitUpdateReq) 142730cfbc0SXuan Hu }) else None 143730cfbc0SXuan Hu val toMem = if (params.isMemSchd) Some(new Bundle { 144730cfbc0SXuan Hu val loadFastMatch = Output(Vec(params.LduCnt, new IssueQueueLoadBundle)) 145730cfbc0SXuan Hu }) else None 14642b6cdf9Ssinsanction val fromOg2Resp = if(params.needOg2Resp) Some(MixedVec(params.issueBlockParams.filter(_.needOg2Resp).map(x => Flipped(x.genOG2RespBundle)))) else None 147730cfbc0SXuan Hu} 148730cfbc0SXuan Hu 149730cfbc0SXuan Huabstract class SchedulerImpBase(wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters) 150730cfbc0SXuan Hu extends LazyModuleImp(wrapper) 151730cfbc0SXuan Hu with HasXSParameter 152730cfbc0SXuan Hu{ 153730cfbc0SXuan Hu val io = IO(new SchedulerIO()) 154730cfbc0SXuan Hu 155730cfbc0SXuan Hu // alias 156c0be7f33SXuan Hu private val iqWakeUpInMap: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] = 157c0be7f33SXuan Hu io.fromSchedulers.wakeupVec.map(x => (x.bits.exuIdx, x)).toMap 158*9df83ee5Sxiaofeibao private val iqWakeUpInMapDelayed: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] = 159*9df83ee5Sxiaofeibao io.fromSchedulers.wakeupVecDelayed.map(x => (x.bits.exuIdx, x)).toMap 160730cfbc0SXuan Hu private val schdType = params.schdType 161730cfbc0SXuan Hu 162730cfbc0SXuan Hu // Modules 163730cfbc0SXuan Hu val issueQueues: Seq[IssueQueueImp] = wrapper.issueQueue.map(_.module) 164730cfbc0SXuan Hu 1650a7d1d5cSxiaofeibao io.IQValidNumVec := issueQueues.filter(_.params.StdCnt == 0).map(_.io.validCntDeqVec).flatten 166f39a61a1SzhanglyGit val wakeupFromIntWBVec = Wire(params.genIntWBWakeUpSinkValidBundle) 16760f0c5aeSxiaofeibao val wakeupFromFpWBVec = Wire(params.genFpWBWakeUpSinkValidBundle) 168f39a61a1SzhanglyGit val wakeupFromVfWBVec = Wire(params.genVfWBWakeUpSinkValidBundle) 169c720aa49Ssinsanction val wakeupFromV0WBVec = Wire(params.genV0WBWakeUpSinkValidBundle) 170c720aa49Ssinsanction val wakeupFromVlWBVec = Wire(params.genVlWBWakeUpSinkValidBundle) 171*9df83ee5Sxiaofeibao val wakeupFromIntWBVecDelayed = Wire(params.genIntWBWakeUpSinkValidBundle) 172*9df83ee5Sxiaofeibao val wakeupFromFpWBVecDelayed = Wire(params.genFpWBWakeUpSinkValidBundle) 173*9df83ee5Sxiaofeibao val wakeupFromVfWBVecDelayed = Wire(params.genVfWBWakeUpSinkValidBundle) 174*9df83ee5Sxiaofeibao val wakeupFromV0WBVecDelayed = Wire(params.genV0WBWakeUpSinkValidBundle) 175*9df83ee5Sxiaofeibao val wakeupFromVlWBVecDelayed = Wire(params.genVlWBWakeUpSinkValidBundle) 176f39a61a1SzhanglyGit 177*9df83ee5Sxiaofeibao val wakeupFromWBVec = Seq(wakeupFromIntWBVec, wakeupFromFpWBVec, wakeupFromVfWBVec, wakeupFromV0WBVec, wakeupFromVlWBVec) 178*9df83ee5Sxiaofeibao val allWriteBack = Seq(io.intWriteBack, io.fpWriteBack, io.vfWriteBack, io.v0WriteBack, io.vlWriteBack) 179*9df83ee5Sxiaofeibao wakeupFromWBVec.zip(allWriteBack).map{ case (sinks, sources) => 180*9df83ee5Sxiaofeibao sinks.zip(sources).map{ case (sink, source) => 181f39a61a1SzhanglyGit sink.valid := source.wen 182f39a61a1SzhanglyGit sink.bits.rfWen := source.intWen 183f39a61a1SzhanglyGit sink.bits.fpWen := source.fpWen 184f39a61a1SzhanglyGit sink.bits.vecWen := source.vecWen 185c720aa49Ssinsanction sink.bits.v0Wen := source.v0Wen 186c720aa49Ssinsanction sink.bits.vlWen := source.vlWen 187f39a61a1SzhanglyGit sink.bits.pdest := source.addr 188730cfbc0SXuan Hu } 189*9df83ee5Sxiaofeibao } 190f39a61a1SzhanglyGit 191*9df83ee5Sxiaofeibao val wakeupFromWBVecDelayed = Seq(wakeupFromIntWBVecDelayed, wakeupFromFpWBVecDelayed, wakeupFromVfWBVecDelayed, wakeupFromV0WBVecDelayed, wakeupFromVlWBVecDelayed) 192*9df83ee5Sxiaofeibao val allWriteBackDelayed = Seq(io.intWriteBackDelayed, io.fpWriteBackDelayed, io.vfWriteBackDelayed, io.v0WriteBackDelayed, io.vlWriteBackDelayed) 193*9df83ee5Sxiaofeibao wakeupFromWBVecDelayed.zip(allWriteBackDelayed).map { case (sinks, sources) => 194*9df83ee5Sxiaofeibao sinks.zip(sources).map { case (sink, source) => 19560f0c5aeSxiaofeibao sink.valid := source.wen 19660f0c5aeSxiaofeibao sink.bits.rfWen := source.intWen 19760f0c5aeSxiaofeibao sink.bits.fpWen := source.fpWen 19860f0c5aeSxiaofeibao sink.bits.vecWen := source.vecWen 199c720aa49Ssinsanction sink.bits.v0Wen := source.v0Wen 200c720aa49Ssinsanction sink.bits.vlWen := source.vlWen 20160f0c5aeSxiaofeibao sink.bits.pdest := source.addr 20260f0c5aeSxiaofeibao } 203c720aa49Ssinsanction } 204bf35baadSXuan Hu // Connect bundles having the same wakeup source 20559ef6009Sxiaofeibao-xjtu issueQueues.zipWithIndex.foreach { case(iq, i) => 206bf35baadSXuan Hu iq.io.wakeupFromIQ.foreach { wakeUp => 2070c7ebb58Sxiaofeibao-xjtu val wakeUpIn = iqWakeUpInMap(wakeUp.bits.exuIdx) 2080c7ebb58Sxiaofeibao-xjtu val exuIdx = wakeUp.bits.exuIdx 2090c7ebb58Sxiaofeibao-xjtu println(s"[Backend] Connect wakeup exuIdx ${exuIdx}") 2100c7ebb58Sxiaofeibao-xjtu connectSamePort(wakeUp,wakeUpIn) 2110c7ebb58Sxiaofeibao-xjtu backendParams.connectWakeup(exuIdx) 2120c7ebb58Sxiaofeibao-xjtu if (backendParams.isCopyPdest(exuIdx)) { 2130c7ebb58Sxiaofeibao-xjtu println(s"[Backend] exuIdx ${exuIdx} use pdestCopy ${backendParams.getCopyPdestIndex(exuIdx)}") 2140c7ebb58Sxiaofeibao-xjtu wakeUp.bits.pdest := wakeUpIn.bits.pdestCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 2154c5a0d77Sxiaofeibao-xjtu if (wakeUpIn.bits.rfWenCopy.nonEmpty) wakeUp.bits.rfWen := wakeUpIn.bits.rfWenCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 2164c5a0d77Sxiaofeibao-xjtu if (wakeUpIn.bits.fpWenCopy.nonEmpty) wakeUp.bits.fpWen := wakeUpIn.bits.fpWenCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 2174c5a0d77Sxiaofeibao-xjtu if (wakeUpIn.bits.vecWenCopy.nonEmpty) wakeUp.bits.vecWen := wakeUpIn.bits.vecWenCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 218c720aa49Ssinsanction if (wakeUpIn.bits.v0WenCopy.nonEmpty) wakeUp.bits.v0Wen := wakeUpIn.bits.v0WenCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 219c720aa49Ssinsanction if (wakeUpIn.bits.vlWenCopy.nonEmpty) wakeUp.bits.vlWen := wakeUpIn.bits.vlWenCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 2204c5a0d77Sxiaofeibao-xjtu if (wakeUpIn.bits.loadDependencyCopy.nonEmpty) wakeUp.bits.loadDependency := wakeUpIn.bits.loadDependencyCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 2210c7ebb58Sxiaofeibao-xjtu } 22260912d84Sxiaofeibao-xjtu if (iq.params.numIntSrc == 0) wakeUp.bits.rfWen := false.B 22360f0c5aeSxiaofeibao if (iq.params.numFpSrc == 0) wakeUp.bits.fpWen := false.B 22460912d84Sxiaofeibao-xjtu if (iq.params.numVfSrc == 0) wakeUp.bits.vecWen := false.B 225c720aa49Ssinsanction if (iq.params.numV0Src == 0) wakeUp.bits.v0Wen := false.B 226c720aa49Ssinsanction if (iq.params.numVlSrc == 0) wakeUp.bits.vlWen := false.B 227bf35baadSXuan Hu } 228*9df83ee5Sxiaofeibao iq.io.wakeupFromIQDelayed.foreach { wakeUp => 229*9df83ee5Sxiaofeibao val wakeUpIn = iqWakeUpInMapDelayed(wakeUp.bits.exuIdx) 230*9df83ee5Sxiaofeibao connectSamePort(wakeUp, wakeUpIn) 231*9df83ee5Sxiaofeibao if (iq.params.numIntSrc == 0) wakeUp.bits.rfWen := false.B 232*9df83ee5Sxiaofeibao if (iq.params.numFpSrc == 0) wakeUp.bits.fpWen := false.B 233*9df83ee5Sxiaofeibao if (iq.params.numVfSrc == 0) wakeUp.bits.vecWen := false.B 234*9df83ee5Sxiaofeibao if (iq.params.numV0Src == 0) wakeUp.bits.v0Wen := false.B 235*9df83ee5Sxiaofeibao if (iq.params.numVlSrc == 0) wakeUp.bits.vlWen := false.B 236*9df83ee5Sxiaofeibao } 237ea46c302SXuan Hu iq.io.og0Cancel := io.fromDataPath.og0Cancel 238ea46c302SXuan Hu iq.io.og1Cancel := io.fromDataPath.og1Cancel 239e600b1ddSxiaofeibao-xjtu if (iq.params.needLoadDependency) 2400f55a0d3SHaojin Tang iq.io.ldCancel := io.ldCancel 241e600b1ddSxiaofeibao-xjtu else 242e600b1ddSxiaofeibao-xjtu iq.io.ldCancel := 0.U.asTypeOf(io.ldCancel) 243bf35baadSXuan Hu } 244bf35baadSXuan Hu 245b6279fc6SZiyue Zhang // connect the vl writeback informatino to the issue queues 246b6279fc6SZiyue Zhang issueQueues.zipWithIndex.foreach { case(iq, i) => 247d88d4328SZiyue Zhang iq.io.vlFromIntIsVlmax := io.vlWriteBackInfo.vlFromIntIsVlmax 248d88d4328SZiyue Zhang iq.io.vlFromIntIsZero := io.vlWriteBackInfo.vlFromIntIsZero 249d88d4328SZiyue Zhang iq.io.vlFromVfIsVlmax := io.vlWriteBackInfo.vlFromVfIsVlmax 250d88d4328SZiyue Zhang iq.io.vlFromVfIsZero := io.vlWriteBackInfo.vlFromVfIsZero 251b6279fc6SZiyue Zhang } 252b6279fc6SZiyue Zhang 253c0be7f33SXuan Hu private val iqWakeUpOutMap: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] = 254bf35baadSXuan Hu issueQueues.flatMap(_.io.wakeupToIQ) 255c0be7f33SXuan Hu .map(x => (x.bits.exuIdx, x)) 256bf35baadSXuan Hu .toMap 257bf35baadSXuan Hu 258bf35baadSXuan Hu // Connect bundles having the same wakeup source 259bf35baadSXuan Hu io.toSchedulers.wakeupVec.foreach { wakeUp => 260c0be7f33SXuan Hu wakeUp := iqWakeUpOutMap(wakeUp.bits.exuIdx) 261bf35baadSXuan Hu } 262bf35baadSXuan Hu 26359ef6009Sxiaofeibao-xjtu io.toDataPathAfterDelay.zipWithIndex.foreach { case (toDpDy, i) => 26459ef6009Sxiaofeibao-xjtu toDpDy <> issueQueues(i).io.deqDelay 26559ef6009Sxiaofeibao-xjtu } 266bf35baadSXuan Hu 267f99b81adSHaojin Tang // Response 268f99b81adSHaojin Tang issueQueues.zipWithIndex.foreach { case (iq, i) => 269f99b81adSHaojin Tang iq.io.og0Resp.zipWithIndex.foreach { case (og0Resp, j) => 270f99b81adSHaojin Tang og0Resp := io.fromDataPath(i)(j).og0resp 271f99b81adSHaojin Tang } 272f99b81adSHaojin Tang iq.io.og1Resp.zipWithIndex.foreach { case (og1Resp, j) => 273f99b81adSHaojin Tang og1Resp := io.fromDataPath(i)(j).og1resp 274f99b81adSHaojin Tang } 275f99b81adSHaojin Tang iq.io.finalIssueResp.foreach(_.zipWithIndex.foreach { case (finalIssueResp, j) => 2763bba894fSxiaofeibao if (io.loadFinalIssueResp(i).isDefinedAt(j) && iq.params.isLdAddrIQ) { 277f99b81adSHaojin Tang finalIssueResp := io.loadFinalIssueResp(i)(j) 2783bba894fSxiaofeibao } else if (io.vecLoadFinalIssueResp(i).isDefinedAt(j) && iq.params.isVecLduIQ) { 2793bba894fSxiaofeibao finalIssueResp := io.vecLoadFinalIssueResp(i)(j) 2803bba894fSxiaofeibao } 2813bba894fSxiaofeibao else { 282670870b3SXuan Hu finalIssueResp := 0.U.asTypeOf(finalIssueResp) 283670870b3SXuan Hu } 284f99b81adSHaojin Tang }) 285e8800897SXuan Hu iq.io.memAddrIssueResp.foreach(_.zipWithIndex.foreach { case (memAddrIssueResp, j) => 286aa2bcc31SzhanglyGit if (io.memAddrIssueResp(i).isDefinedAt(j)) { 287e8800897SXuan Hu memAddrIssueResp := io.memAddrIssueResp(i)(j) 288aa2bcc31SzhanglyGit } else { 289aa2bcc31SzhanglyGit memAddrIssueResp := 0.U.asTypeOf(memAddrIssueResp) 290aa2bcc31SzhanglyGit } 291e8800897SXuan Hu }) 2927e471bf8SXuan Hu iq.io.vecLoadIssueResp.foreach(_.zipWithIndex.foreach { case (resp, deqIdx) => 2937e471bf8SXuan Hu resp := io.vecLoadIssueResp(i)(deqIdx) 2947e471bf8SXuan Hu }) 295f99b81adSHaojin Tang iq.io.wbBusyTableRead := io.fromWbFuBusyTable.fuBusyTableRead(i) 296f99b81adSHaojin Tang io.wbFuBusyTable(i) := iq.io.wbBusyTableWrite 297f8b278aaSsinsanction iq.io.replaceRCIdx.foreach(x => x := 0.U.asTypeOf(x)) 298f8b278aaSsinsanction } 29942b6cdf9Ssinsanction if (params.needOg2Resp) { 30042b6cdf9Ssinsanction issueQueues.filter(_.params.needOg2Resp).zip(io.fromOg2Resp.get).foreach{ case (iq, og2RespVec) => 30142b6cdf9Ssinsanction iq.io.og2Resp.get.zip(og2RespVec).foreach{ case (iqOg2Resp, og2Resp) => 30242b6cdf9Ssinsanction iqOg2Resp := og2Resp 30342b6cdf9Ssinsanction } 30442b6cdf9Ssinsanction } 30542b6cdf9Ssinsanction } 306f8b278aaSsinsanction 307f8b278aaSsinsanction // Connect each replace RCIdx to IQ 308f8b278aaSsinsanction if (params.needWriteRegCache) { 309f8b278aaSsinsanction val iqReplaceRCIdxVec = issueQueues.filter(_.params.needWriteRegCache).flatMap{ iq => 310f8b278aaSsinsanction iq.params.allExuParams.zip(iq.io.replaceRCIdx.get).filter(_._1.needWriteRegCache).map(_._2) 311f8b278aaSsinsanction } 312f8b278aaSsinsanction iqReplaceRCIdxVec.zip(io.fromDataPath.replaceRCIdx.get).foreach{ case (iq, in) => 313f8b278aaSsinsanction iq := in 314f8b278aaSsinsanction } 315f8b278aaSsinsanction 316f8b278aaSsinsanction println(s"[Scheduler] numWriteRegCache: ${params.numWriteRegCache}") 317f8b278aaSsinsanction println(s"[Scheduler] iqReplaceRCIdxVec: ${iqReplaceRCIdxVec.size}") 318f99b81adSHaojin Tang } 319f99b81adSHaojin Tang 320e1a85e9fSchengguanghui // perfEvent 321e1a85e9fSchengguanghui val lastCycleIqEnqFireVec = RegNext(VecInit(issueQueues.map(_.io.enq.map(_.fire)).flatten)) 322e1a85e9fSchengguanghui val lastCycleIqFullVec = RegNext(VecInit(issueQueues.map(_.io.enq.head.ready))) 323e1a85e9fSchengguanghui 324e1a85e9fSchengguanghui val issueQueueFullVecPerf = issueQueues.zip(lastCycleIqFullVec)map{ case (iq, full) => (iq.params.getIQName + s"_full", full) } 325e1a85e9fSchengguanghui val basePerfEvents = Seq( 326e1a85e9fSchengguanghui ("issueQueue_enq_fire_cnt", PopCount(lastCycleIqEnqFireVec) ) 327e1a85e9fSchengguanghui ) ++ issueQueueFullVecPerf 328e1a85e9fSchengguanghui 329c0be7f33SXuan Hu println(s"[Scheduler] io.fromSchedulers.wakeupVec: ${io.fromSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}") 330bf35baadSXuan Hu println(s"[Scheduler] iqWakeUpInKeys: ${iqWakeUpInMap.keys}") 331bf35baadSXuan Hu 332bf35baadSXuan Hu println(s"[Scheduler] iqWakeUpOutKeys: ${iqWakeUpOutMap.keys}") 333c0be7f33SXuan Hu println(s"[Scheduler] io.toSchedulers.wakeupVec: ${io.toSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}") 334730cfbc0SXuan Hu} 335730cfbc0SXuan Hu 336730cfbc0SXuan Huclass SchedulerArithImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters) 337730cfbc0SXuan Hu extends SchedulerImpBase(wrapper) 338730cfbc0SXuan Hu with HasXSParameter 339e1a85e9fSchengguanghui with HasPerfEvents 340730cfbc0SXuan Hu{ 3410a7d1d5cSxiaofeibao val issueQueuesUopIn = issueQueues.map(_.io.enq).flatten 3420a7d1d5cSxiaofeibao issueQueuesUopIn.zip(io.fromDispatch.uops).map(x => x._1 <> x._2) 343730cfbc0SXuan Hu issueQueues.zipWithIndex.foreach { case (iq, i) => 344730cfbc0SXuan Hu iq.io.flush <> io.fromCtrlBlock.flush 345e600b1ddSxiaofeibao-xjtu if (!iq.params.needLoadDependency) { 346e600b1ddSxiaofeibao-xjtu iq.io.enq.map(x => x.bits.srcLoadDependency := 0.U.asTypeOf(x.bits.srcLoadDependency)) 347e600b1ddSxiaofeibao-xjtu } 348f39a61a1SzhanglyGit val intWBIQ = params.schdType match { 349f39a61a1SzhanglyGit case IntScheduler() => wakeupFromIntWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1) 35060f0c5aeSxiaofeibao case FpScheduler() => wakeupFromFpWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1) 351c720aa49Ssinsanction case VfScheduler() => (wakeupFromVfWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 352c720aa49Ssinsanction wakeupFromV0WBVec.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 353c720aa49Ssinsanction wakeupFromVlWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1)) 354596af5d2SHaojin Tang case _ => null 355f39a61a1SzhanglyGit } 356*9df83ee5Sxiaofeibao val intWBIQDelayed = params.schdType match { 357*9df83ee5Sxiaofeibao case IntScheduler() => wakeupFromIntWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1) 358*9df83ee5Sxiaofeibao case FpScheduler() => wakeupFromFpWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1) 359*9df83ee5Sxiaofeibao case VfScheduler() => (wakeupFromVfWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 360*9df83ee5Sxiaofeibao wakeupFromV0WBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 361*9df83ee5Sxiaofeibao wakeupFromVlWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1)) 362*9df83ee5Sxiaofeibao case _ => null 363*9df83ee5Sxiaofeibao } 364f39a61a1SzhanglyGit iq.io.wakeupFromWB.zip(intWBIQ).foreach{ case (sink, source) => sink := source} 365*9df83ee5Sxiaofeibao iq.io.wakeupFromWBDelayed.zip(intWBIQDelayed).foreach{ case (sink, source) => sink := source} 366730cfbc0SXuan Hu } 367e1a85e9fSchengguanghui 368e1a85e9fSchengguanghui val perfEvents = basePerfEvents 369e1a85e9fSchengguanghui generatePerfEvent() 370730cfbc0SXuan Hu} 371730cfbc0SXuan Hu 372f99b81adSHaojin Tang// FIXME: Vector mem instructions may not be handled properly! 373730cfbc0SXuan Huclass SchedulerMemImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters) 374730cfbc0SXuan Hu extends SchedulerImpBase(wrapper) 375730cfbc0SXuan Hu with HasXSParameter 376e1a85e9fSchengguanghui with HasPerfEvents 377730cfbc0SXuan Hu{ 378730cfbc0SXuan Hu 3790a7d1d5cSxiaofeibao val issueQueuesUopIn = issueQueues.filter(_.params.StdCnt == 0).map(_.io.enq).flatten 3800a7d1d5cSxiaofeibao issueQueuesUopIn.zip(io.fromDispatch.uops).map(x => x._1 <> x._2) 3810a7d1d5cSxiaofeibao val noStdExuParams = params.issueBlockParams.map(x => Seq.fill(x.numEnq)(x.exuBlockParams)).flatten.filter{x => x.map(!_.hasStdFu).reduce(_ && _)} 3820a7d1d5cSxiaofeibao val staIdx = noStdExuParams.zipWithIndex.filter{x => x._1.map(_.hasStoreAddrFu).reduce(_ || _)}.map(_._2) 3830a7d1d5cSxiaofeibao val staReady = issueQueues.filter(iq => iq.params.StaCnt > 0).map(_.io.enq.map(_.ready)).flatten 3840a7d1d5cSxiaofeibao val stdReady = issueQueues.filter(iq => iq.params.StdCnt > 0).map(_.io.enq.map(_.ready)).flatten 3850a7d1d5cSxiaofeibao staIdx.zipWithIndex.map{ case (sta, i) => { 3860a7d1d5cSxiaofeibao io.fromDispatch.uops(sta).ready := staReady(i) && stdReady(i) 3870a7d1d5cSxiaofeibao }} 388559c1710SHaojin Tang val memAddrIQs = issueQueues.filter(_.params.isMemAddrIQ) 389e07131b2Ssinsanction val stAddrIQs = issueQueues.filter(iq => iq.params.StaCnt > 0) // included in memAddrIQs 390e07131b2Ssinsanction val ldAddrIQs = issueQueues.filter(iq => iq.params.LduCnt > 0) 391e07131b2Ssinsanction val stDataIQs = issueQueues.filter(iq => iq.params.StdCnt > 0) 392559c1710SHaojin Tang val vecMemIQs = issueQueues.filter(_.params.isVecMemIQ) 393559c1710SHaojin Tang val (hyuIQs, hyuIQIdxs) = issueQueues.zipWithIndex.filter(_._1.params.HyuCnt > 0).unzip 394499caf4cSXuan Hu 395499caf4cSXuan Hu println(s"[SchedulerMemImp] memAddrIQs.size: ${memAddrIQs.size}, enq.size: ${memAddrIQs.map(_.io.enq.size).sum}") 396499caf4cSXuan Hu println(s"[SchedulerMemImp] stAddrIQs.size: ${stAddrIQs.size }, enq.size: ${stAddrIQs.map(_.io.enq.size).sum}") 397499caf4cSXuan Hu println(s"[SchedulerMemImp] ldAddrIQs.size: ${ldAddrIQs.size }, enq.size: ${ldAddrIQs.map(_.io.enq.size).sum}") 398499caf4cSXuan Hu println(s"[SchedulerMemImp] stDataIQs.size: ${stDataIQs.size }, enq.size: ${stDataIQs.map(_.io.enq.size).sum}") 399499caf4cSXuan Hu println(s"[SchedulerMemImp] hyuIQs.size: ${hyuIQs.size }, enq.size: ${hyuIQs.map(_.io.enq.size).sum}") 400730cfbc0SXuan Hu require(memAddrIQs.nonEmpty && stDataIQs.nonEmpty) 401730cfbc0SXuan Hu 402853cd2d8SHaojin Tang io.toMem.get.loadFastMatch := 0.U.asTypeOf(io.toMem.get.loadFastMatch) // TODO: is still needed? 403853cd2d8SHaojin Tang 404fc45ed13SXuan Hu private val loadWakeUp = issueQueues.filter(_.params.LdExuCnt > 0).map(_.asInstanceOf[IssueQueueMemAddrImp].io.memIO.get.loadWakeUp).flatten 405596af5d2SHaojin Tang require(loadWakeUp.length == io.fromMem.get.wakeup.length) 406596af5d2SHaojin Tang loadWakeUp.zip(io.fromMem.get.wakeup).foreach(x => x._1 := x._2) 407596af5d2SHaojin Tang 408730cfbc0SXuan Hu memAddrIQs.zipWithIndex.foreach { case (iq, i) => 409730cfbc0SXuan Hu iq.io.flush <> io.fromCtrlBlock.flush 410e600b1ddSxiaofeibao-xjtu if (!iq.params.needLoadDependency) { 411e600b1ddSxiaofeibao-xjtu iq.io.enq.map(x => x.bits.srcLoadDependency := 0.U.asTypeOf(x.bits.srcLoadDependency)) 412e600b1ddSxiaofeibao-xjtu } 41360f0c5aeSxiaofeibao iq.io.wakeupFromWB.zip( 41460f0c5aeSxiaofeibao wakeupFromIntWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 41560f0c5aeSxiaofeibao wakeupFromFpWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 416c720aa49Ssinsanction wakeupFromVfWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 417c720aa49Ssinsanction wakeupFromV0WBVec.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 418c720aa49Ssinsanction wakeupFromVlWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1) 41960f0c5aeSxiaofeibao ).foreach{ case (sink, source) => sink := source} 420*9df83ee5Sxiaofeibao iq.io.wakeupFromWBDelayed.zip( 421*9df83ee5Sxiaofeibao wakeupFromIntWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 422*9df83ee5Sxiaofeibao wakeupFromFpWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 423*9df83ee5Sxiaofeibao wakeupFromVfWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 424*9df83ee5Sxiaofeibao wakeupFromV0WBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 425*9df83ee5Sxiaofeibao wakeupFromVlWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1) 426*9df83ee5Sxiaofeibao ).foreach { case (sink, source) => sink := source } 427730cfbc0SXuan Hu } 428730cfbc0SXuan Hu 429ecfc6f16SXuan Hu ldAddrIQs.zipWithIndex.foreach { 430ecfc6f16SXuan Hu case (imp: IssueQueueMemAddrImp, i) => 431ecfc6f16SXuan Hu imp.io.memIO.get.feedbackIO.head := 0.U.asTypeOf(imp.io.memIO.get.feedbackIO.head) 432c14e89f4SHaojin Tang imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr 433de784418SXuan Hu imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 4347b753bebSXuan Hu case _ => 4357b753bebSXuan Hu } 4367b753bebSXuan Hu 437ecfc6f16SXuan Hu stAddrIQs.zipWithIndex.foreach { 438ecfc6f16SXuan Hu case (imp: IssueQueueMemAddrImp, i) => 439ecfc6f16SXuan Hu imp.io.memIO.get.feedbackIO.head := io.fromMem.get.staFeedback(i) 440c14e89f4SHaojin Tang imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr 441c14e89f4SHaojin Tang imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 4427b753bebSXuan Hu case _ => 4437b753bebSXuan Hu } 444730cfbc0SXuan Hu 445559c1710SHaojin Tang hyuIQs.zip(hyuIQIdxs).foreach { 446559c1710SHaojin Tang case (imp: IssueQueueMemAddrImp, idx) => 447670870b3SXuan Hu imp.io.memIO.get.feedbackIO.head := io.fromMem.get.hyuFeedback.head 448670870b3SXuan Hu imp.io.memIO.get.feedbackIO(1) := 0.U.asTypeOf(imp.io.memIO.get.feedbackIO(1)) 4498f1fa9b1Ssfencevma imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr 4508f1fa9b1Ssfencevma imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 451559c1710SHaojin Tang // TODO: refactor ditry code 452559c1710SHaojin Tang imp.io.deqDelay(1).ready := false.B 453559c1710SHaojin Tang io.toDataPathAfterDelay(idx)(1).valid := false.B 454559c1710SHaojin Tang io.toDataPathAfterDelay(idx)(1).bits := 0.U.asTypeOf(io.toDataPathAfterDelay(idx)(1).bits) 4558f1fa9b1Ssfencevma case _ => 4568f1fa9b1Ssfencevma } 4578f1fa9b1Ssfencevma 458e62b6911SXuan Hu private val staIdxSeq = (stAddrIQs).map(iq => iq.params.idxInSchBlk) 459e62b6911SXuan Hu private val hyaIdxSeq = (hyuIQs).map(iq => iq.params.idxInSchBlk) 460e62b6911SXuan Hu 461e62b6911SXuan Hu println(s"[SchedulerMemImp] sta iq idx in memSchdBlock: $staIdxSeq") 462e62b6911SXuan Hu println(s"[SchedulerMemImp] hya iq idx in memSchdBlock: $hyaIdxSeq") 463e62b6911SXuan Hu 464e62b6911SXuan Hu private val staEnqs = stAddrIQs.map(_.io.enq).flatten 465e62b6911SXuan Hu private val stdEnqs = stDataIQs.map(_.io.enq).flatten.take(staEnqs.size) 466e62b6911SXuan Hu private val hyaEnqs = hyuIQs.map(_.io.enq).flatten 467e62b6911SXuan Hu private val hydEnqs = stDataIQs.map(_.io.enq).flatten.drop(staEnqs.size) 468e62b6911SXuan Hu 469e62b6911SXuan Hu require(staEnqs.size == stdEnqs.size, s"number of enq ports of store address IQs(${staEnqs.size}) " + 470e62b6911SXuan Hu s"should be equal to number of enq ports of store data IQs(${stdEnqs.size})") 471e62b6911SXuan Hu 472e62b6911SXuan Hu require(hyaEnqs.size == hydEnqs.size, s"number of enq ports of hybrid address IQs(${hyaEnqs.size}) " + 473e62b6911SXuan Hu s"should be equal to number of enq ports of hybrid data IQs(${hydEnqs.size})") 4749b258a00Sxgkiri 475e62b6911SXuan Hu stDataIQs.zipWithIndex.foreach { case (iq, i) => 476e62b6911SXuan Hu iq.io.flush <> io.fromCtrlBlock.flush 47760f0c5aeSxiaofeibao iq.io.wakeupFromWB.zip( 47860f0c5aeSxiaofeibao wakeupFromIntWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 47960f0c5aeSxiaofeibao wakeupFromFpWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 480c720aa49Ssinsanction wakeupFromVfWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 481c720aa49Ssinsanction wakeupFromV0WBVec.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 482c720aa49Ssinsanction wakeupFromVlWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq 48360f0c5aeSxiaofeibao ).foreach{ case (sink, source) => sink := source} 484*9df83ee5Sxiaofeibao iq.io.wakeupFromWBDelayed.zip( 485*9df83ee5Sxiaofeibao wakeupFromIntWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 486*9df83ee5Sxiaofeibao wakeupFromFpWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 487*9df83ee5Sxiaofeibao wakeupFromVfWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 488*9df83ee5Sxiaofeibao wakeupFromV0WBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 489*9df83ee5Sxiaofeibao wakeupFromVlWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq 490*9df83ee5Sxiaofeibao ).foreach { case (sink, source) => sink := source } 4910a7d1d5cSxiaofeibao // here disable fp load fast wakeup to std, and no FEX wakeup to std 4920a7d1d5cSxiaofeibao iq.io.wakeupFromIQ.map(_.bits.fpWen := false.B) 493e62b6911SXuan Hu } 494e62b6911SXuan Hu 495e62b6911SXuan Hu (stdEnqs ++ hydEnqs).zip(staEnqs ++ hyaEnqs).zipWithIndex.foreach { case ((stdIQEnq, staIQEnq), i) => 4960a7d1d5cSxiaofeibao stdIQEnq.valid := staIQEnq.valid && FuType.FuTypeOrR(staIQEnq.bits.fuType, FuType.stu, FuType.mou) 497730cfbc0SXuan Hu stdIQEnq.bits := staIQEnq.bits 498730cfbc0SXuan Hu // Store data reuses store addr src(1) in dispatch2iq 499e62b6911SXuan Hu // [dispatch2iq] --src*------src*(0)--> [staIQ|hyaIQ] 500730cfbc0SXuan Hu // \ 501730cfbc0SXuan Hu // ---src*(1)--> [stdIQ] 502730cfbc0SXuan Hu // Since the src(1) of sta is easier to get, stdIQEnq.bits.src*(0) is assigned to staIQEnq.bits.src*(1) 503730cfbc0SXuan Hu // instead of dispatch2Iq.io.out(x).bits.src*(1) 50497b279b9SXuan Hu val stdIdx = 1 5052d270511Ssinsanction stdIQEnq.bits.srcState(0) := staIQEnq.bits.srcState(stdIdx) 506955b4beaSsinsanction stdIQEnq.bits.srcLoadDependency(0) := staIQEnq.bits.srcLoadDependency(stdIdx) 5072d270511Ssinsanction stdIQEnq.bits.srcType(0) := staIQEnq.bits.srcType(stdIdx) 5082d270511Ssinsanction stdIQEnq.bits.psrc(0) := staIQEnq.bits.psrc(stdIdx) 509730cfbc0SXuan Hu stdIQEnq.bits.sqIdx := staIQEnq.bits.sqIdx 510955b4beaSsinsanction stdIQEnq.bits.useRegCache(0) := staIQEnq.bits.useRegCache(stdIdx) 511955b4beaSsinsanction stdIQEnq.bits.regCacheIdx(0) := staIQEnq.bits.regCacheIdx(stdIdx) 512730cfbc0SXuan Hu } 513730cfbc0SXuan Hu 5142d270511Ssinsanction vecMemIQs.foreach { 5152d270511Ssinsanction case imp: IssueQueueVecMemImp => 5162d270511Ssinsanction imp.io.memIO.get.sqDeqPtr.foreach(_ := io.fromMem.get.sqDeqPtr) 5172d270511Ssinsanction imp.io.memIO.get.lqDeqPtr.foreach(_ := io.fromMem.get.lqDeqPtr) 5181f3d1b4dSXuan Hu // not used 519b7c799beSzhanglyGit //imp.io.memIO.get.feedbackIO.head := io.fromMem.get.vstuFeedback.head // only vector store replay 5201f3d1b4dSXuan Hu // maybe not used 5211f3d1b4dSXuan Hu imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr 5221f3d1b4dSXuan Hu imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 52360f0c5aeSxiaofeibao imp.io.wakeupFromWB.zip( 52460f0c5aeSxiaofeibao wakeupFromIntWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 52560f0c5aeSxiaofeibao wakeupFromFpWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 526c720aa49Ssinsanction wakeupFromVfWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 527c720aa49Ssinsanction wakeupFromV0WBVec.zipWithIndex.filter(x => imp.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 528c720aa49Ssinsanction wakeupFromVlWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq 52960f0c5aeSxiaofeibao ).foreach{ case (sink, source) => sink := source} 530*9df83ee5Sxiaofeibao imp.io.wakeupFromWBDelayed.zip( 531*9df83ee5Sxiaofeibao wakeupFromIntWBVecDelayed.zipWithIndex.filter(x => imp.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 532*9df83ee5Sxiaofeibao wakeupFromFpWBVecDelayed.zipWithIndex.filter(x => imp.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 533*9df83ee5Sxiaofeibao wakeupFromVfWBVecDelayed.zipWithIndex.filter(x => imp.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 534*9df83ee5Sxiaofeibao wakeupFromV0WBVecDelayed.zipWithIndex.filter(x => imp.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 535*9df83ee5Sxiaofeibao wakeupFromVlWBVecDelayed.zipWithIndex.filter(x => imp.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq 536*9df83ee5Sxiaofeibao ).foreach { case (sink, source) => sink := source } 537f39a61a1SzhanglyGit 5382d270511Ssinsanction case _ => 5392d270511Ssinsanction } 540b7c799beSzhanglyGit val vecMemFeedbackIO: Seq[MemRSFeedbackIO] = vecMemIQs.map { 541b7c799beSzhanglyGit case imp: IssueQueueVecMemImp => 542b7c799beSzhanglyGit imp.io.memIO.get.feedbackIO 543b7c799beSzhanglyGit }.flatten 544b7c799beSzhanglyGit assert(vecMemFeedbackIO.size == io.fromMem.get.vstuFeedback.size, "vecMemFeedback size dont match!") 545b7c799beSzhanglyGit vecMemFeedbackIO.zip(io.fromMem.get.vstuFeedback).foreach{ 546b7c799beSzhanglyGit case (sink, source) => 547b7c799beSzhanglyGit sink := source 548b7c799beSzhanglyGit } 5492d270511Ssinsanction 5500a7d1d5cSxiaofeibao val perfEvents = basePerfEvents 551e1a85e9fSchengguanghui generatePerfEvent() 552730cfbc0SXuan Hu} 553