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} 74fa00a44SzhanglyGitimport utils.OptionWrapper 8730cfbc0SXuan Huimport xiangshan._ 910fe9778SXuan Huimport xiangshan.backend.Bundles._ 1060f0c5aeSxiaofeibaoimport xiangshan.backend.datapath.DataConfig.{IntData, VAddrData, VecData, FpData} 1160f0c5aeSxiaofeibaoimport xiangshan.backend.datapath.WbConfig.{IntWB, FpWB, VfWB} 12e62b6911SXuan Huimport xiangshan.backend.fu.FuType 13730cfbc0SXuan Huimport xiangshan.backend.regfile.RfWritePortWithConfig 14730cfbc0SXuan Huimport xiangshan.backend.rename.BusyTable 152d270511Ssinsanctionimport xiangshan.mem.{LsqEnqCtrl, LsqEnqIO, MemWaitUpdateReq, SqPtr, LqPtr} 16730cfbc0SXuan Hu 17730cfbc0SXuan Husealed trait SchedulerType 18730cfbc0SXuan Hu 19730cfbc0SXuan Hucase class IntScheduler() extends SchedulerType 2060f0c5aeSxiaofeibaocase class FpScheduler() extends SchedulerType 21730cfbc0SXuan Hucase class MemScheduler() extends SchedulerType 22730cfbc0SXuan Hucase class VfScheduler() extends SchedulerType 23730cfbc0SXuan Hucase class NoScheduler() extends SchedulerType 24730cfbc0SXuan Hu 25730cfbc0SXuan Huclass Scheduler(val params: SchdBlockParams)(implicit p: Parameters) extends LazyModule with HasXSParameter { 261ca4a39dSXuan Hu override def shouldBeInlined: Boolean = false 271ca4a39dSXuan Hu 2839c59369SXuan Hu val numIntStateWrite = backendParams.numPregWb(IntData()) 2960f0c5aeSxiaofeibao val numFpStateWrite = backendParams.numPregWb(FpData()) 3039c59369SXuan Hu val numVfStateWrite = backendParams.numPregWb(VecData()) 31730cfbc0SXuan Hu 32730cfbc0SXuan Hu val dispatch2Iq = LazyModule(new Dispatch2Iq(params)) 33730cfbc0SXuan Hu val issueQueue = params.issueBlockParams.map(x => LazyModule(new IssueQueue(x).suggestName(x.getIQName))) 34730cfbc0SXuan Hu 3583ba63b3SXuan Hu lazy val module: SchedulerImpBase = params.schdType match { 36730cfbc0SXuan Hu case IntScheduler() => new SchedulerArithImp(this)(params, p) 3760f0c5aeSxiaofeibao case FpScheduler() => new SchedulerArithImp(this)(params, p) 38730cfbc0SXuan Hu case MemScheduler() => new SchedulerMemImp(this)(params, p) 39730cfbc0SXuan Hu case VfScheduler() => new SchedulerArithImp(this)(params, p) 40730cfbc0SXuan Hu case _ => null 41730cfbc0SXuan Hu } 42730cfbc0SXuan Hu} 43730cfbc0SXuan Hu 447f8233d5SHaojin Tangclass SchedulerIO()(implicit params: SchdBlockParams, p: Parameters) extends XSBundle { 4568d13085SXuan Hu // params alias 467f8233d5SHaojin Tang private val LoadQueueSize = VirtualLoadQueueSize 4768d13085SXuan Hu 48730cfbc0SXuan Hu val fromTop = new Bundle { 49730cfbc0SXuan Hu val hartId = Input(UInt(8.W)) 50730cfbc0SXuan Hu } 512e0a7dc5Sfdy val fromWbFuBusyTable = new Bundle{ 522e0a7dc5Sfdy val fuBusyTableRead = MixedVec(params.issueBlockParams.map(x => Input(x.genWbFuBusyTableReadBundle))) 532e0a7dc5Sfdy } 54dd970561SzhanglyGit val wbFuBusyTable = MixedVec(params.issueBlockParams.map(x => Output(x.genWbFuBusyTableWriteBundle))) 55*82674533Sxiaofeibao val intIQValidNumVec = Output(MixedVec(backendParams.genIntIQValidNumBundle)) 56*82674533Sxiaofeibao val fpIQValidNumVec = Output(MixedVec(backendParams.genFpIQValidNumBundle)) 57dd970561SzhanglyGit 58730cfbc0SXuan Hu val fromCtrlBlock = new Bundle { 59730cfbc0SXuan Hu val flush = Flipped(ValidIO(new Redirect)) 60730cfbc0SXuan Hu } 61730cfbc0SXuan Hu val fromDispatch = new Bundle { 62730cfbc0SXuan Hu val allocPregs = Vec(RenameWidth, Input(new ResetPregStateReq)) 63730cfbc0SXuan Hu val uops = Vec(params.numUopIn, Flipped(DecoupledIO(new DynInst))) 64730cfbc0SXuan Hu } 6539c59369SXuan Hu val intWriteBack = MixedVec(Vec(backendParams.numPregWb(IntData()), 66730cfbc0SXuan Hu new RfWritePortWithConfig(backendParams.intPregParams.dataCfg, backendParams.intPregParams.addrWidth))) 6760f0c5aeSxiaofeibao val fpWriteBack = MixedVec(Vec(backendParams.numPregWb(FpData()), 6860f0c5aeSxiaofeibao new RfWritePortWithConfig(backendParams.fpPregParams.dataCfg, backendParams.fpPregParams.addrWidth))) 6939c59369SXuan Hu val vfWriteBack = MixedVec(Vec(backendParams.numPregWb(VecData()), 70730cfbc0SXuan Hu new RfWritePortWithConfig(backendParams.vfPregParams.dataCfg, backendParams.vfPregParams.addrWidth))) 7159ef6009Sxiaofeibao-xjtu val toDataPathAfterDelay: MixedVec[MixedVec[DecoupledIO[IssueQueueIssueBundle]]] = MixedVec(params.issueBlockParams.map(_.genIssueDecoupledBundle)) 72730cfbc0SXuan Hu 73b6279fc6SZiyue Zhang val vlWriteBack = new Bundle { 74b6279fc6SZiyue Zhang val vlIsZero = Input(Bool()) 75b6279fc6SZiyue Zhang val vlIsVlmax = Input(Bool()) 76b6279fc6SZiyue Zhang } 77b6279fc6SZiyue Zhang 78bf35baadSXuan Hu val fromSchedulers = new Bundle { 79c0be7f33SXuan Hu val wakeupVec: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpInValidBundle) 80bf35baadSXuan Hu } 81bf35baadSXuan Hu 82bf35baadSXuan Hu val toSchedulers = new Bundle { 83c0be7f33SXuan Hu val wakeupVec: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = params.genIQWakeUpOutValidBundle 84bf35baadSXuan Hu } 85bf35baadSXuan Hu 86c0be7f33SXuan Hu val fromDataPath = new Bundle { 8710fe9778SXuan Hu val resp: MixedVec[MixedVec[OGRespBundle]] = MixedVec(params.issueBlockParams.map(x => Flipped(x.genOGRespBundle))) 887a96cc7fSHaojin Tang val og0Cancel = Input(ExuOH(backendParams.numExu)) 89ea46c302SXuan Hu // Todo: remove this after no cancel signal from og1 907a96cc7fSHaojin Tang val og1Cancel = Input(ExuOH(backendParams.numExu)) 91bc7d6943SzhanglyGit val cancelToBusyTable = Vec(backendParams.numExu, Flipped(ValidIO(new CancelSignal))) 92c0be7f33SXuan Hu // just be compatible to old code 93c0be7f33SXuan Hu def apply(i: Int)(j: Int) = resp(i)(j) 94c0be7f33SXuan Hu } 95c0be7f33SXuan Hu 968a66c02cSXuan Hu val loadFinalIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.LdExuCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x))))))) 978a66c02cSXuan Hu val memAddrIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.LdExuCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x))))))) 987e471bf8SXuan Hu val vecLoadIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.VlduCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x))))))) 990f55a0d3SHaojin Tang 1006810d1e8Ssfencevma val ldCancel = Vec(backendParams.LduCnt + backendParams.HyuCnt, Flipped(new LoadCancelIO)) 101c0be7f33SXuan Hu 102730cfbc0SXuan Hu val memIO = if (params.isMemSchd) Some(new Bundle { 103730cfbc0SXuan Hu val lsqEnqIO = Flipped(new LsqEnqIO) 104730cfbc0SXuan Hu }) else None 105730cfbc0SXuan Hu val fromMem = if (params.isMemSchd) Some(new Bundle { 1067b753bebSXuan Hu val ldaFeedback = Flipped(Vec(params.LduCnt, new MemRSFeedbackIO)) 1077b753bebSXuan Hu val staFeedback = Flipped(Vec(params.StaCnt, new MemRSFeedbackIO)) 1088f1fa9b1Ssfencevma val hyuFeedback = Flipped(Vec(params.HyuCnt, new MemRSFeedbackIO)) 109fd490615Sweiding liu val vstuFeedback = Flipped(Vec(params.VstuCnt, new MemRSFeedbackIO(isVector = true))) 110fd490615Sweiding liu val vlduFeedback = Flipped(Vec(params.VlduCnt, new MemRSFeedbackIO(isVector = true))) 111730cfbc0SXuan Hu val stIssuePtr = Input(new SqPtr()) 112730cfbc0SXuan Hu val lcommit = Input(UInt(log2Up(CommitWidth + 1).W)) 113730cfbc0SXuan Hu val scommit = Input(UInt(log2Ceil(EnsbufferWidth + 1).W)) // connected to `memBlock.io.sqDeq` instead of ROB 114fc45ed13SXuan Hu val wakeup = Vec(params.LdExuCnt, Flipped(Valid(new DynInst))) 1152d270511Ssinsanction val lqDeqPtr = Input(new LqPtr) 1162d270511Ssinsanction val sqDeqPtr = Input(new SqPtr) 117730cfbc0SXuan Hu // from lsq 118730cfbc0SXuan Hu val lqCancelCnt = Input(UInt(log2Up(LoadQueueSize + 1).W)) 119730cfbc0SXuan Hu val sqCancelCnt = Input(UInt(log2Up(StoreQueueSize + 1).W)) 120730cfbc0SXuan Hu val memWaitUpdateReq = Flipped(new MemWaitUpdateReq) 121730cfbc0SXuan Hu }) else None 122730cfbc0SXuan Hu val toMem = if (params.isMemSchd) Some(new Bundle { 123730cfbc0SXuan Hu val loadFastMatch = Output(Vec(params.LduCnt, new IssueQueueLoadBundle)) 124730cfbc0SXuan Hu }) else None 125c38df446SzhanglyGit val fromOg2 = if(params.isVfSchd) Some(MixedVec(params.issueBlockParams.map(x => Flipped(x.genOG2RespBundle)))) else None 126730cfbc0SXuan Hu} 127730cfbc0SXuan Hu 128730cfbc0SXuan Huabstract class SchedulerImpBase(wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters) 129730cfbc0SXuan Hu extends LazyModuleImp(wrapper) 130730cfbc0SXuan Hu with HasXSParameter 131730cfbc0SXuan Hu{ 132730cfbc0SXuan Hu val io = IO(new SchedulerIO()) 133730cfbc0SXuan Hu 134730cfbc0SXuan Hu // alias 135c0be7f33SXuan Hu private val iqWakeUpInMap: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] = 136c0be7f33SXuan Hu io.fromSchedulers.wakeupVec.map(x => (x.bits.exuIdx, x)).toMap 137730cfbc0SXuan Hu private val schdType = params.schdType 138730cfbc0SXuan Hu 139730cfbc0SXuan Hu // Modules 140730cfbc0SXuan Hu val dispatch2Iq: Dispatch2IqImp = wrapper.dispatch2Iq.module 141730cfbc0SXuan Hu val issueQueues: Seq[IssueQueueImp] = wrapper.issueQueue.map(_.module) 142*82674533Sxiaofeibao io.intIQValidNumVec := 0.U.asTypeOf(io.intIQValidNumVec) 143*82674533Sxiaofeibao io.fpIQValidNumVec := 0.U.asTypeOf(io.fpIQValidNumVec) 144ff3fcdf1Sxiaofeibao-xjtu if (params.isIntSchd) { 145*82674533Sxiaofeibao dispatch2Iq.io.intIQValidNumVec.get := io.intIQValidNumVec 146*82674533Sxiaofeibao io.intIQValidNumVec := MixedVecInit(issueQueues.map(_.io.validCntDeqVec)) 147ff3fcdf1Sxiaofeibao-xjtu } 148*82674533Sxiaofeibao else if (params.isFpSchd) { 149*82674533Sxiaofeibao dispatch2Iq.io.fpIQValidNumVec.get := io.fpIQValidNumVec 150*82674533Sxiaofeibao io.fpIQValidNumVec := MixedVecInit(issueQueues.map(_.io.validCntDeqVec)) 151*82674533Sxiaofeibao } 152730cfbc0SXuan Hu 15356bcaed7SHaojin Tang // valid count 15456bcaed7SHaojin Tang dispatch2Iq.io.iqValidCnt := issueQueues.filter(_.params.StdCnt == 0).map(_.io.status.validCnt) 15556bcaed7SHaojin Tang 156730cfbc0SXuan Hu // BusyTable Modules 157730cfbc0SXuan Hu val intBusyTable = schdType match { 158bc7d6943SzhanglyGit case IntScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numIntStateRead, wrapper.numIntStateWrite, IntPhyRegs, IntWB()))) 159730cfbc0SXuan Hu case _ => None 160730cfbc0SXuan Hu } 16160f0c5aeSxiaofeibao val fpBusyTable = schdType match { 16260f0c5aeSxiaofeibao case FpScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numFpStateRead, wrapper.numFpStateWrite, FpPhyRegs, FpWB()))) 16360f0c5aeSxiaofeibao case _ => None 16460f0c5aeSxiaofeibao } 165730cfbc0SXuan Hu val vfBusyTable = schdType match { 166bc7d6943SzhanglyGit case VfScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numVfStateRead, wrapper.numVfStateWrite, VfPhyRegs, VfWB()))) 167730cfbc0SXuan Hu case _ => None 168730cfbc0SXuan Hu } 169730cfbc0SXuan Hu 170730cfbc0SXuan Hu dispatch2Iq.io match { case dp2iq => 171730cfbc0SXuan Hu dp2iq.redirect <> io.fromCtrlBlock.flush 172730cfbc0SXuan Hu dp2iq.in <> io.fromDispatch.uops 173730cfbc0SXuan Hu dp2iq.readIntState.foreach(_ <> intBusyTable.get.io.read) 17460f0c5aeSxiaofeibao dp2iq.readFpState.foreach(_ <> fpBusyTable.get.io.read) 175730cfbc0SXuan Hu dp2iq.readVfState.foreach(_ <> vfBusyTable.get.io.read) 176730cfbc0SXuan Hu } 177730cfbc0SXuan Hu 178730cfbc0SXuan Hu intBusyTable match { 179730cfbc0SXuan Hu case Some(bt) => 180730cfbc0SXuan Hu bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) => 181730cfbc0SXuan Hu btAllocPregs.valid := dpAllocPregs.isInt 182730cfbc0SXuan Hu btAllocPregs.bits := dpAllocPregs.preg 183730cfbc0SXuan Hu } 184730cfbc0SXuan Hu bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) => 185730cfbc0SXuan Hu wb.valid := io.intWriteBack(i).wen && io.intWriteBack(i).intWen 186730cfbc0SXuan Hu wb.bits := io.intWriteBack(i).addr 187730cfbc0SXuan Hu } 188bc7d6943SzhanglyGit bt.io.wakeUp := io.fromSchedulers.wakeupVec 189bc7d6943SzhanglyGit bt.io.cancel := io.fromDataPath.cancelToBusyTable 19013551487SzhanglyGit bt.io.ldCancel := io.ldCancel 191730cfbc0SXuan Hu case None => 192730cfbc0SXuan Hu } 193730cfbc0SXuan Hu 19460f0c5aeSxiaofeibao fpBusyTable match { 195730cfbc0SXuan Hu case Some(bt) => 196730cfbc0SXuan Hu bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) => 197730cfbc0SXuan Hu btAllocPregs.valid := dpAllocPregs.isFp 198730cfbc0SXuan Hu btAllocPregs.bits := dpAllocPregs.preg 199730cfbc0SXuan Hu } 200730cfbc0SXuan Hu bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) => 20160f0c5aeSxiaofeibao wb.valid := io.fpWriteBack(i).wen && io.fpWriteBack(i).fpWen 20260f0c5aeSxiaofeibao wb.bits := io.fpWriteBack(i).addr 20360f0c5aeSxiaofeibao } 20460f0c5aeSxiaofeibao bt.io.wakeUp := io.fromSchedulers.wakeupVec 20560f0c5aeSxiaofeibao bt.io.cancel := io.fromDataPath.cancelToBusyTable 20660f0c5aeSxiaofeibao bt.io.ldCancel := io.ldCancel 20760f0c5aeSxiaofeibao case None => 20860f0c5aeSxiaofeibao } 20960f0c5aeSxiaofeibao 21060f0c5aeSxiaofeibao vfBusyTable match { 21160f0c5aeSxiaofeibao case Some(bt) => 21260f0c5aeSxiaofeibao bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) => 21360f0c5aeSxiaofeibao btAllocPregs.valid := dpAllocPregs.isVec 21460f0c5aeSxiaofeibao btAllocPregs.bits := dpAllocPregs.preg 21560f0c5aeSxiaofeibao } 21660f0c5aeSxiaofeibao bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) => 21760f0c5aeSxiaofeibao wb.valid := io.vfWriteBack(i).wen && io.vfWriteBack(i).vecWen 218730cfbc0SXuan Hu wb.bits := io.vfWriteBack(i).addr 219730cfbc0SXuan Hu } 220bc7d6943SzhanglyGit bt.io.wakeUp := io.fromSchedulers.wakeupVec 221bc7d6943SzhanglyGit bt.io.cancel := io.fromDataPath.cancelToBusyTable 22213551487SzhanglyGit bt.io.ldCancel := io.ldCancel 223730cfbc0SXuan Hu case None => 224730cfbc0SXuan Hu } 225730cfbc0SXuan Hu 226f39a61a1SzhanglyGit val wakeupFromIntWBVec = Wire(params.genIntWBWakeUpSinkValidBundle) 22760f0c5aeSxiaofeibao val wakeupFromFpWBVec = Wire(params.genFpWBWakeUpSinkValidBundle) 228f39a61a1SzhanglyGit val wakeupFromVfWBVec = Wire(params.genVfWBWakeUpSinkValidBundle) 229f39a61a1SzhanglyGit 230f39a61a1SzhanglyGit wakeupFromIntWBVec.zip(io.intWriteBack).foreach { case (sink, source) => 231f39a61a1SzhanglyGit sink.valid := source.wen 232f39a61a1SzhanglyGit sink.bits.rfWen := source.intWen 233f39a61a1SzhanglyGit sink.bits.fpWen := source.fpWen 234f39a61a1SzhanglyGit sink.bits.vecWen := source.vecWen 235f39a61a1SzhanglyGit sink.bits.pdest := source.addr 236730cfbc0SXuan Hu } 237f39a61a1SzhanglyGit 23860f0c5aeSxiaofeibao wakeupFromFpWBVec.zip(io.fpWriteBack).foreach { case (sink, source) => 23960f0c5aeSxiaofeibao sink.valid := source.wen 24060f0c5aeSxiaofeibao sink.bits.rfWen := source.intWen 24160f0c5aeSxiaofeibao sink.bits.fpWen := source.fpWen 24260f0c5aeSxiaofeibao sink.bits.vecWen := source.vecWen 24360f0c5aeSxiaofeibao sink.bits.pdest := source.addr 24460f0c5aeSxiaofeibao } 24560f0c5aeSxiaofeibao 246f39a61a1SzhanglyGit wakeupFromVfWBVec.zip(io.vfWriteBack).foreach { case (sink, source) => 247730cfbc0SXuan Hu sink.valid := source.wen 248730cfbc0SXuan Hu sink.bits.rfWen := source.intWen 249730cfbc0SXuan Hu sink.bits.fpWen := source.fpWen 250730cfbc0SXuan Hu sink.bits.vecWen := source.vecWen 251730cfbc0SXuan Hu sink.bits.pdest := source.addr 252730cfbc0SXuan Hu } 253730cfbc0SXuan Hu 254bf35baadSXuan Hu // Connect bundles having the same wakeup source 25559ef6009Sxiaofeibao-xjtu issueQueues.zipWithIndex.foreach { case(iq, i) => 256bf35baadSXuan Hu iq.io.wakeupFromIQ.foreach { wakeUp => 2570c7ebb58Sxiaofeibao-xjtu val wakeUpIn = iqWakeUpInMap(wakeUp.bits.exuIdx) 2580c7ebb58Sxiaofeibao-xjtu val exuIdx = wakeUp.bits.exuIdx 2590c7ebb58Sxiaofeibao-xjtu println(s"[Backend] Connect wakeup exuIdx ${exuIdx}") 2600c7ebb58Sxiaofeibao-xjtu connectSamePort(wakeUp,wakeUpIn) 2610c7ebb58Sxiaofeibao-xjtu backendParams.connectWakeup(exuIdx) 2620c7ebb58Sxiaofeibao-xjtu if (backendParams.isCopyPdest(exuIdx)) { 2630c7ebb58Sxiaofeibao-xjtu println(s"[Backend] exuIdx ${exuIdx} use pdestCopy ${backendParams.getCopyPdestIndex(exuIdx)}") 2640c7ebb58Sxiaofeibao-xjtu wakeUp.bits.pdest := wakeUpIn.bits.pdestCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 2654c5a0d77Sxiaofeibao-xjtu if (wakeUpIn.bits.rfWenCopy.nonEmpty) wakeUp.bits.rfWen := wakeUpIn.bits.rfWenCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 2664c5a0d77Sxiaofeibao-xjtu if (wakeUpIn.bits.fpWenCopy.nonEmpty) wakeUp.bits.fpWen := wakeUpIn.bits.fpWenCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 2674c5a0d77Sxiaofeibao-xjtu if (wakeUpIn.bits.vecWenCopy.nonEmpty) wakeUp.bits.vecWen := wakeUpIn.bits.vecWenCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 2684c5a0d77Sxiaofeibao-xjtu if (wakeUpIn.bits.loadDependencyCopy.nonEmpty) wakeUp.bits.loadDependency := wakeUpIn.bits.loadDependencyCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 2690c7ebb58Sxiaofeibao-xjtu } 27060912d84Sxiaofeibao-xjtu if (iq.params.numIntSrc == 0) wakeUp.bits.rfWen := false.B 27160f0c5aeSxiaofeibao if (iq.params.numFpSrc == 0) wakeUp.bits.fpWen := false.B 27260912d84Sxiaofeibao-xjtu if (iq.params.numVfSrc == 0) wakeUp.bits.vecWen := false.B 273bf35baadSXuan Hu } 274ea46c302SXuan Hu iq.io.og0Cancel := io.fromDataPath.og0Cancel 275ea46c302SXuan Hu iq.io.og1Cancel := io.fromDataPath.og1Cancel 2760f55a0d3SHaojin Tang iq.io.ldCancel := io.ldCancel 277bf35baadSXuan Hu } 278bf35baadSXuan Hu 279b6279fc6SZiyue Zhang // connect the vl writeback informatino to the issue queues 280b6279fc6SZiyue Zhang issueQueues.zipWithIndex.foreach { case(iq, i) => 281b6279fc6SZiyue Zhang iq.io.vlIsVlmax := io.vlWriteBack.vlIsVlmax 282b6279fc6SZiyue Zhang iq.io.vlIsZero := io.vlWriteBack.vlIsZero 283b6279fc6SZiyue Zhang } 284b6279fc6SZiyue Zhang 285c0be7f33SXuan Hu private val iqWakeUpOutMap: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] = 286bf35baadSXuan Hu issueQueues.flatMap(_.io.wakeupToIQ) 287c0be7f33SXuan Hu .map(x => (x.bits.exuIdx, x)) 288bf35baadSXuan Hu .toMap 289bf35baadSXuan Hu 290bf35baadSXuan Hu // Connect bundles having the same wakeup source 291bf35baadSXuan Hu io.toSchedulers.wakeupVec.foreach { wakeUp => 292c0be7f33SXuan Hu wakeUp := iqWakeUpOutMap(wakeUp.bits.exuIdx) 293bf35baadSXuan Hu } 294bf35baadSXuan Hu 29559ef6009Sxiaofeibao-xjtu io.toDataPathAfterDelay.zipWithIndex.foreach { case (toDpDy, i) => 29659ef6009Sxiaofeibao-xjtu toDpDy <> issueQueues(i).io.deqDelay 29759ef6009Sxiaofeibao-xjtu } 298bf35baadSXuan Hu 299f99b81adSHaojin Tang // Response 300f99b81adSHaojin Tang issueQueues.zipWithIndex.foreach { case (iq, i) => 301f99b81adSHaojin Tang iq.io.og0Resp.zipWithIndex.foreach { case (og0Resp, j) => 302f99b81adSHaojin Tang og0Resp := io.fromDataPath(i)(j).og0resp 303f99b81adSHaojin Tang } 304f99b81adSHaojin Tang iq.io.og1Resp.zipWithIndex.foreach { case (og1Resp, j) => 305f99b81adSHaojin Tang og1Resp := io.fromDataPath(i)(j).og1resp 306f99b81adSHaojin Tang } 307f99b81adSHaojin Tang iq.io.finalIssueResp.foreach(_.zipWithIndex.foreach { case (finalIssueResp, j) => 308670870b3SXuan Hu if (io.loadFinalIssueResp(i).isDefinedAt(j)) { 309f99b81adSHaojin Tang finalIssueResp := io.loadFinalIssueResp(i)(j) 310670870b3SXuan Hu } else { 311670870b3SXuan Hu finalIssueResp := 0.U.asTypeOf(finalIssueResp) 312670870b3SXuan Hu } 313f99b81adSHaojin Tang }) 314e8800897SXuan Hu iq.io.memAddrIssueResp.foreach(_.zipWithIndex.foreach { case (memAddrIssueResp, j) => 315aa2bcc31SzhanglyGit if (io.memAddrIssueResp(i).isDefinedAt(j)) { 316e8800897SXuan Hu memAddrIssueResp := io.memAddrIssueResp(i)(j) 317aa2bcc31SzhanglyGit } else { 318aa2bcc31SzhanglyGit memAddrIssueResp := 0.U.asTypeOf(memAddrIssueResp) 319aa2bcc31SzhanglyGit } 320e8800897SXuan Hu }) 3217e471bf8SXuan Hu iq.io.vecLoadIssueResp.foreach(_.zipWithIndex.foreach { case (resp, deqIdx) => 3227e471bf8SXuan Hu resp := io.vecLoadIssueResp(i)(deqIdx) 3237e471bf8SXuan Hu }) 324c38df446SzhanglyGit if(params.isVfSchd) { 325c38df446SzhanglyGit iq.io.og2Resp.get.zipWithIndex.foreach { case (og2Resp, exuIdx) => 326c38df446SzhanglyGit og2Resp := io.fromOg2.get(i)(exuIdx) 327c38df446SzhanglyGit } 328c38df446SzhanglyGit } 329f99b81adSHaojin Tang iq.io.wbBusyTableRead := io.fromWbFuBusyTable.fuBusyTableRead(i) 330f99b81adSHaojin Tang io.wbFuBusyTable(i) := iq.io.wbBusyTableWrite 331f99b81adSHaojin Tang } 332f99b81adSHaojin Tang 333c0be7f33SXuan Hu println(s"[Scheduler] io.fromSchedulers.wakeupVec: ${io.fromSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}") 334bf35baadSXuan Hu println(s"[Scheduler] iqWakeUpInKeys: ${iqWakeUpInMap.keys}") 335bf35baadSXuan Hu 336bf35baadSXuan Hu println(s"[Scheduler] iqWakeUpOutKeys: ${iqWakeUpOutMap.keys}") 337c0be7f33SXuan Hu println(s"[Scheduler] io.toSchedulers.wakeupVec: ${io.toSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}") 338730cfbc0SXuan Hu} 339730cfbc0SXuan Hu 340730cfbc0SXuan Huclass SchedulerArithImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters) 341730cfbc0SXuan Hu extends SchedulerImpBase(wrapper) 342730cfbc0SXuan Hu with HasXSParameter 343730cfbc0SXuan Hu{ 3442e0a7dc5Sfdy// dontTouch(io.vfWbFuBusyTable) 345730cfbc0SXuan Hu println(s"[SchedulerArithImp] " + 346730cfbc0SXuan Hu s"has intBusyTable: ${intBusyTable.nonEmpty}, " + 347730cfbc0SXuan Hu s"has vfBusyTable: ${vfBusyTable.nonEmpty}") 348730cfbc0SXuan Hu 349730cfbc0SXuan Hu issueQueues.zipWithIndex.foreach { case (iq, i) => 350730cfbc0SXuan Hu iq.io.flush <> io.fromCtrlBlock.flush 351730cfbc0SXuan Hu iq.io.enq <> dispatch2Iq.io.out(i) 352f39a61a1SzhanglyGit val intWBIQ = params.schdType match { 353f39a61a1SzhanglyGit case IntScheduler() => wakeupFromIntWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1) 35460f0c5aeSxiaofeibao case FpScheduler() => wakeupFromFpWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1) 355b8475955SzhanglyGit case VfScheduler() => wakeupFromVfWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1) 356596af5d2SHaojin Tang case _ => null 357f39a61a1SzhanglyGit } 358f39a61a1SzhanglyGit iq.io.wakeupFromWB.zip(intWBIQ).foreach{ case (sink, source) => sink := source} 359730cfbc0SXuan Hu } 360730cfbc0SXuan Hu} 361730cfbc0SXuan Hu 362f99b81adSHaojin Tang// FIXME: Vector mem instructions may not be handled properly! 363730cfbc0SXuan Huclass SchedulerMemImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters) 364730cfbc0SXuan Hu extends SchedulerImpBase(wrapper) 365730cfbc0SXuan Hu with HasXSParameter 366730cfbc0SXuan Hu{ 367730cfbc0SXuan Hu println(s"[SchedulerMemImp] " + 368730cfbc0SXuan Hu s"has intBusyTable: ${intBusyTable.nonEmpty}, " + 369730cfbc0SXuan Hu s"has vfBusyTable: ${vfBusyTable.nonEmpty}") 370730cfbc0SXuan Hu 371559c1710SHaojin Tang val memAddrIQs = issueQueues.filter(_.params.isMemAddrIQ) 372e07131b2Ssinsanction val stAddrIQs = issueQueues.filter(iq => iq.params.StaCnt > 0) // included in memAddrIQs 373e07131b2Ssinsanction val ldAddrIQs = issueQueues.filter(iq => iq.params.LduCnt > 0) 374e07131b2Ssinsanction val stDataIQs = issueQueues.filter(iq => iq.params.StdCnt > 0) 375559c1710SHaojin Tang val vecMemIQs = issueQueues.filter(_.params.isVecMemIQ) 376559c1710SHaojin Tang val (hyuIQs, hyuIQIdxs) = issueQueues.zipWithIndex.filter(_._1.params.HyuCnt > 0).unzip 377499caf4cSXuan Hu 378499caf4cSXuan Hu println(s"[SchedulerMemImp] memAddrIQs.size: ${memAddrIQs.size}, enq.size: ${memAddrIQs.map(_.io.enq.size).sum}") 379499caf4cSXuan Hu println(s"[SchedulerMemImp] stAddrIQs.size: ${stAddrIQs.size }, enq.size: ${stAddrIQs.map(_.io.enq.size).sum}") 380499caf4cSXuan Hu println(s"[SchedulerMemImp] ldAddrIQs.size: ${ldAddrIQs.size }, enq.size: ${ldAddrIQs.map(_.io.enq.size).sum}") 381499caf4cSXuan Hu println(s"[SchedulerMemImp] stDataIQs.size: ${stDataIQs.size }, enq.size: ${stDataIQs.map(_.io.enq.size).sum}") 382499caf4cSXuan Hu println(s"[SchedulerMemImp] hyuIQs.size: ${hyuIQs.size }, enq.size: ${hyuIQs.map(_.io.enq.size).sum}") 383730cfbc0SXuan Hu require(memAddrIQs.nonEmpty && stDataIQs.nonEmpty) 384730cfbc0SXuan Hu 385853cd2d8SHaojin Tang io.toMem.get.loadFastMatch := 0.U.asTypeOf(io.toMem.get.loadFastMatch) // TODO: is still needed? 386853cd2d8SHaojin Tang 387fc45ed13SXuan Hu private val loadWakeUp = issueQueues.filter(_.params.LdExuCnt > 0).map(_.asInstanceOf[IssueQueueMemAddrImp].io.memIO.get.loadWakeUp).flatten 388596af5d2SHaojin Tang require(loadWakeUp.length == io.fromMem.get.wakeup.length) 389596af5d2SHaojin Tang loadWakeUp.zip(io.fromMem.get.wakeup).foreach(x => x._1 := x._2) 390596af5d2SHaojin Tang 391730cfbc0SXuan Hu memAddrIQs.zipWithIndex.foreach { case (iq, i) => 392730cfbc0SXuan Hu iq.io.flush <> io.fromCtrlBlock.flush 393730cfbc0SXuan Hu iq.io.enq <> dispatch2Iq.io.out(i) 39460f0c5aeSxiaofeibao iq.io.wakeupFromWB.zip( 39560f0c5aeSxiaofeibao wakeupFromIntWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 39660f0c5aeSxiaofeibao wakeupFromFpWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 39760f0c5aeSxiaofeibao wakeupFromVfWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1) 39860f0c5aeSxiaofeibao ).foreach{ case (sink, source) => sink := source} 399730cfbc0SXuan Hu } 400730cfbc0SXuan Hu 401ecfc6f16SXuan Hu ldAddrIQs.zipWithIndex.foreach { 402ecfc6f16SXuan Hu case (imp: IssueQueueMemAddrImp, i) => 403ecfc6f16SXuan Hu imp.io.memIO.get.feedbackIO.head := 0.U.asTypeOf(imp.io.memIO.get.feedbackIO.head) 404c14e89f4SHaojin Tang imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr 405de784418SXuan Hu imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 4067b753bebSXuan Hu case _ => 4077b753bebSXuan Hu } 4087b753bebSXuan Hu 409ecfc6f16SXuan Hu stAddrIQs.zipWithIndex.foreach { 410ecfc6f16SXuan Hu case (imp: IssueQueueMemAddrImp, i) => 411ecfc6f16SXuan Hu imp.io.memIO.get.feedbackIO.head := io.fromMem.get.staFeedback(i) 412c14e89f4SHaojin Tang imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr 413c14e89f4SHaojin Tang imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 4147b753bebSXuan Hu case _ => 4157b753bebSXuan Hu } 416730cfbc0SXuan Hu 417559c1710SHaojin Tang hyuIQs.zip(hyuIQIdxs).foreach { 418559c1710SHaojin Tang case (imp: IssueQueueMemAddrImp, idx) => 419670870b3SXuan Hu imp.io.memIO.get.feedbackIO.head := io.fromMem.get.hyuFeedback.head 420670870b3SXuan Hu imp.io.memIO.get.feedbackIO(1) := 0.U.asTypeOf(imp.io.memIO.get.feedbackIO(1)) 4218f1fa9b1Ssfencevma imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr 4228f1fa9b1Ssfencevma imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 423559c1710SHaojin Tang // TODO: refactor ditry code 424559c1710SHaojin Tang imp.io.deqDelay(1).ready := false.B 425559c1710SHaojin Tang io.toDataPathAfterDelay(idx)(1).valid := false.B 426559c1710SHaojin Tang io.toDataPathAfterDelay(idx)(1).bits := 0.U.asTypeOf(io.toDataPathAfterDelay(idx)(1).bits) 4278f1fa9b1Ssfencevma case _ => 4288f1fa9b1Ssfencevma } 4298f1fa9b1Ssfencevma 430e62b6911SXuan Hu private val staIdxSeq = (stAddrIQs).map(iq => iq.params.idxInSchBlk) 431e62b6911SXuan Hu private val hyaIdxSeq = (hyuIQs).map(iq => iq.params.idxInSchBlk) 432e62b6911SXuan Hu 433e62b6911SXuan Hu println(s"[SchedulerMemImp] sta iq idx in memSchdBlock: $staIdxSeq") 434e62b6911SXuan Hu println(s"[SchedulerMemImp] hya iq idx in memSchdBlock: $hyaIdxSeq") 435e62b6911SXuan Hu 436e62b6911SXuan Hu private val staEnqs = stAddrIQs.map(_.io.enq).flatten 437e62b6911SXuan Hu private val stdEnqs = stDataIQs.map(_.io.enq).flatten.take(staEnqs.size) 438e62b6911SXuan Hu private val hyaEnqs = hyuIQs.map(_.io.enq).flatten 439e62b6911SXuan Hu private val hydEnqs = stDataIQs.map(_.io.enq).flatten.drop(staEnqs.size) 440e62b6911SXuan Hu 441e62b6911SXuan Hu require(staEnqs.size == stdEnqs.size, s"number of enq ports of store address IQs(${staEnqs.size}) " + 442e62b6911SXuan Hu s"should be equal to number of enq ports of store data IQs(${stdEnqs.size})") 443e62b6911SXuan Hu 444e62b6911SXuan Hu require(hyaEnqs.size == hydEnqs.size, s"number of enq ports of hybrid address IQs(${hyaEnqs.size}) " + 445e62b6911SXuan Hu s"should be equal to number of enq ports of hybrid data IQs(${hydEnqs.size})") 4469b258a00Sxgkiri 4470438e8f4SHaojin Tang val d2IqStaOut = dispatch2Iq.io.out.zipWithIndex.filter(staIdxSeq contains _._2).unzip._1.flatten 4480438e8f4SHaojin Tang d2IqStaOut.zip(staEnqs).zip(stdEnqs).foreach{ case((dp, staIQ), stdIQ) => 449730cfbc0SXuan Hu val isAllReady = staIQ.ready && stdIQ.ready 450e62b6911SXuan Hu dp.ready := isAllReady 451e62b6911SXuan Hu staIQ.valid := dp.valid && isAllReady 4520438e8f4SHaojin Tang stdIQ.valid := dp.valid && isAllReady && FuType.FuTypeOrR(dp.bits.fuType, FuType.stu, FuType.mou) 4539b258a00Sxgkiri } 454730cfbc0SXuan Hu 4550438e8f4SHaojin Tang val d2IqHyaOut = dispatch2Iq.io.out.zipWithIndex.filter(hyaIdxSeq contains _._2).unzip._1.flatten 4560438e8f4SHaojin Tang d2IqHyaOut.zip(hyaEnqs).zip(hydEnqs).foreach{ case((dp, hyaIQ), hydIQ) => 457e62b6911SXuan Hu val isAllReady = hyaIQ.ready && hydIQ.ready 458e62b6911SXuan Hu dp.ready := isAllReady 459e62b6911SXuan Hu hyaIQ.valid := dp.valid && isAllReady 46056bceacbSHaojin Tang hydIQ.valid := dp.valid && isAllReady && FuType.FuTypeOrR(dp.bits.fuType, FuType.stu, FuType.mou) 461e62b6911SXuan Hu } 462730cfbc0SXuan Hu 463e62b6911SXuan Hu stDataIQs.zipWithIndex.foreach { case (iq, i) => 464e62b6911SXuan Hu iq.io.flush <> io.fromCtrlBlock.flush 46560f0c5aeSxiaofeibao iq.io.wakeupFromWB.zip( 46660f0c5aeSxiaofeibao wakeupFromIntWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 46760f0c5aeSxiaofeibao wakeupFromFpWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 46860f0c5aeSxiaofeibao wakeupFromVfWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq 46960f0c5aeSxiaofeibao ).foreach{ case (sink, source) => sink := source} 470e62b6911SXuan Hu } 471e62b6911SXuan Hu 472e62b6911SXuan Hu (stdEnqs ++ hydEnqs).zip(staEnqs ++ hyaEnqs).zipWithIndex.foreach { case ((stdIQEnq, staIQEnq), i) => 473730cfbc0SXuan Hu stdIQEnq.bits := staIQEnq.bits 474730cfbc0SXuan Hu // Store data reuses store addr src(1) in dispatch2iq 475e62b6911SXuan Hu // [dispatch2iq] --src*------src*(0)--> [staIQ|hyaIQ] 476730cfbc0SXuan Hu // \ 477730cfbc0SXuan Hu // ---src*(1)--> [stdIQ] 478730cfbc0SXuan Hu // Since the src(1) of sta is easier to get, stdIQEnq.bits.src*(0) is assigned to staIQEnq.bits.src*(1) 479730cfbc0SXuan Hu // instead of dispatch2Iq.io.out(x).bits.src*(1) 48097b279b9SXuan Hu val stdIdx = 1 4812d270511Ssinsanction stdIQEnq.bits.srcState(0) := staIQEnq.bits.srcState(stdIdx) 48213551487SzhanglyGit stdIQEnq.bits.srcLoadDependency(0) := staIQEnq.bits.srcLoadDependency(1) 4832d270511Ssinsanction stdIQEnq.bits.srcType(0) := staIQEnq.bits.srcType(stdIdx) 4842d270511Ssinsanction stdIQEnq.bits.psrc(0) := staIQEnq.bits.psrc(stdIdx) 485730cfbc0SXuan Hu stdIQEnq.bits.sqIdx := staIQEnq.bits.sqIdx 486730cfbc0SXuan Hu } 487730cfbc0SXuan Hu 4882d270511Ssinsanction vecMemIQs.foreach { 4892d270511Ssinsanction case imp: IssueQueueVecMemImp => 4902d270511Ssinsanction imp.io.memIO.get.sqDeqPtr.foreach(_ := io.fromMem.get.sqDeqPtr) 4912d270511Ssinsanction imp.io.memIO.get.lqDeqPtr.foreach(_ := io.fromMem.get.lqDeqPtr) 4921f3d1b4dSXuan Hu // not used 493b7c799beSzhanglyGit //imp.io.memIO.get.feedbackIO.head := io.fromMem.get.vstuFeedback.head // only vector store replay 4941f3d1b4dSXuan Hu // maybe not used 4951f3d1b4dSXuan Hu imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr 4961f3d1b4dSXuan Hu imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 49760f0c5aeSxiaofeibao imp.io.wakeupFromWB.zip( 49860f0c5aeSxiaofeibao wakeupFromIntWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 49960f0c5aeSxiaofeibao wakeupFromFpWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 50060f0c5aeSxiaofeibao wakeupFromVfWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq 50160f0c5aeSxiaofeibao ).foreach{ case (sink, source) => sink := source} 502f39a61a1SzhanglyGit 5032d270511Ssinsanction case _ => 5042d270511Ssinsanction } 505b7c799beSzhanglyGit val vecMemFeedbackIO: Seq[MemRSFeedbackIO] = vecMemIQs.map { 506b7c799beSzhanglyGit case imp: IssueQueueVecMemImp => 507b7c799beSzhanglyGit imp.io.memIO.get.feedbackIO 508b7c799beSzhanglyGit }.flatten 509b7c799beSzhanglyGit assert(vecMemFeedbackIO.size == io.fromMem.get.vstuFeedback.size, "vecMemFeedback size dont match!") 510b7c799beSzhanglyGit vecMemFeedbackIO.zip(io.fromMem.get.vstuFeedback).foreach{ 511b7c799beSzhanglyGit case (sink, source) => 512b7c799beSzhanglyGit sink := source 513b7c799beSzhanglyGit } 5142d270511Ssinsanction 515730cfbc0SXuan Hu val lsqEnqCtrl = Module(new LsqEnqCtrl) 516730cfbc0SXuan Hu 517730cfbc0SXuan Hu lsqEnqCtrl.io.redirect <> io.fromCtrlBlock.flush 518730cfbc0SXuan Hu lsqEnqCtrl.io.enq <> dispatch2Iq.io.enqLsqIO.get 519730cfbc0SXuan Hu lsqEnqCtrl.io.lcommit := io.fromMem.get.lcommit 520730cfbc0SXuan Hu lsqEnqCtrl.io.scommit := io.fromMem.get.scommit 521730cfbc0SXuan Hu lsqEnqCtrl.io.lqCancelCnt := io.fromMem.get.lqCancelCnt 522730cfbc0SXuan Hu lsqEnqCtrl.io.sqCancelCnt := io.fromMem.get.sqCancelCnt 523f3a9fb05SAnzo dispatch2Iq.io.lqFreeCount.get := lsqEnqCtrl.io.lqFreeCount 524f3a9fb05SAnzo dispatch2Iq.io.sqFreeCount.get := lsqEnqCtrl.io.sqFreeCount 525730cfbc0SXuan Hu io.memIO.get.lsqEnqIO <> lsqEnqCtrl.io.enqLsq 5267e471bf8SXuan Hu 5277e471bf8SXuan Hu dontTouch(io.vecLoadIssueResp) 528730cfbc0SXuan Hu} 529