1730cfbc0SXuan Hupackage xiangshan.backend.issue 2730cfbc0SXuan Hu 3730cfbc0SXuan Huimport chipsalliance.rocketchip.config.Parameters 4730cfbc0SXuan Huimport chisel3._ 5730cfbc0SXuan Huimport chisel3.util._ 6730cfbc0SXuan Huimport freechips.rocketchip.diplomacy.{LazyModule, LazyModuleImp} 7730cfbc0SXuan Huimport xiangshan._ 8730cfbc0SXuan Huimport xiangshan.backend.Bundles 9730cfbc0SXuan Huimport xiangshan.backend.datapath.DataConfig.VAddrData 10730cfbc0SXuan Huimport xiangshan.backend.regfile.RfWritePortWithConfig 11730cfbc0SXuan Huimport xiangshan.backend.rename.BusyTable 12730cfbc0SXuan Huimport xiangshan.mem.{LsqEnqCtrl, LsqEnqIO, MemWaitUpdateReq, SqPtr} 13730cfbc0SXuan Huimport xiangshan.backend.Bundles.{DynInst, IssueQueueWakeUpBundle} 14730cfbc0SXuan Hu 15730cfbc0SXuan Husealed trait SchedulerType 16730cfbc0SXuan Hu 17730cfbc0SXuan Hucase class IntScheduler() extends SchedulerType 18730cfbc0SXuan Hucase class MemScheduler() extends SchedulerType 19730cfbc0SXuan Hucase class VfScheduler() extends SchedulerType 20730cfbc0SXuan Hucase class NoScheduler() extends SchedulerType 21730cfbc0SXuan Hu 22730cfbc0SXuan Huclass Scheduler(val params: SchdBlockParams)(implicit p: Parameters) extends LazyModule with HasXSParameter { 23730cfbc0SXuan Hu val numIntStateWrite = backendParams.numIntWb 24730cfbc0SXuan Hu val numVfStateWrite = backendParams.numVfWb 25730cfbc0SXuan Hu 26730cfbc0SXuan Hu val dispatch2Iq = LazyModule(new Dispatch2Iq(params)) 27730cfbc0SXuan Hu val issueQueue = params.issueBlockParams.map(x => LazyModule(new IssueQueue(x).suggestName(x.getIQName))) 28730cfbc0SXuan Hu 29730cfbc0SXuan Hu lazy val module = params.schdType match { 30730cfbc0SXuan Hu case IntScheduler() => new SchedulerArithImp(this)(params, p) 31730cfbc0SXuan Hu case MemScheduler() => new SchedulerMemImp(this)(params, p) 32730cfbc0SXuan Hu case VfScheduler() => new SchedulerArithImp(this)(params, p) 33730cfbc0SXuan Hu case _ => null 34730cfbc0SXuan Hu } 35730cfbc0SXuan Hu} 36730cfbc0SXuan Hu 37730cfbc0SXuan Huclass SchedulerIO()(implicit params: SchdBlockParams, p: Parameters) extends XSBundle { 3868d13085SXuan Hu // params alias 3968d13085SXuan Hu private val LoadQueueSize = VirtualLoadQueueSize 4068d13085SXuan Hu 41730cfbc0SXuan Hu val fromTop = new Bundle { 42730cfbc0SXuan Hu val hartId = Input(UInt(8.W)) 43730cfbc0SXuan Hu } 442e0a7dc5Sfdy val fromWbFuBusyTable = new Bundle{ 452e0a7dc5Sfdy val fuBusyTableRead = MixedVec(params.issueBlockParams.map(x => Input(x.genWbFuBusyTableReadBundle))) 462e0a7dc5Sfdy } 47dd970561SzhanglyGit val wbFuBusyTable = MixedVec(params.issueBlockParams.map(x => Output(x.genWbFuBusyTableWriteBundle))) 48dd970561SzhanglyGit 49730cfbc0SXuan Hu val fromCtrlBlock = new Bundle { 50730cfbc0SXuan Hu val pcVec = Input(Vec(params.numPcReadPort, UInt(VAddrData().dataWidth.W))) 51730cfbc0SXuan Hu val targetVec = Input(Vec(params.numPcReadPort, UInt(VAddrData().dataWidth.W))) 52730cfbc0SXuan Hu val flush = Flipped(ValidIO(new Redirect)) 53730cfbc0SXuan Hu } 54730cfbc0SXuan Hu val fromDispatch = new Bundle { 55730cfbc0SXuan Hu val allocPregs = Vec(RenameWidth, Input(new ResetPregStateReq)) 56730cfbc0SXuan Hu val uops = Vec(params.numUopIn, Flipped(DecoupledIO(new DynInst))) 57730cfbc0SXuan Hu } 58730cfbc0SXuan Hu val intWriteBack = MixedVec(Vec(backendParams.intPregParams.numWrite, 59730cfbc0SXuan Hu new RfWritePortWithConfig(backendParams.intPregParams.dataCfg, backendParams.intPregParams.addrWidth))) 60730cfbc0SXuan Hu val vfWriteBack = MixedVec(Vec(backendParams.vfPregParams.numWrite, 61730cfbc0SXuan Hu new RfWritePortWithConfig(backendParams.vfPregParams.dataCfg, backendParams.vfPregParams.addrWidth))) 62730cfbc0SXuan Hu val toDataPath: MixedVec[MixedVec[DecoupledIO[Bundles.IssueQueueIssueBundle]]] = MixedVec(params.issueBlockParams.map(_.genIssueDecoupledBundle)) 63730cfbc0SXuan Hu val fromDataPath: MixedVec[MixedVec[Bundles.OGRespBundle]] = MixedVec(params.issueBlockParams.map(x => Flipped(x.genOGRespBundle))) 64730cfbc0SXuan Hu 65*bf35baadSXuan Hu val fromSchedulers = new Bundle { 66*bf35baadSXuan Hu val wakeupVec: MixedVec[ValidIO[IssueQueueWakeUpBundle]] = Flipped(params.genWakeUpInValidBundle) 67*bf35baadSXuan Hu } 68*bf35baadSXuan Hu 69*bf35baadSXuan Hu val toSchedulers = new Bundle { 70*bf35baadSXuan Hu val wakeupVec: MixedVec[ValidIO[IssueQueueWakeUpBundle]] = params.genWakeUpOutValidBundle 71*bf35baadSXuan Hu } 72*bf35baadSXuan Hu 73730cfbc0SXuan Hu val memIO = if (params.isMemSchd) Some(new Bundle { 74730cfbc0SXuan Hu val lsqEnqIO = Flipped(new LsqEnqIO) 75730cfbc0SXuan Hu }) else None 76730cfbc0SXuan Hu val fromMem = if (params.isMemSchd) Some(new Bundle { 777b753bebSXuan Hu val ldaFeedback = Flipped(Vec(params.LduCnt, new MemRSFeedbackIO)) 787b753bebSXuan Hu val staFeedback = Flipped(Vec(params.StaCnt, new MemRSFeedbackIO)) 79730cfbc0SXuan Hu val stIssuePtr = Input(new SqPtr()) 80730cfbc0SXuan Hu val lcommit = Input(UInt(log2Up(CommitWidth + 1).W)) 81730cfbc0SXuan Hu val scommit = Input(UInt(log2Ceil(EnsbufferWidth + 1).W)) // connected to `memBlock.io.sqDeq` instead of ROB 82730cfbc0SXuan Hu // from lsq 83730cfbc0SXuan Hu val lqCancelCnt = Input(UInt(log2Up(LoadQueueSize + 1).W)) 84730cfbc0SXuan Hu val sqCancelCnt = Input(UInt(log2Up(StoreQueueSize + 1).W)) 85730cfbc0SXuan Hu val memWaitUpdateReq = Flipped(new MemWaitUpdateReq) 86730cfbc0SXuan Hu }) else None 87730cfbc0SXuan Hu val toMem = if (params.isMemSchd) Some(new Bundle { 88730cfbc0SXuan Hu val loadFastMatch = Output(Vec(params.LduCnt, new IssueQueueLoadBundle)) 89730cfbc0SXuan Hu }) else None 90730cfbc0SXuan Hu} 91730cfbc0SXuan Hu 92730cfbc0SXuan Huabstract class SchedulerImpBase(wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters) 93730cfbc0SXuan Hu extends LazyModuleImp(wrapper) 94730cfbc0SXuan Hu with HasXSParameter 95730cfbc0SXuan Hu{ 96730cfbc0SXuan Hu val io = IO(new SchedulerIO()) 97730cfbc0SXuan Hu 98730cfbc0SXuan Hu // alias 99*bf35baadSXuan Hu private val iqWakeUpInMap: Map[String, ValidIO[IssueQueueWakeUpBundle]] = 100*bf35baadSXuan Hu io.fromSchedulers.wakeupVec.map(x => (x.bits.wakeupSource, x)).toMap 101730cfbc0SXuan Hu private val schdType = params.schdType 102730cfbc0SXuan Hu private val (numRfRead, numRfWrite) = params.numRfReadWrite.getOrElse((0, 0)) 103730cfbc0SXuan Hu private val numPregs = params.numPregs 104730cfbc0SXuan Hu 105730cfbc0SXuan Hu // Modules 106730cfbc0SXuan Hu val dispatch2Iq: Dispatch2IqImp = wrapper.dispatch2Iq.module 107730cfbc0SXuan Hu val issueQueues: Seq[IssueQueueImp] = wrapper.issueQueue.map(_.module) 108730cfbc0SXuan Hu 109730cfbc0SXuan Hu // BusyTable Modules 110730cfbc0SXuan Hu val intBusyTable = schdType match { 111730cfbc0SXuan Hu case IntScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numIntStateRead, wrapper.numIntStateWrite))) 112730cfbc0SXuan Hu case _ => None 113730cfbc0SXuan Hu } 114730cfbc0SXuan Hu 115730cfbc0SXuan Hu val vfBusyTable = schdType match { 116730cfbc0SXuan Hu case VfScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numVfStateRead, wrapper.numVfStateWrite))) 117730cfbc0SXuan Hu case _ => None 118730cfbc0SXuan Hu } 119730cfbc0SXuan Hu 120730cfbc0SXuan Hu dispatch2Iq.io match { case dp2iq => 121730cfbc0SXuan Hu dp2iq.redirect <> io.fromCtrlBlock.flush 122730cfbc0SXuan Hu dp2iq.in <> io.fromDispatch.uops 123730cfbc0SXuan Hu dp2iq.readIntState.foreach(_ <> intBusyTable.get.io.read) 124730cfbc0SXuan Hu dp2iq.readVfState.foreach(_ <> vfBusyTable.get.io.read) 125730cfbc0SXuan Hu } 126730cfbc0SXuan Hu 127730cfbc0SXuan Hu intBusyTable match { 128730cfbc0SXuan Hu case Some(bt) => 129730cfbc0SXuan Hu bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) => 130730cfbc0SXuan Hu btAllocPregs.valid := dpAllocPregs.isInt 131730cfbc0SXuan Hu btAllocPregs.bits := dpAllocPregs.preg 132730cfbc0SXuan Hu } 133730cfbc0SXuan Hu bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) => 134730cfbc0SXuan Hu wb.valid := io.intWriteBack(i).wen && io.intWriteBack(i).intWen 135730cfbc0SXuan Hu wb.bits := io.intWriteBack(i).addr 136730cfbc0SXuan Hu } 137730cfbc0SXuan Hu case None => 138730cfbc0SXuan Hu } 139730cfbc0SXuan Hu 140730cfbc0SXuan Hu vfBusyTable match { 141730cfbc0SXuan Hu case Some(bt) => 142730cfbc0SXuan Hu bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) => 143730cfbc0SXuan Hu btAllocPregs.valid := dpAllocPregs.isFp 144730cfbc0SXuan Hu btAllocPregs.bits := dpAllocPregs.preg 145730cfbc0SXuan Hu } 146730cfbc0SXuan Hu bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) => 147730cfbc0SXuan Hu wb.valid := io.vfWriteBack(i).wen && (io.vfWriteBack(i).fpWen || io.vfWriteBack(i).vecWen) 148730cfbc0SXuan Hu wb.bits := io.vfWriteBack(i).addr 149730cfbc0SXuan Hu } 150730cfbc0SXuan Hu case None => 151730cfbc0SXuan Hu } 152730cfbc0SXuan Hu 153730cfbc0SXuan Hu val wakeupFromWBVec = Wire(Vec(params.numWakeupFromWB, ValidIO(new IssueQueueWakeUpBundle(params.pregIdxWidth)))) 154730cfbc0SXuan Hu val writeback = params.schdType match { 155730cfbc0SXuan Hu case IntScheduler() => io.intWriteBack 156730cfbc0SXuan Hu case MemScheduler() => io.intWriteBack ++ io.vfWriteBack 157730cfbc0SXuan Hu case VfScheduler() => io.vfWriteBack 158730cfbc0SXuan Hu case _ => Seq() 159730cfbc0SXuan Hu } 160730cfbc0SXuan Hu wakeupFromWBVec.zip(writeback).foreach { case (sink, source) => 161730cfbc0SXuan Hu sink.valid := source.wen 162730cfbc0SXuan Hu sink.bits.rfWen := source.intWen 163730cfbc0SXuan Hu sink.bits.fpWen := source.fpWen 164730cfbc0SXuan Hu sink.bits.vecWen := source.vecWen 165730cfbc0SXuan Hu sink.bits.pdest := source.addr 166730cfbc0SXuan Hu } 167730cfbc0SXuan Hu 168*bf35baadSXuan Hu // Connect bundles having the same wakeup source 169*bf35baadSXuan Hu issueQueues.foreach { iq => 170*bf35baadSXuan Hu iq.io.wakeupFromIQ.foreach { wakeUp => 171*bf35baadSXuan Hu wakeUp := iqWakeUpInMap(wakeUp.bits.wakeupSource) 172*bf35baadSXuan Hu } 173*bf35baadSXuan Hu } 174*bf35baadSXuan Hu 175*bf35baadSXuan Hu private val iqWakeUpOutMap: Map[String, ValidIO[IssueQueueWakeUpBundle]] = 176*bf35baadSXuan Hu issueQueues.flatMap(_.io.wakeupToIQ) 177*bf35baadSXuan Hu .map(x => (x.bits.wakeupSource, x)) 178*bf35baadSXuan Hu .toMap 179*bf35baadSXuan Hu 180*bf35baadSXuan Hu // Connect bundles having the same wakeup source 181*bf35baadSXuan Hu io.toSchedulers.wakeupVec.foreach { wakeUp => 182*bf35baadSXuan Hu wakeUp := iqWakeUpOutMap(wakeUp.bits.wakeupSource) 183*bf35baadSXuan Hu } 184*bf35baadSXuan Hu 185730cfbc0SXuan Hu io.toDataPath.zipWithIndex.foreach { case (toDp, i) => 186730cfbc0SXuan Hu toDp <> issueQueues(i).io.deq 187730cfbc0SXuan Hu } 188*bf35baadSXuan Hu 189*bf35baadSXuan Hu println(s"[Scheduler] io.fromSchedulers.wakeupVec: ${io.fromSchedulers.wakeupVec.map(_.bits.wakeupSource)}") 190*bf35baadSXuan Hu println(s"[Scheduler] iqWakeUpInKeys: ${iqWakeUpInMap.keys}") 191*bf35baadSXuan Hu 192*bf35baadSXuan Hu println(s"[Scheduler] iqWakeUpOutKeys: ${iqWakeUpOutMap.keys}") 193*bf35baadSXuan Hu println(s"[Scheduler] io.toSchedulers.wakeupVec: ${io.toSchedulers.wakeupVec.map(_.bits.wakeupSource)}") 194730cfbc0SXuan Hu} 195730cfbc0SXuan Hu 196730cfbc0SXuan Huclass SchedulerArithImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters) 197730cfbc0SXuan Hu extends SchedulerImpBase(wrapper) 198730cfbc0SXuan Hu with HasXSParameter 199730cfbc0SXuan Hu{ 2002e0a7dc5Sfdy// dontTouch(io.vfWbFuBusyTable) 201730cfbc0SXuan Hu println(s"[SchedulerArithImp] " + 202730cfbc0SXuan Hu s"has intBusyTable: ${intBusyTable.nonEmpty}, " + 203730cfbc0SXuan Hu s"has vfBusyTable: ${vfBusyTable.nonEmpty}") 204730cfbc0SXuan Hu 205730cfbc0SXuan Hu issueQueues.zipWithIndex.foreach { case (iq, i) => 206730cfbc0SXuan Hu iq.io.flush <> io.fromCtrlBlock.flush 207730cfbc0SXuan Hu iq.io.enq <> dispatch2Iq.io.out(i) 208*bf35baadSXuan Hu iq.io.wakeupFromWB := wakeupFromWBVec 209730cfbc0SXuan Hu iq.io.deqResp.zipWithIndex.foreach { case (deqResp, j) => 210ea0f92d8Sczw deqResp.valid := iq.io.deq(j).valid && io.toDataPath(i)(j).ready 211ea0f92d8Sczw deqResp.bits.respType := RSFeedbackType.issueSuccess 212730cfbc0SXuan Hu deqResp.bits.addrOH := iq.io.deq(j).bits.addrOH 2138d29ec32Sczw deqResp.bits.rfWen := iq.io.deq(j).bits.common.rfWen.getOrElse(false.B) 2148d29ec32Sczw deqResp.bits.fuType := iq.io.deq(j).bits.common.fuType 2158d29ec32Sczw 216730cfbc0SXuan Hu } 217730cfbc0SXuan Hu iq.io.og0Resp.zipWithIndex.foreach { case (og0Resp, j) => 218730cfbc0SXuan Hu og0Resp.valid := io.fromDataPath(i)(j).og0resp.valid 219730cfbc0SXuan Hu og0Resp.bits.respType := io.fromDataPath(i)(j).og0resp.bits.respType 220730cfbc0SXuan Hu og0Resp.bits.addrOH := io.fromDataPath(i)(j).og0resp.bits.addrOH 2218d29ec32Sczw og0Resp.bits.rfWen := io.fromDataPath(i)(j).og0resp.bits.rfWen 2228d29ec32Sczw og0Resp.bits.fuType := io.fromDataPath(i)(j).og0resp.bits.fuType 2238d29ec32Sczw 224730cfbc0SXuan Hu } 225730cfbc0SXuan Hu iq.io.og1Resp.zipWithIndex.foreach { case (og1Resp, j) => 226730cfbc0SXuan Hu og1Resp.valid := io.fromDataPath(i)(j).og1resp.valid 227730cfbc0SXuan Hu og1Resp.bits.respType := io.fromDataPath(i)(j).og1resp.bits.respType 228730cfbc0SXuan Hu og1Resp.bits.addrOH := io.fromDataPath(i)(j).og1resp.bits.addrOH 2298d29ec32Sczw og1Resp.bits.rfWen := io.fromDataPath(i)(j).og1resp.bits.rfWen 2308d29ec32Sczw og1Resp.bits.fuType := io.fromDataPath(i)(j).og1resp.bits.fuType 2318d29ec32Sczw 232730cfbc0SXuan Hu } 2332e0a7dc5Sfdy 2342e0a7dc5Sfdy iq.io.wbBusyTableRead := io.fromWbFuBusyTable.fuBusyTableRead(i) 235dd970561SzhanglyGit io.wbFuBusyTable(i) := iq.io.wbBusyTableWrite 236730cfbc0SXuan Hu } 237730cfbc0SXuan Hu 238730cfbc0SXuan Hu val iqJumpBundleVec: Seq[IssueQueueJumpBundle] = issueQueues.map { 239730cfbc0SXuan Hu case imp: IssueQueueIntImp => imp.io.enqJmp 240730cfbc0SXuan Hu case _ => None 241730cfbc0SXuan Hu }.filter(_.nonEmpty).flatMap(_.get) 242730cfbc0SXuan Hu println(s"[Scheduler] iqJumpBundleVec: ${iqJumpBundleVec}") 243730cfbc0SXuan Hu 244730cfbc0SXuan Hu iqJumpBundleVec.zip(io.fromCtrlBlock.pcVec zip io.fromCtrlBlock.targetVec).foreach { case (iqJmp, (pc, target)) => 245730cfbc0SXuan Hu iqJmp.pc := pc 246730cfbc0SXuan Hu iqJmp.target := target 247730cfbc0SXuan Hu } 248730cfbc0SXuan Hu} 249730cfbc0SXuan Hu 250730cfbc0SXuan Huclass SchedulerMemImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters) 251730cfbc0SXuan Hu extends SchedulerImpBase(wrapper) 252730cfbc0SXuan Hu with HasXSParameter 253730cfbc0SXuan Hu{ 254730cfbc0SXuan Hu println(s"[SchedulerMemImp] " + 255730cfbc0SXuan Hu s"has intBusyTable: ${intBusyTable.nonEmpty}, " + 256730cfbc0SXuan Hu s"has vfBusyTable: ${vfBusyTable.nonEmpty}") 257730cfbc0SXuan Hu 258730cfbc0SXuan Hu val memAddrIQs = issueQueues.filter(iq => iq.params.StdCnt == 0) 259730cfbc0SXuan Hu val stAddrIQs = issueQueues.filter(iq => iq.params.StaCnt > 0) // included in memAddrIQs 2607b753bebSXuan Hu val ldAddrIQs = issueQueues.filter(iq => iq.params.LduCnt > 0) 261730cfbc0SXuan Hu val stDataIQs = issueQueues.filter(iq => iq.params.StdCnt > 0) 262730cfbc0SXuan Hu require(memAddrIQs.nonEmpty && stDataIQs.nonEmpty) 263730cfbc0SXuan Hu 264730cfbc0SXuan Hu issueQueues.zipWithIndex.foreach { case (iq, i) => 265730cfbc0SXuan Hu iq.io.deqResp.zipWithIndex.foreach { case (deqResp, j) => 266ea0f92d8Sczw deqResp.valid := iq.io.deq(j).valid && io.toDataPath(i)(j).ready 267ea0f92d8Sczw deqResp.bits.respType := RSFeedbackType.issueSuccess 268730cfbc0SXuan Hu deqResp.bits.addrOH := iq.io.deq(j).bits.addrOH 2698d29ec32Sczw deqResp.bits.rfWen := iq.io.deq(j).bits.common.rfWen.getOrElse(false.B) 2708d29ec32Sczw deqResp.bits.fuType := iq.io.deq(j).bits.common.fuType 2718d29ec32Sczw 272730cfbc0SXuan Hu } 273730cfbc0SXuan Hu iq.io.og0Resp.zipWithIndex.foreach { case (og0Resp, j) => 274730cfbc0SXuan Hu og0Resp.valid := io.fromDataPath(i)(j).og0resp.valid 275730cfbc0SXuan Hu og0Resp.bits.respType := io.fromDataPath(i)(j).og0resp.bits.respType 276730cfbc0SXuan Hu og0Resp.bits.addrOH := io.fromDataPath(i)(j).og0resp.bits.addrOH 2778d29ec32Sczw og0Resp.bits.rfWen := io.fromDataPath(i)(j).og0resp.bits.rfWen 2788d29ec32Sczw og0Resp.bits.fuType := io.fromDataPath(i)(j).og0resp.bits.fuType 2798d29ec32Sczw 280730cfbc0SXuan Hu } 281730cfbc0SXuan Hu iq.io.og1Resp.zipWithIndex.foreach { case (og1Resp, j) => 282730cfbc0SXuan Hu og1Resp.valid := io.fromDataPath(i)(j).og1resp.valid 283730cfbc0SXuan Hu og1Resp.bits.respType := io.fromDataPath(i)(j).og1resp.bits.respType 284730cfbc0SXuan Hu og1Resp.bits.addrOH := io.fromDataPath(i)(j).og1resp.bits.addrOH 2858d29ec32Sczw og1Resp.bits.rfWen := io.fromDataPath(i)(j).og1resp.bits.rfWen 2868d29ec32Sczw og1Resp.bits.fuType := io.fromDataPath(i)(j).og1resp.bits.fuType 2878d29ec32Sczw 288730cfbc0SXuan Hu } 2892e0a7dc5Sfdy iq.io.wbBusyTableRead := io.fromWbFuBusyTable.fuBusyTableRead(i) 290dd970561SzhanglyGit io.wbFuBusyTable(i) := iq.io.wbBusyTableWrite 291730cfbc0SXuan Hu } 292730cfbc0SXuan Hu 293730cfbc0SXuan Hu memAddrIQs.zipWithIndex.foreach { case (iq, i) => 294730cfbc0SXuan Hu iq.io.flush <> io.fromCtrlBlock.flush 295730cfbc0SXuan Hu iq.io.enq <> dispatch2Iq.io.out(i) 296*bf35baadSXuan Hu iq.io.wakeupFromWB := wakeupFromWBVec 297730cfbc0SXuan Hu } 298730cfbc0SXuan Hu 2997b753bebSXuan Hu ldAddrIQs.foreach { 3007b753bebSXuan Hu case imp: IssueQueueMemAddrImp => imp.io.memIO.get.feedbackIO <> io.fromMem.get.ldaFeedback 3017b753bebSXuan Hu case _ => 3027b753bebSXuan Hu } 3037b753bebSXuan Hu 3047b753bebSXuan Hu stAddrIQs.foreach { 3057b753bebSXuan Hu case imp: IssueQueueMemAddrImp => imp.io.memIO.get.feedbackIO <> io.fromMem.get.staFeedback 3067b753bebSXuan Hu case _ => 3077b753bebSXuan Hu } 308730cfbc0SXuan Hu 3099b258a00Sxgkiri private val staIdxSeq = issueQueues.filter(iq => iq.params.StaCnt > 0).map(iq => iq.params.idxInSchBlk) 3109b258a00Sxgkiri 3119b258a00Sxgkiri for ((idxInSchBlk, i) <- staIdxSeq.zipWithIndex) { 3129b258a00Sxgkiri dispatch2Iq.io.out(idxInSchBlk).zip(stAddrIQs(i).io.enq).zip(stDataIQs(i).io.enq).foreach{ case((di, staIQ), stdIQ) => 313730cfbc0SXuan Hu val isAllReady = staIQ.ready && stdIQ.ready 314730cfbc0SXuan Hu di.ready := isAllReady 315730cfbc0SXuan Hu staIQ.valid := di.valid && isAllReady 316730cfbc0SXuan Hu stdIQ.valid := di.valid && isAllReady 317730cfbc0SXuan Hu } 3189b258a00Sxgkiri } 319730cfbc0SXuan Hu 320730cfbc0SXuan Hu require(stAddrIQs.size == stDataIQs.size, s"number of store address IQs(${stAddrIQs.size}) " + 321730cfbc0SXuan Hu s"should be equal to number of data IQs(${stDataIQs})") 322730cfbc0SXuan Hu stDataIQs.zip(stAddrIQs).zipWithIndex.foreach { case ((stdIQ, staIQ), i) => 323730cfbc0SXuan Hu stdIQ.io.flush <> io.fromCtrlBlock.flush 324730cfbc0SXuan Hu 325730cfbc0SXuan Hu stdIQ.io.enq.zip(staIQ.io.enq).foreach { case (stdIQEnq, staIQEnq) => 326730cfbc0SXuan Hu stdIQEnq.bits := staIQEnq.bits 327730cfbc0SXuan Hu // Store data reuses store addr src(1) in dispatch2iq 328730cfbc0SXuan Hu // [dispatch2iq] --src*------src*(0)--> [staIQ] 329730cfbc0SXuan Hu // \ 330730cfbc0SXuan Hu // ---src*(1)--> [stdIQ] 331730cfbc0SXuan Hu // Since the src(1) of sta is easier to get, stdIQEnq.bits.src*(0) is assigned to staIQEnq.bits.src*(1) 332730cfbc0SXuan Hu // instead of dispatch2Iq.io.out(x).bits.src*(1) 333730cfbc0SXuan Hu stdIQEnq.bits.srcState(0) := staIQEnq.bits.srcState(1) 334730cfbc0SXuan Hu stdIQEnq.bits.srcType(0) := staIQEnq.bits.srcType(1) 335730cfbc0SXuan Hu stdIQEnq.bits.psrc(0) := staIQEnq.bits.psrc(1) 336730cfbc0SXuan Hu stdIQEnq.bits.sqIdx := staIQEnq.bits.sqIdx 337730cfbc0SXuan Hu } 338*bf35baadSXuan Hu stdIQ.io.wakeupFromWB := wakeupFromWBVec 339730cfbc0SXuan Hu } 340730cfbc0SXuan Hu 341730cfbc0SXuan Hu val lsqEnqCtrl = Module(new LsqEnqCtrl) 342730cfbc0SXuan Hu 343730cfbc0SXuan Hu lsqEnqCtrl.io.redirect <> io.fromCtrlBlock.flush 344730cfbc0SXuan Hu lsqEnqCtrl.io.enq <> dispatch2Iq.io.enqLsqIO.get 345730cfbc0SXuan Hu lsqEnqCtrl.io.lcommit := io.fromMem.get.lcommit 346730cfbc0SXuan Hu lsqEnqCtrl.io.scommit := io.fromMem.get.scommit 347730cfbc0SXuan Hu lsqEnqCtrl.io.lqCancelCnt := io.fromMem.get.lqCancelCnt 348730cfbc0SXuan Hu lsqEnqCtrl.io.sqCancelCnt := io.fromMem.get.sqCancelCnt 349730cfbc0SXuan Hu io.memIO.get.lsqEnqIO <> lsqEnqCtrl.io.enqLsq 350730cfbc0SXuan Hu} 351