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 15c720aa49Ssinsanctionimport xiangshan.backend.datapath.WbConfig.V0WB 16c720aa49Ssinsanctionimport xiangshan.backend.regfile.VlPregParams 17955b4beaSsinsanctionimport xiangshan.backend.regcache.RegCacheTagTable 189e12e8edScz4eimport xiangshan.mem.{LsqEnqCtrl, LsqEnqIO, SqPtr, LqPtr} 19*99ce5576Scz4eimport xiangshan.mem.Bundles.MemWaitUpdateReqBundle 20730cfbc0SXuan Hu 21730cfbc0SXuan Husealed trait SchedulerType 22730cfbc0SXuan Hu 23730cfbc0SXuan Hucase class IntScheduler() extends SchedulerType 2460f0c5aeSxiaofeibaocase class FpScheduler() extends SchedulerType 25730cfbc0SXuan Hucase class MemScheduler() extends SchedulerType 26730cfbc0SXuan Hucase class VfScheduler() extends SchedulerType 27730cfbc0SXuan Hucase class NoScheduler() extends SchedulerType 28730cfbc0SXuan Hu 29730cfbc0SXuan Huclass Scheduler(val params: SchdBlockParams)(implicit p: Parameters) extends LazyModule with HasXSParameter { 301ca4a39dSXuan Hu override def shouldBeInlined: Boolean = false 311ca4a39dSXuan Hu 3239c59369SXuan Hu val numIntStateWrite = backendParams.numPregWb(IntData()) 3360f0c5aeSxiaofeibao val numFpStateWrite = backendParams.numPregWb(FpData()) 3439c59369SXuan Hu val numVfStateWrite = backendParams.numPregWb(VecData()) 3507b5cc60Sxiaofeibao val numV0StateWrite = backendParams.numPregWb(V0Data()) 3607b5cc60Sxiaofeibao val numVlStateWrite = backendParams.numPregWb(VlData()) 37730cfbc0SXuan Hu 38730cfbc0SXuan Hu val issueQueue = params.issueBlockParams.map(x => LazyModule(new IssueQueue(x).suggestName(x.getIQName))) 39730cfbc0SXuan Hu 4083ba63b3SXuan Hu lazy val module: SchedulerImpBase = params.schdType match { 41730cfbc0SXuan Hu case IntScheduler() => new SchedulerArithImp(this)(params, p) 4260f0c5aeSxiaofeibao case FpScheduler() => new SchedulerArithImp(this)(params, p) 43730cfbc0SXuan Hu case MemScheduler() => new SchedulerMemImp(this)(params, p) 44730cfbc0SXuan Hu case VfScheduler() => new SchedulerArithImp(this)(params, p) 45730cfbc0SXuan Hu case _ => null 46730cfbc0SXuan Hu } 47730cfbc0SXuan Hu} 48730cfbc0SXuan Hu 497f8233d5SHaojin Tangclass SchedulerIO()(implicit params: SchdBlockParams, p: Parameters) extends XSBundle { 5068d13085SXuan Hu // params alias 517f8233d5SHaojin Tang private val LoadQueueSize = VirtualLoadQueueSize 520a7d1d5cSxiaofeibao val fromDispatchUopNum = params.issueBlockParams.filter(x => x.StdCnt == 0).map(_.numEnq).sum 530a7d1d5cSxiaofeibao val allIssueParams = params.issueBlockParams.filter(_.StdCnt == 0) 540a7d1d5cSxiaofeibao val IssueQueueDeqSum = allIssueParams.map(_.numDeq).sum 550a7d1d5cSxiaofeibao val maxIQSize = allIssueParams.map(_.numEntries).max 56730cfbc0SXuan Hu val fromTop = new Bundle { 57730cfbc0SXuan Hu val hartId = Input(UInt(8.W)) 58730cfbc0SXuan Hu } 592e0a7dc5Sfdy val fromWbFuBusyTable = new Bundle{ 602e0a7dc5Sfdy val fuBusyTableRead = MixedVec(params.issueBlockParams.map(x => Input(x.genWbFuBusyTableReadBundle))) 612e0a7dc5Sfdy } 62dd970561SzhanglyGit val wbFuBusyTable = MixedVec(params.issueBlockParams.map(x => Output(x.genWbFuBusyTableWriteBundle))) 630a7d1d5cSxiaofeibao val IQValidNumVec = Output(Vec(IssueQueueDeqSum, UInt((maxIQSize).U.getWidth.W))) 64dd970561SzhanglyGit 65730cfbc0SXuan Hu val fromCtrlBlock = new Bundle { 66730cfbc0SXuan Hu val flush = Flipped(ValidIO(new Redirect)) 67730cfbc0SXuan Hu } 68730cfbc0SXuan Hu val fromDispatch = new Bundle { 690a7d1d5cSxiaofeibao val uops = Vec(fromDispatchUopNum, Flipped(DecoupledIO(new DynInst))) 70730cfbc0SXuan Hu } 7139c59369SXuan Hu val intWriteBack = MixedVec(Vec(backendParams.numPregWb(IntData()), 72730cfbc0SXuan Hu new RfWritePortWithConfig(backendParams.intPregParams.dataCfg, backendParams.intPregParams.addrWidth))) 7360f0c5aeSxiaofeibao val fpWriteBack = MixedVec(Vec(backendParams.numPregWb(FpData()), 7460f0c5aeSxiaofeibao new RfWritePortWithConfig(backendParams.fpPregParams.dataCfg, backendParams.fpPregParams.addrWidth))) 7539c59369SXuan Hu val vfWriteBack = MixedVec(Vec(backendParams.numPregWb(VecData()), 76730cfbc0SXuan Hu new RfWritePortWithConfig(backendParams.vfPregParams.dataCfg, backendParams.vfPregParams.addrWidth))) 7707b5cc60Sxiaofeibao val v0WriteBack = MixedVec(Vec(backendParams.numPregWb(V0Data()), 78c720aa49Ssinsanction new RfWritePortWithConfig(backendParams.v0PregParams.dataCfg, backendParams.v0PregParams.addrWidth))) 7907b5cc60Sxiaofeibao val vlWriteBack = MixedVec(Vec(backendParams.numPregWb(VlData()), 80c720aa49Ssinsanction new RfWritePortWithConfig(backendParams.vlPregParams.dataCfg, backendParams.vlPregParams.addrWidth))) 819df83ee5Sxiaofeibao val intWriteBackDelayed = MixedVec(Vec(backendParams.numPregWb(IntData()), 829df83ee5Sxiaofeibao new RfWritePortWithConfig(backendParams.intPregParams.dataCfg, backendParams.intPregParams.addrWidth))) 839df83ee5Sxiaofeibao val fpWriteBackDelayed = MixedVec(Vec(backendParams.numPregWb(FpData()), 849df83ee5Sxiaofeibao new RfWritePortWithConfig(backendParams.fpPregParams.dataCfg, backendParams.fpPregParams.addrWidth))) 859df83ee5Sxiaofeibao val vfWriteBackDelayed = MixedVec(Vec(backendParams.numPregWb(VecData()), 869df83ee5Sxiaofeibao new RfWritePortWithConfig(backendParams.vfPregParams.dataCfg, backendParams.vfPregParams.addrWidth))) 879df83ee5Sxiaofeibao val v0WriteBackDelayed = MixedVec(Vec(backendParams.numPregWb(V0Data()), 889df83ee5Sxiaofeibao new RfWritePortWithConfig(backendParams.v0PregParams.dataCfg, backendParams.v0PregParams.addrWidth))) 899df83ee5Sxiaofeibao val vlWriteBackDelayed = MixedVec(Vec(backendParams.numPregWb(VlData()), 909df83ee5Sxiaofeibao new RfWritePortWithConfig(backendParams.vlPregParams.dataCfg, backendParams.vlPregParams.addrWidth))) 9159ef6009Sxiaofeibao-xjtu val toDataPathAfterDelay: MixedVec[MixedVec[DecoupledIO[IssueQueueIssueBundle]]] = MixedVec(params.issueBlockParams.map(_.genIssueDecoupledBundle)) 92730cfbc0SXuan Hu 93c720aa49Ssinsanction val vlWriteBackInfo = new Bundle { 94d88d4328SZiyue Zhang val vlFromIntIsZero = Input(Bool()) 95d88d4328SZiyue Zhang val vlFromIntIsVlmax = Input(Bool()) 96d88d4328SZiyue Zhang val vlFromVfIsZero = Input(Bool()) 97d88d4328SZiyue Zhang val vlFromVfIsVlmax = Input(Bool()) 98b6279fc6SZiyue Zhang } 99b6279fc6SZiyue Zhang 100bf35baadSXuan Hu val fromSchedulers = new Bundle { 101c0be7f33SXuan Hu val wakeupVec: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpInValidBundle) 1029df83ee5Sxiaofeibao val wakeupVecDelayed: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpInValidBundle) 103bf35baadSXuan Hu } 104bf35baadSXuan Hu 105bf35baadSXuan Hu val toSchedulers = new Bundle { 106c0be7f33SXuan Hu val wakeupVec: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = params.genIQWakeUpOutValidBundle 107bf35baadSXuan Hu } 108bf35baadSXuan Hu 109c0be7f33SXuan Hu val fromDataPath = new Bundle { 11010fe9778SXuan Hu val resp: MixedVec[MixedVec[OGRespBundle]] = MixedVec(params.issueBlockParams.map(x => Flipped(x.genOGRespBundle))) 111be9ff987Ssinsanction val og0Cancel = Input(ExuVec()) 112ea46c302SXuan Hu // Todo: remove this after no cancel signal from og1 113be9ff987Ssinsanction val og1Cancel = Input(ExuVec()) 114f8b278aaSsinsanction // replace RCIdx to Wakeup Queue 115f8b278aaSsinsanction val replaceRCIdx = OptionWrapper(params.needWriteRegCache, Vec(params.numWriteRegCache, Input(UInt(RegCacheIdxWidth.W)))) 116c0be7f33SXuan Hu // just be compatible to old code 117c0be7f33SXuan Hu def apply(i: Int)(j: Int) = resp(i)(j) 118c0be7f33SXuan Hu } 119c0be7f33SXuan Hu 1208a66c02cSXuan Hu val loadFinalIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.LdExuCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x))))))) 1213bba894fSxiaofeibao val vecLoadFinalIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.VlduCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x))))))) 1228a66c02cSXuan Hu val memAddrIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.LdExuCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x))))))) 1237e471bf8SXuan Hu val vecLoadIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.VlduCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x))))))) 1240f55a0d3SHaojin Tang 1256810d1e8Ssfencevma val ldCancel = Vec(backendParams.LduCnt + backendParams.HyuCnt, Flipped(new LoadCancelIO)) 126c0be7f33SXuan Hu 127730cfbc0SXuan Hu val fromMem = if (params.isMemSchd) Some(new Bundle { 1287b753bebSXuan Hu val ldaFeedback = Flipped(Vec(params.LduCnt, new MemRSFeedbackIO)) 1297b753bebSXuan Hu val staFeedback = Flipped(Vec(params.StaCnt, new MemRSFeedbackIO)) 1308f1fa9b1Ssfencevma val hyuFeedback = Flipped(Vec(params.HyuCnt, new MemRSFeedbackIO)) 131fd490615Sweiding liu val vstuFeedback = Flipped(Vec(params.VstuCnt, new MemRSFeedbackIO(isVector = true))) 132fd490615Sweiding liu val vlduFeedback = Flipped(Vec(params.VlduCnt, new MemRSFeedbackIO(isVector = true))) 133730cfbc0SXuan Hu val stIssuePtr = Input(new SqPtr()) 134730cfbc0SXuan Hu val lcommit = Input(UInt(log2Up(CommitWidth + 1).W)) 135730cfbc0SXuan Hu val scommit = Input(UInt(log2Ceil(EnsbufferWidth + 1).W)) // connected to `memBlock.io.sqDeq` instead of ROB 136fc45ed13SXuan Hu val wakeup = Vec(params.LdExuCnt, Flipped(Valid(new DynInst))) 1372d270511Ssinsanction val lqDeqPtr = Input(new LqPtr) 1382d270511Ssinsanction val sqDeqPtr = Input(new SqPtr) 139730cfbc0SXuan Hu // from lsq 140730cfbc0SXuan Hu val lqCancelCnt = Input(UInt(log2Up(LoadQueueSize + 1).W)) 141730cfbc0SXuan Hu val sqCancelCnt = Input(UInt(log2Up(StoreQueueSize + 1).W)) 142*99ce5576Scz4e val memWaitUpdateReq = Flipped(new MemWaitUpdateReqBundle) 143730cfbc0SXuan Hu }) else None 144730cfbc0SXuan Hu val toMem = if (params.isMemSchd) Some(new Bundle { 145730cfbc0SXuan Hu val loadFastMatch = Output(Vec(params.LduCnt, new IssueQueueLoadBundle)) 146730cfbc0SXuan Hu }) else None 14742b6cdf9Ssinsanction val fromOg2Resp = if(params.needOg2Resp) Some(MixedVec(params.issueBlockParams.filter(_.needOg2Resp).map(x => Flipped(x.genOG2RespBundle)))) else None 148730cfbc0SXuan Hu} 149730cfbc0SXuan Hu 150730cfbc0SXuan Huabstract class SchedulerImpBase(wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters) 151730cfbc0SXuan Hu extends LazyModuleImp(wrapper) 152730cfbc0SXuan Hu with HasXSParameter 153730cfbc0SXuan Hu{ 154730cfbc0SXuan Hu val io = IO(new SchedulerIO()) 155730cfbc0SXuan Hu 156730cfbc0SXuan Hu // alias 157c0be7f33SXuan Hu private val iqWakeUpInMap: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] = 158c0be7f33SXuan Hu io.fromSchedulers.wakeupVec.map(x => (x.bits.exuIdx, x)).toMap 1599df83ee5Sxiaofeibao private val iqWakeUpInMapDelayed: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] = 1609df83ee5Sxiaofeibao io.fromSchedulers.wakeupVecDelayed.map(x => (x.bits.exuIdx, x)).toMap 161730cfbc0SXuan Hu private val schdType = params.schdType 162730cfbc0SXuan Hu 163730cfbc0SXuan Hu // Modules 164730cfbc0SXuan Hu val issueQueues: Seq[IssueQueueImp] = wrapper.issueQueue.map(_.module) 165730cfbc0SXuan Hu 1660a7d1d5cSxiaofeibao io.IQValidNumVec := issueQueues.filter(_.params.StdCnt == 0).map(_.io.validCntDeqVec).flatten 167f39a61a1SzhanglyGit val wakeupFromIntWBVec = Wire(params.genIntWBWakeUpSinkValidBundle) 16860f0c5aeSxiaofeibao val wakeupFromFpWBVec = Wire(params.genFpWBWakeUpSinkValidBundle) 169f39a61a1SzhanglyGit val wakeupFromVfWBVec = Wire(params.genVfWBWakeUpSinkValidBundle) 170c720aa49Ssinsanction val wakeupFromV0WBVec = Wire(params.genV0WBWakeUpSinkValidBundle) 171c720aa49Ssinsanction val wakeupFromVlWBVec = Wire(params.genVlWBWakeUpSinkValidBundle) 1729df83ee5Sxiaofeibao val wakeupFromIntWBVecDelayed = Wire(params.genIntWBWakeUpSinkValidBundle) 1739df83ee5Sxiaofeibao val wakeupFromFpWBVecDelayed = Wire(params.genFpWBWakeUpSinkValidBundle) 1749df83ee5Sxiaofeibao val wakeupFromVfWBVecDelayed = Wire(params.genVfWBWakeUpSinkValidBundle) 1759df83ee5Sxiaofeibao val wakeupFromV0WBVecDelayed = Wire(params.genV0WBWakeUpSinkValidBundle) 1769df83ee5Sxiaofeibao val wakeupFromVlWBVecDelayed = Wire(params.genVlWBWakeUpSinkValidBundle) 177f39a61a1SzhanglyGit 1789df83ee5Sxiaofeibao val wakeupFromWBVec = Seq(wakeupFromIntWBVec, wakeupFromFpWBVec, wakeupFromVfWBVec, wakeupFromV0WBVec, wakeupFromVlWBVec) 1799df83ee5Sxiaofeibao val allWriteBack = Seq(io.intWriteBack, io.fpWriteBack, io.vfWriteBack, io.v0WriteBack, io.vlWriteBack) 1809df83ee5Sxiaofeibao wakeupFromWBVec.zip(allWriteBack).map{ case (sinks, sources) => 1819df83ee5Sxiaofeibao sinks.zip(sources).map{ case (sink, source) => 182f39a61a1SzhanglyGit sink.valid := source.wen 183f39a61a1SzhanglyGit sink.bits.rfWen := source.intWen 184f39a61a1SzhanglyGit sink.bits.fpWen := source.fpWen 185f39a61a1SzhanglyGit sink.bits.vecWen := source.vecWen 186c720aa49Ssinsanction sink.bits.v0Wen := source.v0Wen 187c720aa49Ssinsanction sink.bits.vlWen := source.vlWen 188f39a61a1SzhanglyGit sink.bits.pdest := source.addr 189730cfbc0SXuan Hu } 1909df83ee5Sxiaofeibao } 191f39a61a1SzhanglyGit 1929df83ee5Sxiaofeibao val wakeupFromWBVecDelayed = Seq(wakeupFromIntWBVecDelayed, wakeupFromFpWBVecDelayed, wakeupFromVfWBVecDelayed, wakeupFromV0WBVecDelayed, wakeupFromVlWBVecDelayed) 1939df83ee5Sxiaofeibao val allWriteBackDelayed = Seq(io.intWriteBackDelayed, io.fpWriteBackDelayed, io.vfWriteBackDelayed, io.v0WriteBackDelayed, io.vlWriteBackDelayed) 1949df83ee5Sxiaofeibao wakeupFromWBVecDelayed.zip(allWriteBackDelayed).map { case (sinks, sources) => 1959df83ee5Sxiaofeibao sinks.zip(sources).map { case (sink, source) => 19660f0c5aeSxiaofeibao sink.valid := source.wen 19760f0c5aeSxiaofeibao sink.bits.rfWen := source.intWen 19860f0c5aeSxiaofeibao sink.bits.fpWen := source.fpWen 19960f0c5aeSxiaofeibao sink.bits.vecWen := source.vecWen 200c720aa49Ssinsanction sink.bits.v0Wen := source.v0Wen 201c720aa49Ssinsanction sink.bits.vlWen := source.vlWen 20260f0c5aeSxiaofeibao sink.bits.pdest := source.addr 20360f0c5aeSxiaofeibao } 204c720aa49Ssinsanction } 205bf35baadSXuan Hu // Connect bundles having the same wakeup source 20659ef6009Sxiaofeibao-xjtu issueQueues.zipWithIndex.foreach { case(iq, i) => 207bf35baadSXuan Hu iq.io.wakeupFromIQ.foreach { wakeUp => 2080c7ebb58Sxiaofeibao-xjtu val wakeUpIn = iqWakeUpInMap(wakeUp.bits.exuIdx) 2090c7ebb58Sxiaofeibao-xjtu val exuIdx = wakeUp.bits.exuIdx 2100c7ebb58Sxiaofeibao-xjtu println(s"[Backend] Connect wakeup exuIdx ${exuIdx}") 2110c7ebb58Sxiaofeibao-xjtu connectSamePort(wakeUp,wakeUpIn) 2120c7ebb58Sxiaofeibao-xjtu backendParams.connectWakeup(exuIdx) 2130c7ebb58Sxiaofeibao-xjtu if (backendParams.isCopyPdest(exuIdx)) { 2140c7ebb58Sxiaofeibao-xjtu println(s"[Backend] exuIdx ${exuIdx} use pdestCopy ${backendParams.getCopyPdestIndex(exuIdx)}") 2150c7ebb58Sxiaofeibao-xjtu wakeUp.bits.pdest := wakeUpIn.bits.pdestCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 2164c5a0d77Sxiaofeibao-xjtu if (wakeUpIn.bits.rfWenCopy.nonEmpty) wakeUp.bits.rfWen := wakeUpIn.bits.rfWenCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 2174c5a0d77Sxiaofeibao-xjtu if (wakeUpIn.bits.fpWenCopy.nonEmpty) wakeUp.bits.fpWen := wakeUpIn.bits.fpWenCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 2184c5a0d77Sxiaofeibao-xjtu if (wakeUpIn.bits.vecWenCopy.nonEmpty) wakeUp.bits.vecWen := wakeUpIn.bits.vecWenCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 219c720aa49Ssinsanction if (wakeUpIn.bits.v0WenCopy.nonEmpty) wakeUp.bits.v0Wen := wakeUpIn.bits.v0WenCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 220c720aa49Ssinsanction if (wakeUpIn.bits.vlWenCopy.nonEmpty) wakeUp.bits.vlWen := wakeUpIn.bits.vlWenCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 2214c5a0d77Sxiaofeibao-xjtu if (wakeUpIn.bits.loadDependencyCopy.nonEmpty) wakeUp.bits.loadDependency := wakeUpIn.bits.loadDependencyCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 2220c7ebb58Sxiaofeibao-xjtu } 22360912d84Sxiaofeibao-xjtu if (iq.params.numIntSrc == 0) wakeUp.bits.rfWen := false.B 22460f0c5aeSxiaofeibao if (iq.params.numFpSrc == 0) wakeUp.bits.fpWen := false.B 22560912d84Sxiaofeibao-xjtu if (iq.params.numVfSrc == 0) wakeUp.bits.vecWen := false.B 226c720aa49Ssinsanction if (iq.params.numV0Src == 0) wakeUp.bits.v0Wen := false.B 227c720aa49Ssinsanction if (iq.params.numVlSrc == 0) wakeUp.bits.vlWen := false.B 228bf35baadSXuan Hu } 2299df83ee5Sxiaofeibao iq.io.wakeupFromIQDelayed.foreach { wakeUp => 2309df83ee5Sxiaofeibao val wakeUpIn = iqWakeUpInMapDelayed(wakeUp.bits.exuIdx) 2319df83ee5Sxiaofeibao connectSamePort(wakeUp, wakeUpIn) 2329df83ee5Sxiaofeibao if (iq.params.numIntSrc == 0) wakeUp.bits.rfWen := false.B 2339df83ee5Sxiaofeibao if (iq.params.numFpSrc == 0) wakeUp.bits.fpWen := false.B 2349df83ee5Sxiaofeibao if (iq.params.numVfSrc == 0) wakeUp.bits.vecWen := false.B 2359df83ee5Sxiaofeibao if (iq.params.numV0Src == 0) wakeUp.bits.v0Wen := false.B 2369df83ee5Sxiaofeibao if (iq.params.numVlSrc == 0) wakeUp.bits.vlWen := false.B 2379df83ee5Sxiaofeibao } 238ea46c302SXuan Hu iq.io.og0Cancel := io.fromDataPath.og0Cancel 239ea46c302SXuan Hu iq.io.og1Cancel := io.fromDataPath.og1Cancel 240e600b1ddSxiaofeibao-xjtu if (iq.params.needLoadDependency) 2410f55a0d3SHaojin Tang iq.io.ldCancel := io.ldCancel 242e600b1ddSxiaofeibao-xjtu else 243e600b1ddSxiaofeibao-xjtu iq.io.ldCancel := 0.U.asTypeOf(io.ldCancel) 244bf35baadSXuan Hu } 245bf35baadSXuan Hu 246b6279fc6SZiyue Zhang // connect the vl writeback informatino to the issue queues 247b6279fc6SZiyue Zhang issueQueues.zipWithIndex.foreach { case(iq, i) => 248d88d4328SZiyue Zhang iq.io.vlFromIntIsVlmax := io.vlWriteBackInfo.vlFromIntIsVlmax 249d88d4328SZiyue Zhang iq.io.vlFromIntIsZero := io.vlWriteBackInfo.vlFromIntIsZero 250d88d4328SZiyue Zhang iq.io.vlFromVfIsVlmax := io.vlWriteBackInfo.vlFromVfIsVlmax 251d88d4328SZiyue Zhang iq.io.vlFromVfIsZero := io.vlWriteBackInfo.vlFromVfIsZero 252b6279fc6SZiyue Zhang } 253b6279fc6SZiyue Zhang 254c0be7f33SXuan Hu private val iqWakeUpOutMap: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] = 255bf35baadSXuan Hu issueQueues.flatMap(_.io.wakeupToIQ) 256c0be7f33SXuan Hu .map(x => (x.bits.exuIdx, x)) 257bf35baadSXuan Hu .toMap 258bf35baadSXuan Hu 259bf35baadSXuan Hu // Connect bundles having the same wakeup source 260bf35baadSXuan Hu io.toSchedulers.wakeupVec.foreach { wakeUp => 261c0be7f33SXuan Hu wakeUp := iqWakeUpOutMap(wakeUp.bits.exuIdx) 262bf35baadSXuan Hu } 263bf35baadSXuan Hu 26459ef6009Sxiaofeibao-xjtu io.toDataPathAfterDelay.zipWithIndex.foreach { case (toDpDy, i) => 26559ef6009Sxiaofeibao-xjtu toDpDy <> issueQueues(i).io.deqDelay 26659ef6009Sxiaofeibao-xjtu } 267bf35baadSXuan Hu 268f99b81adSHaojin Tang // Response 269f99b81adSHaojin Tang issueQueues.zipWithIndex.foreach { case (iq, i) => 270f99b81adSHaojin Tang iq.io.og0Resp.zipWithIndex.foreach { case (og0Resp, j) => 271f99b81adSHaojin Tang og0Resp := io.fromDataPath(i)(j).og0resp 272f99b81adSHaojin Tang } 273f99b81adSHaojin Tang iq.io.og1Resp.zipWithIndex.foreach { case (og1Resp, j) => 274f99b81adSHaojin Tang og1Resp := io.fromDataPath(i)(j).og1resp 275f99b81adSHaojin Tang } 276f99b81adSHaojin Tang iq.io.finalIssueResp.foreach(_.zipWithIndex.foreach { case (finalIssueResp, j) => 2773bba894fSxiaofeibao if (io.loadFinalIssueResp(i).isDefinedAt(j) && iq.params.isLdAddrIQ) { 278f99b81adSHaojin Tang finalIssueResp := io.loadFinalIssueResp(i)(j) 2793bba894fSxiaofeibao } else if (io.vecLoadFinalIssueResp(i).isDefinedAt(j) && iq.params.isVecLduIQ) { 2803bba894fSxiaofeibao finalIssueResp := io.vecLoadFinalIssueResp(i)(j) 2813bba894fSxiaofeibao } 2823bba894fSxiaofeibao else { 283670870b3SXuan Hu finalIssueResp := 0.U.asTypeOf(finalIssueResp) 284670870b3SXuan Hu } 285f99b81adSHaojin Tang }) 286e8800897SXuan Hu iq.io.memAddrIssueResp.foreach(_.zipWithIndex.foreach { case (memAddrIssueResp, j) => 287aa2bcc31SzhanglyGit if (io.memAddrIssueResp(i).isDefinedAt(j)) { 288e8800897SXuan Hu memAddrIssueResp := io.memAddrIssueResp(i)(j) 289aa2bcc31SzhanglyGit } else { 290aa2bcc31SzhanglyGit memAddrIssueResp := 0.U.asTypeOf(memAddrIssueResp) 291aa2bcc31SzhanglyGit } 292e8800897SXuan Hu }) 2937e471bf8SXuan Hu iq.io.vecLoadIssueResp.foreach(_.zipWithIndex.foreach { case (resp, deqIdx) => 2947e471bf8SXuan Hu resp := io.vecLoadIssueResp(i)(deqIdx) 2957e471bf8SXuan Hu }) 296f99b81adSHaojin Tang iq.io.wbBusyTableRead := io.fromWbFuBusyTable.fuBusyTableRead(i) 297f99b81adSHaojin Tang io.wbFuBusyTable(i) := iq.io.wbBusyTableWrite 298f8b278aaSsinsanction iq.io.replaceRCIdx.foreach(x => x := 0.U.asTypeOf(x)) 299f8b278aaSsinsanction } 30042b6cdf9Ssinsanction if (params.needOg2Resp) { 30142b6cdf9Ssinsanction issueQueues.filter(_.params.needOg2Resp).zip(io.fromOg2Resp.get).foreach{ case (iq, og2RespVec) => 30242b6cdf9Ssinsanction iq.io.og2Resp.get.zip(og2RespVec).foreach{ case (iqOg2Resp, og2Resp) => 30342b6cdf9Ssinsanction iqOg2Resp := og2Resp 30442b6cdf9Ssinsanction } 30542b6cdf9Ssinsanction } 30642b6cdf9Ssinsanction } 307f8b278aaSsinsanction 308f8b278aaSsinsanction // Connect each replace RCIdx to IQ 309f8b278aaSsinsanction if (params.needWriteRegCache) { 310f8b278aaSsinsanction val iqReplaceRCIdxVec = issueQueues.filter(_.params.needWriteRegCache).flatMap{ iq => 311f8b278aaSsinsanction iq.params.allExuParams.zip(iq.io.replaceRCIdx.get).filter(_._1.needWriteRegCache).map(_._2) 312f8b278aaSsinsanction } 313f8b278aaSsinsanction iqReplaceRCIdxVec.zip(io.fromDataPath.replaceRCIdx.get).foreach{ case (iq, in) => 314f8b278aaSsinsanction iq := in 315f8b278aaSsinsanction } 316f8b278aaSsinsanction 317f8b278aaSsinsanction println(s"[Scheduler] numWriteRegCache: ${params.numWriteRegCache}") 318f8b278aaSsinsanction println(s"[Scheduler] iqReplaceRCIdxVec: ${iqReplaceRCIdxVec.size}") 319f99b81adSHaojin Tang } 320f99b81adSHaojin Tang 321e1a85e9fSchengguanghui // perfEvent 322e1a85e9fSchengguanghui val lastCycleIqEnqFireVec = RegNext(VecInit(issueQueues.map(_.io.enq.map(_.fire)).flatten)) 323e1a85e9fSchengguanghui val lastCycleIqFullVec = RegNext(VecInit(issueQueues.map(_.io.enq.head.ready))) 324e1a85e9fSchengguanghui 325e1a85e9fSchengguanghui val issueQueueFullVecPerf = issueQueues.zip(lastCycleIqFullVec)map{ case (iq, full) => (iq.params.getIQName + s"_full", full) } 326e1a85e9fSchengguanghui val basePerfEvents = Seq( 327e1a85e9fSchengguanghui ("issueQueue_enq_fire_cnt", PopCount(lastCycleIqEnqFireVec) ) 328e1a85e9fSchengguanghui ) ++ issueQueueFullVecPerf 329e1a85e9fSchengguanghui 330c0be7f33SXuan Hu println(s"[Scheduler] io.fromSchedulers.wakeupVec: ${io.fromSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}") 331bf35baadSXuan Hu println(s"[Scheduler] iqWakeUpInKeys: ${iqWakeUpInMap.keys}") 332bf35baadSXuan Hu 333bf35baadSXuan Hu println(s"[Scheduler] iqWakeUpOutKeys: ${iqWakeUpOutMap.keys}") 334c0be7f33SXuan Hu println(s"[Scheduler] io.toSchedulers.wakeupVec: ${io.toSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}") 335730cfbc0SXuan Hu} 336730cfbc0SXuan Hu 337730cfbc0SXuan Huclass SchedulerArithImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters) 338730cfbc0SXuan Hu extends SchedulerImpBase(wrapper) 339730cfbc0SXuan Hu with HasXSParameter 340e1a85e9fSchengguanghui with HasPerfEvents 341730cfbc0SXuan Hu{ 3420a7d1d5cSxiaofeibao val issueQueuesUopIn = issueQueues.map(_.io.enq).flatten 3430a7d1d5cSxiaofeibao issueQueuesUopIn.zip(io.fromDispatch.uops).map(x => x._1 <> x._2) 344730cfbc0SXuan Hu issueQueues.zipWithIndex.foreach { case (iq, i) => 345730cfbc0SXuan Hu iq.io.flush <> io.fromCtrlBlock.flush 346e600b1ddSxiaofeibao-xjtu if (!iq.params.needLoadDependency) { 347e600b1ddSxiaofeibao-xjtu iq.io.enq.map(x => x.bits.srcLoadDependency := 0.U.asTypeOf(x.bits.srcLoadDependency)) 348e600b1ddSxiaofeibao-xjtu } 349f39a61a1SzhanglyGit val intWBIQ = params.schdType match { 350f39a61a1SzhanglyGit case IntScheduler() => wakeupFromIntWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1) 35160f0c5aeSxiaofeibao case FpScheduler() => wakeupFromFpWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1) 352c720aa49Ssinsanction case VfScheduler() => (wakeupFromVfWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 353c720aa49Ssinsanction wakeupFromV0WBVec.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 354c720aa49Ssinsanction wakeupFromVlWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1)) 355596af5d2SHaojin Tang case _ => null 356f39a61a1SzhanglyGit } 3579df83ee5Sxiaofeibao val intWBIQDelayed = params.schdType match { 3589df83ee5Sxiaofeibao case IntScheduler() => wakeupFromIntWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1) 3599df83ee5Sxiaofeibao case FpScheduler() => wakeupFromFpWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1) 3609df83ee5Sxiaofeibao case VfScheduler() => (wakeupFromVfWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 3619df83ee5Sxiaofeibao wakeupFromV0WBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 3629df83ee5Sxiaofeibao wakeupFromVlWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1)) 3639df83ee5Sxiaofeibao case _ => null 3649df83ee5Sxiaofeibao } 365f39a61a1SzhanglyGit iq.io.wakeupFromWB.zip(intWBIQ).foreach{ case (sink, source) => sink := source} 3669df83ee5Sxiaofeibao iq.io.wakeupFromWBDelayed.zip(intWBIQDelayed).foreach{ case (sink, source) => sink := source} 367730cfbc0SXuan Hu } 368e1a85e9fSchengguanghui 369e1a85e9fSchengguanghui val perfEvents = basePerfEvents 370e1a85e9fSchengguanghui generatePerfEvent() 371730cfbc0SXuan Hu} 372730cfbc0SXuan Hu 373f99b81adSHaojin Tang// FIXME: Vector mem instructions may not be handled properly! 374730cfbc0SXuan Huclass SchedulerMemImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters) 375730cfbc0SXuan Hu extends SchedulerImpBase(wrapper) 376730cfbc0SXuan Hu with HasXSParameter 377e1a85e9fSchengguanghui with HasPerfEvents 378730cfbc0SXuan Hu{ 379730cfbc0SXuan Hu 3800a7d1d5cSxiaofeibao val issueQueuesUopIn = issueQueues.filter(_.params.StdCnt == 0).map(_.io.enq).flatten 3810a7d1d5cSxiaofeibao issueQueuesUopIn.zip(io.fromDispatch.uops).map(x => x._1 <> x._2) 3820a7d1d5cSxiaofeibao val noStdExuParams = params.issueBlockParams.map(x => Seq.fill(x.numEnq)(x.exuBlockParams)).flatten.filter{x => x.map(!_.hasStdFu).reduce(_ && _)} 3830a7d1d5cSxiaofeibao val staIdx = noStdExuParams.zipWithIndex.filter{x => x._1.map(_.hasStoreAddrFu).reduce(_ || _)}.map(_._2) 3840a7d1d5cSxiaofeibao val staReady = issueQueues.filter(iq => iq.params.StaCnt > 0).map(_.io.enq.map(_.ready)).flatten 3850a7d1d5cSxiaofeibao val stdReady = issueQueues.filter(iq => iq.params.StdCnt > 0).map(_.io.enq.map(_.ready)).flatten 3860a7d1d5cSxiaofeibao staIdx.zipWithIndex.map{ case (sta, i) => { 3870a7d1d5cSxiaofeibao io.fromDispatch.uops(sta).ready := staReady(i) && stdReady(i) 3880a7d1d5cSxiaofeibao }} 3899ab8b572Sxiaofeibao issueQueues.filter(iq => iq.params.StaCnt > 0).map(_.io.enq).flatten.zipWithIndex.map{ case (iq, idx) => 3909ab8b572Sxiaofeibao iq.valid := io.fromDispatch.uops(staIdx(idx)).valid && !io.fromDispatch.uops(staIdx(idx)).bits.isDropAmocasSta 39141eedc8dSlinzhida } 39241eedc8dSlinzhida val staValidFromDispatch = staIdx.map(idx => io.fromDispatch.uops(idx).valid) 393559c1710SHaojin Tang val memAddrIQs = issueQueues.filter(_.params.isMemAddrIQ) 394e07131b2Ssinsanction val stAddrIQs = issueQueues.filter(iq => iq.params.StaCnt > 0) // included in memAddrIQs 395e07131b2Ssinsanction val ldAddrIQs = issueQueues.filter(iq => iq.params.LduCnt > 0) 396e07131b2Ssinsanction val stDataIQs = issueQueues.filter(iq => iq.params.StdCnt > 0) 397559c1710SHaojin Tang val vecMemIQs = issueQueues.filter(_.params.isVecMemIQ) 398559c1710SHaojin Tang val (hyuIQs, hyuIQIdxs) = issueQueues.zipWithIndex.filter(_._1.params.HyuCnt > 0).unzip 399499caf4cSXuan Hu 400499caf4cSXuan Hu println(s"[SchedulerMemImp] memAddrIQs.size: ${memAddrIQs.size}, enq.size: ${memAddrIQs.map(_.io.enq.size).sum}") 401499caf4cSXuan Hu println(s"[SchedulerMemImp] stAddrIQs.size: ${stAddrIQs.size }, enq.size: ${stAddrIQs.map(_.io.enq.size).sum}") 402499caf4cSXuan Hu println(s"[SchedulerMemImp] ldAddrIQs.size: ${ldAddrIQs.size }, enq.size: ${ldAddrIQs.map(_.io.enq.size).sum}") 403499caf4cSXuan Hu println(s"[SchedulerMemImp] stDataIQs.size: ${stDataIQs.size }, enq.size: ${stDataIQs.map(_.io.enq.size).sum}") 404499caf4cSXuan Hu println(s"[SchedulerMemImp] hyuIQs.size: ${hyuIQs.size }, enq.size: ${hyuIQs.map(_.io.enq.size).sum}") 405730cfbc0SXuan Hu require(memAddrIQs.nonEmpty && stDataIQs.nonEmpty) 406730cfbc0SXuan Hu 407853cd2d8SHaojin Tang io.toMem.get.loadFastMatch := 0.U.asTypeOf(io.toMem.get.loadFastMatch) // TODO: is still needed? 408853cd2d8SHaojin Tang 409fc45ed13SXuan Hu private val loadWakeUp = issueQueues.filter(_.params.LdExuCnt > 0).map(_.asInstanceOf[IssueQueueMemAddrImp].io.memIO.get.loadWakeUp).flatten 410596af5d2SHaojin Tang require(loadWakeUp.length == io.fromMem.get.wakeup.length) 411596af5d2SHaojin Tang loadWakeUp.zip(io.fromMem.get.wakeup).foreach(x => x._1 := x._2) 412596af5d2SHaojin Tang 413730cfbc0SXuan Hu memAddrIQs.zipWithIndex.foreach { case (iq, i) => 414730cfbc0SXuan Hu iq.io.flush <> io.fromCtrlBlock.flush 415e600b1ddSxiaofeibao-xjtu if (!iq.params.needLoadDependency) { 416e600b1ddSxiaofeibao-xjtu iq.io.enq.map(x => x.bits.srcLoadDependency := 0.U.asTypeOf(x.bits.srcLoadDependency)) 417e600b1ddSxiaofeibao-xjtu } 41860f0c5aeSxiaofeibao iq.io.wakeupFromWB.zip( 41960f0c5aeSxiaofeibao wakeupFromIntWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 42060f0c5aeSxiaofeibao wakeupFromFpWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 421c720aa49Ssinsanction wakeupFromVfWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 422c720aa49Ssinsanction wakeupFromV0WBVec.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 423c720aa49Ssinsanction wakeupFromVlWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1) 42460f0c5aeSxiaofeibao ).foreach{ case (sink, source) => sink := source} 4259df83ee5Sxiaofeibao iq.io.wakeupFromWBDelayed.zip( 4269df83ee5Sxiaofeibao wakeupFromIntWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 4279df83ee5Sxiaofeibao wakeupFromFpWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 4289df83ee5Sxiaofeibao wakeupFromVfWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 4299df83ee5Sxiaofeibao wakeupFromV0WBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 4309df83ee5Sxiaofeibao wakeupFromVlWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1) 4319df83ee5Sxiaofeibao ).foreach { case (sink, source) => sink := source } 432730cfbc0SXuan Hu } 433730cfbc0SXuan Hu 434ecfc6f16SXuan Hu ldAddrIQs.zipWithIndex.foreach { 435ecfc6f16SXuan Hu case (imp: IssueQueueMemAddrImp, i) => 436ecfc6f16SXuan Hu imp.io.memIO.get.feedbackIO.head := 0.U.asTypeOf(imp.io.memIO.get.feedbackIO.head) 437c14e89f4SHaojin Tang imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr 438de784418SXuan Hu imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 4397b753bebSXuan Hu case _ => 4407b753bebSXuan Hu } 4417b753bebSXuan Hu 442ecfc6f16SXuan Hu stAddrIQs.zipWithIndex.foreach { 443ecfc6f16SXuan Hu case (imp: IssueQueueMemAddrImp, i) => 444ecfc6f16SXuan Hu imp.io.memIO.get.feedbackIO.head := io.fromMem.get.staFeedback(i) 445c14e89f4SHaojin Tang imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr 446c14e89f4SHaojin Tang imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 4477b753bebSXuan Hu case _ => 4487b753bebSXuan Hu } 449730cfbc0SXuan Hu 450559c1710SHaojin Tang hyuIQs.zip(hyuIQIdxs).foreach { 451559c1710SHaojin Tang case (imp: IssueQueueMemAddrImp, idx) => 452670870b3SXuan Hu imp.io.memIO.get.feedbackIO.head := io.fromMem.get.hyuFeedback.head 453670870b3SXuan Hu imp.io.memIO.get.feedbackIO(1) := 0.U.asTypeOf(imp.io.memIO.get.feedbackIO(1)) 4548f1fa9b1Ssfencevma imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr 4558f1fa9b1Ssfencevma imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 456559c1710SHaojin Tang // TODO: refactor ditry code 457559c1710SHaojin Tang imp.io.deqDelay(1).ready := false.B 458559c1710SHaojin Tang io.toDataPathAfterDelay(idx)(1).valid := false.B 459559c1710SHaojin Tang io.toDataPathAfterDelay(idx)(1).bits := 0.U.asTypeOf(io.toDataPathAfterDelay(idx)(1).bits) 4608f1fa9b1Ssfencevma case _ => 4618f1fa9b1Ssfencevma } 4628f1fa9b1Ssfencevma 463e62b6911SXuan Hu private val staIdxSeq = (stAddrIQs).map(iq => iq.params.idxInSchBlk) 464e62b6911SXuan Hu private val hyaIdxSeq = (hyuIQs).map(iq => iq.params.idxInSchBlk) 465e62b6911SXuan Hu 466e62b6911SXuan Hu println(s"[SchedulerMemImp] sta iq idx in memSchdBlock: $staIdxSeq") 467e62b6911SXuan Hu println(s"[SchedulerMemImp] hya iq idx in memSchdBlock: $hyaIdxSeq") 468e62b6911SXuan Hu 469e62b6911SXuan Hu private val staEnqs = stAddrIQs.map(_.io.enq).flatten 470e62b6911SXuan Hu private val stdEnqs = stDataIQs.map(_.io.enq).flatten.take(staEnqs.size) 471e62b6911SXuan Hu private val hyaEnqs = hyuIQs.map(_.io.enq).flatten 472e62b6911SXuan Hu private val hydEnqs = stDataIQs.map(_.io.enq).flatten.drop(staEnqs.size) 473e62b6911SXuan Hu 474e62b6911SXuan Hu require(staEnqs.size == stdEnqs.size, s"number of enq ports of store address IQs(${staEnqs.size}) " + 475e62b6911SXuan Hu s"should be equal to number of enq ports of store data IQs(${stdEnqs.size})") 476e62b6911SXuan Hu 477e62b6911SXuan Hu require(hyaEnqs.size == hydEnqs.size, s"number of enq ports of hybrid address IQs(${hyaEnqs.size}) " + 478e62b6911SXuan Hu s"should be equal to number of enq ports of hybrid data IQs(${hydEnqs.size})") 4799b258a00Sxgkiri 480e62b6911SXuan Hu stDataIQs.zipWithIndex.foreach { case (iq, i) => 481e62b6911SXuan Hu iq.io.flush <> io.fromCtrlBlock.flush 48260f0c5aeSxiaofeibao iq.io.wakeupFromWB.zip( 48360f0c5aeSxiaofeibao wakeupFromIntWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 48460f0c5aeSxiaofeibao wakeupFromFpWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 485c720aa49Ssinsanction wakeupFromVfWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 486c720aa49Ssinsanction wakeupFromV0WBVec.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 487c720aa49Ssinsanction wakeupFromVlWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq 48860f0c5aeSxiaofeibao ).foreach{ case (sink, source) => sink := source} 4899df83ee5Sxiaofeibao iq.io.wakeupFromWBDelayed.zip( 4909df83ee5Sxiaofeibao wakeupFromIntWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 4919df83ee5Sxiaofeibao wakeupFromFpWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 4929df83ee5Sxiaofeibao wakeupFromVfWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 4939df83ee5Sxiaofeibao wakeupFromV0WBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 4949df83ee5Sxiaofeibao wakeupFromVlWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq 4959df83ee5Sxiaofeibao ).foreach { case (sink, source) => sink := source } 4960a7d1d5cSxiaofeibao // here disable fp load fast wakeup to std, and no FEX wakeup to std 4970a7d1d5cSxiaofeibao iq.io.wakeupFromIQ.map(_.bits.fpWen := false.B) 498e62b6911SXuan Hu } 499e62b6911SXuan Hu 500e62b6911SXuan Hu (stdEnqs ++ hydEnqs).zip(staEnqs ++ hyaEnqs).zipWithIndex.foreach { case ((stdIQEnq, staIQEnq), i) => 50141eedc8dSlinzhida stdIQEnq.valid := staValidFromDispatch(i) 502730cfbc0SXuan Hu stdIQEnq.bits := staIQEnq.bits 503730cfbc0SXuan Hu // Store data reuses store addr src(1) in dispatch2iq 504e62b6911SXuan Hu // [dispatch2iq] --src*------src*(0)--> [staIQ|hyaIQ] 505730cfbc0SXuan Hu // \ 506730cfbc0SXuan Hu // ---src*(1)--> [stdIQ] 507730cfbc0SXuan Hu // Since the src(1) of sta is easier to get, stdIQEnq.bits.src*(0) is assigned to staIQEnq.bits.src*(1) 508730cfbc0SXuan Hu // instead of dispatch2Iq.io.out(x).bits.src*(1) 50997b279b9SXuan Hu val stdIdx = 1 5102d270511Ssinsanction stdIQEnq.bits.srcState(0) := staIQEnq.bits.srcState(stdIdx) 511955b4beaSsinsanction stdIQEnq.bits.srcLoadDependency(0) := staIQEnq.bits.srcLoadDependency(stdIdx) 5122d270511Ssinsanction stdIQEnq.bits.srcType(0) := staIQEnq.bits.srcType(stdIdx) 5132d270511Ssinsanction stdIQEnq.bits.psrc(0) := staIQEnq.bits.psrc(stdIdx) 514730cfbc0SXuan Hu stdIQEnq.bits.sqIdx := staIQEnq.bits.sqIdx 515955b4beaSsinsanction stdIQEnq.bits.useRegCache(0) := staIQEnq.bits.useRegCache(stdIdx) 516955b4beaSsinsanction stdIQEnq.bits.regCacheIdx(0) := staIQEnq.bits.regCacheIdx(stdIdx) 517730cfbc0SXuan Hu } 518730cfbc0SXuan Hu 5192d270511Ssinsanction vecMemIQs.foreach { 5202d270511Ssinsanction case imp: IssueQueueVecMemImp => 5212d270511Ssinsanction imp.io.memIO.get.sqDeqPtr.foreach(_ := io.fromMem.get.sqDeqPtr) 5222d270511Ssinsanction imp.io.memIO.get.lqDeqPtr.foreach(_ := io.fromMem.get.lqDeqPtr) 5231f3d1b4dSXuan Hu // not used 524b7c799beSzhanglyGit //imp.io.memIO.get.feedbackIO.head := io.fromMem.get.vstuFeedback.head // only vector store replay 5251f3d1b4dSXuan Hu // maybe not used 5261f3d1b4dSXuan Hu imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr 5271f3d1b4dSXuan Hu imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 52860f0c5aeSxiaofeibao imp.io.wakeupFromWB.zip( 52960f0c5aeSxiaofeibao wakeupFromIntWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 53060f0c5aeSxiaofeibao wakeupFromFpWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 531c720aa49Ssinsanction wakeupFromVfWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 532c720aa49Ssinsanction wakeupFromV0WBVec.zipWithIndex.filter(x => imp.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 533c720aa49Ssinsanction wakeupFromVlWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq 53460f0c5aeSxiaofeibao ).foreach{ case (sink, source) => sink := source} 5359df83ee5Sxiaofeibao imp.io.wakeupFromWBDelayed.zip( 5369df83ee5Sxiaofeibao wakeupFromIntWBVecDelayed.zipWithIndex.filter(x => imp.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 5379df83ee5Sxiaofeibao wakeupFromFpWBVecDelayed.zipWithIndex.filter(x => imp.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 5389df83ee5Sxiaofeibao wakeupFromVfWBVecDelayed.zipWithIndex.filter(x => imp.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 5399df83ee5Sxiaofeibao wakeupFromV0WBVecDelayed.zipWithIndex.filter(x => imp.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 5409df83ee5Sxiaofeibao wakeupFromVlWBVecDelayed.zipWithIndex.filter(x => imp.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq 5419df83ee5Sxiaofeibao ).foreach { case (sink, source) => sink := source } 542f39a61a1SzhanglyGit 5432d270511Ssinsanction case _ => 5442d270511Ssinsanction } 545b7c799beSzhanglyGit val vecMemFeedbackIO: Seq[MemRSFeedbackIO] = vecMemIQs.map { 546b7c799beSzhanglyGit case imp: IssueQueueVecMemImp => 547b7c799beSzhanglyGit imp.io.memIO.get.feedbackIO 548b7c799beSzhanglyGit }.flatten 549b7c799beSzhanglyGit assert(vecMemFeedbackIO.size == io.fromMem.get.vstuFeedback.size, "vecMemFeedback size dont match!") 550b7c799beSzhanglyGit vecMemFeedbackIO.zip(io.fromMem.get.vstuFeedback).foreach{ 551b7c799beSzhanglyGit case (sink, source) => 552b7c799beSzhanglyGit sink := source 553b7c799beSzhanglyGit } 5542d270511Ssinsanction 5550a7d1d5cSxiaofeibao val perfEvents = basePerfEvents 556e1a85e9fSchengguanghui generatePerfEvent() 557730cfbc0SXuan Hu} 558