@@ -183,6 +183,11 @@ class Region(val params: SchdBlockParams)(implicit p: Parameters) extends XSModu
183183 imp.io.s2Resp.get.head.lqIdx.foreach(_ := feedBack.bits.lqIdx)
184184 imp.io.s2Resp.get.head.sqIdx.foreach(_ := feedBack.bits.sqIdx)
185185 }
186+ val stDataIQs = issueQueues.filter(iq => iq.param.StdCnt > 0 )
187+ if (params.isIntSchd) {
188+ val lrqWakeupFromIQ = (stAddrIQs ++ stDataIQs).flatMap(_.io.wakeupToLRQ.get)
189+ io.wakeupToLRQ.get.flatten.zip(lrqWakeupFromIQ).foreach { case (sink, source) => sink := source }
190+ }
186191 val vecStuIQs = issueQueues.filter(iq => iq.param.VstuCnt > 0 )
187192 vecStuIQs.zipWithIndex.foreach { case (imp, i) =>
188193 imp.io.memIO.get.lqDeqPtr.get := io.lqDeqPtr.get
@@ -258,7 +263,6 @@ class Region(val params: SchdBlockParams)(implicit p: Parameters) extends XSModu
258263 }
259264 }
260265 // std dispatch
261- val stDataIQs = issueQueues.filter(iq => iq.param.StdCnt > 0 )
262266 val staEnqs = stAddrIQs.map(_.io.enq).flatten
263267 val stdEnqs = stDataIQs.map(_.io.enq).flatten.take(staEnqs.size)
264268 val noStdExuParams = params.issueBlockParams.map(x => Seq .fill(x.numEnq)(x.exuBlockParams)).flatten.filter { x => x.map(! _.hasStdFu).reduce(_ && _) }
@@ -483,6 +487,20 @@ class Region(val params: SchdBlockParams)(implicit p: Parameters) extends XSModu
483487 io.toMemExu.get <> toMem
484488 val firstMemExu = bypassNetwork.io.toExus.int.indexWhere(x => x.map(xx => xx.bits.params.isMemExeUnit).reduce(_ || _))
485489 println(s " [Regin_int] firstMemExu = $firstMemExu" )
490+ val firstStoreExu = bypassNetwork.io.toExus.int.indexWhere(x => x.map(xx => xx.bits.params.hasStoreFu).reduce(_ || _))
491+ println(s " [Regin_int] firstStoreExu = $firstStoreExu" )
492+
493+ val storeWakeupCancel = Wire (io.wakeupToLRQCancel.get.cloneType)
494+
495+ storeWakeupCancel.zipWithIndex.foreach { case (toMemCancel, i) =>
496+ for (j <- toMemCancel.indices) {
497+ val toMemExuInput = bypassNetwork.io.toExus.int(firstStoreExu + i)(j)
498+ toMemCancel(j).og1Cancel := RegNext (LoadShouldCancel (toMemExuInput.bits.ctrl.loadDependency, io.ldCancel)) // regNext for timing
499+ }
500+ }
501+
502+ io.wakeupToLRQCancel.get.flatten.zip(storeWakeupCancel.flatten).foreach { case (sink, source) => sink := source }
503+
486504 for (i <- toMem.indices) {
487505 for (j <- toMem(i).indices) {
488506 val toMemExuInput = bypassNetwork.io.toExus.int(firstMemExu + i)(j)
@@ -860,6 +878,9 @@ class RegionIO(val params: SchdBlockParams)(implicit p: Parameters) extends XSBu
860878 val wakeupFromF2I = Option .when(params.isIntSchd)(Flipped (ValidIO (new IssueQueueIQWakeUpBundle (params.backendParam.getExuIdxF2I, params.backendParam))))
861879 val cross = new ExuCrossRegion (params)
862880 val toMemExu = Option .when(! params.isFpSchd)(params.genNewExuInputCopySrcBundleMemBlock)
881+ // to Mem, wake up LoadQueueReplay
882+ val wakeupToLRQ = Option .when(params.isIntSchd)(intSchdParam.genMemWakeupLRQBundle)
883+ val wakeupToLRQCancel = Option .when(params.isIntSchd)(intSchdParam.genMemWakeupCancelBundle)
863884 // fromMem
864885 val wakeupFromLDU = Option .when(params.isIntSchd)(Vec (params.LdExuCnt , Flipped (Valid (new MemWakeUpBundle ))))
865886 val staFeedback = Option .when(params.isIntSchd)(Flipped (Vec (params.StaCnt , new MemRSFeedbackIO )))
@@ -945,4 +966,3 @@ class RegionIO(val params: SchdBlockParams)(implicit p: Parameters) extends XSBu
945966 val debugIQEnqHasIssuedVec = Option .when(backendParams.debugEn)(Vec (IQNum , Output (Bool ())))
946967 val debugIQDeqRobIdxVec = Option .when(backendParams.debugEn)(Vec (iqDeqSum, ValidIO (new RobPtr ())))
947968}
948-
0 commit comments