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._ 810fe9778SXuan 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 Hu 14730cfbc0SXuan Husealed trait SchedulerType 15730cfbc0SXuan Hu 16730cfbc0SXuan Hucase class IntScheduler() extends SchedulerType 17730cfbc0SXuan Hucase class MemScheduler() extends SchedulerType 18730cfbc0SXuan Hucase class VfScheduler() extends SchedulerType 19730cfbc0SXuan Hucase class NoScheduler() extends SchedulerType 20730cfbc0SXuan Hu 21730cfbc0SXuan Huclass Scheduler(val params: SchdBlockParams)(implicit p: Parameters) extends LazyModule with HasXSParameter { 22730cfbc0SXuan Hu val numIntStateWrite = backendParams.numIntWb 23730cfbc0SXuan Hu val numVfStateWrite = backendParams.numVfWb 24730cfbc0SXuan Hu 25730cfbc0SXuan Hu val dispatch2Iq = LazyModule(new Dispatch2Iq(params)) 26730cfbc0SXuan Hu val issueQueue = params.issueBlockParams.map(x => LazyModule(new IssueQueue(x).suggestName(x.getIQName))) 27730cfbc0SXuan Hu 28730cfbc0SXuan Hu lazy val module = params.schdType match { 29730cfbc0SXuan Hu case IntScheduler() => new SchedulerArithImp(this)(params, p) 30730cfbc0SXuan Hu case MemScheduler() => new SchedulerMemImp(this)(params, p) 31730cfbc0SXuan Hu case VfScheduler() => new SchedulerArithImp(this)(params, p) 32730cfbc0SXuan Hu case _ => null 33730cfbc0SXuan Hu } 34730cfbc0SXuan Hu} 35730cfbc0SXuan Hu 36ea46c302SXuan Huclass SchedulerIO()(implicit params: SchdBlockParams, p: Parameters) extends Bundle { 3768d13085SXuan Hu // params alias 38ea46c302SXuan Hu private val backendParams = params.backendParam 39ea46c302SXuan Hu private val LoadQueueSize = p(XSCoreParamsKey).VirtualLoadQueueSize 40ea46c302SXuan Hu private val RenameWidth = p(XSCoreParamsKey).RenameWidth 41ea46c302SXuan Hu private val CommitWidth = p(XSCoreParamsKey).CommitWidth 42ea46c302SXuan Hu private val EnsbufferWidth = p(XSCoreParamsKey).EnsbufferWidth 43ea46c302SXuan Hu private val StoreQueueSize = p(XSCoreParamsKey).StoreQueueSize 4468d13085SXuan Hu 45730cfbc0SXuan Hu val fromTop = new Bundle { 46730cfbc0SXuan Hu val hartId = Input(UInt(8.W)) 47730cfbc0SXuan Hu } 482e0a7dc5Sfdy val fromWbFuBusyTable = new Bundle{ 492e0a7dc5Sfdy val fuBusyTableRead = MixedVec(params.issueBlockParams.map(x => Input(x.genWbFuBusyTableReadBundle))) 502e0a7dc5Sfdy } 51dd970561SzhanglyGit val wbFuBusyTable = MixedVec(params.issueBlockParams.map(x => Output(x.genWbFuBusyTableWriteBundle))) 52dd970561SzhanglyGit 53730cfbc0SXuan Hu val fromCtrlBlock = new Bundle { 54730cfbc0SXuan Hu val pcVec = Input(Vec(params.numPcReadPort, UInt(VAddrData().dataWidth.W))) 55730cfbc0SXuan Hu val targetVec = Input(Vec(params.numPcReadPort, UInt(VAddrData().dataWidth.W))) 56730cfbc0SXuan Hu val flush = Flipped(ValidIO(new Redirect)) 57730cfbc0SXuan Hu } 58730cfbc0SXuan Hu val fromDispatch = new Bundle { 59730cfbc0SXuan Hu val allocPregs = Vec(RenameWidth, Input(new ResetPregStateReq)) 60730cfbc0SXuan Hu val uops = Vec(params.numUopIn, Flipped(DecoupledIO(new DynInst))) 61730cfbc0SXuan Hu } 62730cfbc0SXuan Hu val intWriteBack = MixedVec(Vec(backendParams.intPregParams.numWrite, 63730cfbc0SXuan Hu new RfWritePortWithConfig(backendParams.intPregParams.dataCfg, backendParams.intPregParams.addrWidth))) 64730cfbc0SXuan Hu val vfWriteBack = MixedVec(Vec(backendParams.vfPregParams.numWrite, 65730cfbc0SXuan Hu new RfWritePortWithConfig(backendParams.vfPregParams.dataCfg, backendParams.vfPregParams.addrWidth))) 6610fe9778SXuan Hu val toDataPath: MixedVec[MixedVec[DecoupledIO[IssueQueueIssueBundle]]] = MixedVec(params.issueBlockParams.map(_.genIssueDecoupledBundle)) 67*59ef6009Sxiaofeibao-xjtu val toDataPathAfterDelay: MixedVec[MixedVec[DecoupledIO[IssueQueueIssueBundle]]] = MixedVec(params.issueBlockParams.map(_.genIssueDecoupledBundle)) 68*59ef6009Sxiaofeibao-xjtu val fromCancelNetwork = Flipped(MixedVec(params.issueBlockParams.map(_.genIssueDecoupledBundle))) 69730cfbc0SXuan Hu 70bf35baadSXuan Hu val fromSchedulers = new Bundle { 71c0be7f33SXuan Hu val wakeupVec: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpInValidBundle) 72bf35baadSXuan Hu } 73bf35baadSXuan Hu 74bf35baadSXuan Hu val toSchedulers = new Bundle { 75c0be7f33SXuan Hu val wakeupVec: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = params.genIQWakeUpOutValidBundle 76bf35baadSXuan Hu } 77bf35baadSXuan Hu 78c0be7f33SXuan Hu val fromDataPath = new Bundle { 7910fe9778SXuan Hu val resp: MixedVec[MixedVec[OGRespBundle]] = MixedVec(params.issueBlockParams.map(x => Flipped(x.genOGRespBundle))) 80ea46c302SXuan Hu val og0Cancel = Input(ExuVec(backendParams.numExu)) 81ea46c302SXuan Hu // Todo: remove this after no cancel signal from og1 82ea46c302SXuan Hu val og1Cancel = Input(ExuVec(backendParams.numExu)) 83c0be7f33SXuan Hu // just be compatible to old code 84c0be7f33SXuan Hu def apply(i: Int)(j: Int) = resp(i)(j) 85c0be7f33SXuan Hu } 86c0be7f33SXuan Hu 87c0be7f33SXuan Hu 88730cfbc0SXuan Hu val memIO = if (params.isMemSchd) Some(new Bundle { 89730cfbc0SXuan Hu val lsqEnqIO = Flipped(new LsqEnqIO) 90730cfbc0SXuan Hu }) else None 91730cfbc0SXuan Hu val fromMem = if (params.isMemSchd) Some(new Bundle { 927b753bebSXuan Hu val ldaFeedback = Flipped(Vec(params.LduCnt, new MemRSFeedbackIO)) 937b753bebSXuan Hu val staFeedback = Flipped(Vec(params.StaCnt, new MemRSFeedbackIO)) 94730cfbc0SXuan Hu val stIssuePtr = Input(new SqPtr()) 95730cfbc0SXuan Hu val lcommit = Input(UInt(log2Up(CommitWidth + 1).W)) 96730cfbc0SXuan Hu val scommit = Input(UInt(log2Ceil(EnsbufferWidth + 1).W)) // connected to `memBlock.io.sqDeq` instead of ROB 97730cfbc0SXuan Hu // from lsq 98730cfbc0SXuan Hu val lqCancelCnt = Input(UInt(log2Up(LoadQueueSize + 1).W)) 99730cfbc0SXuan Hu val sqCancelCnt = Input(UInt(log2Up(StoreQueueSize + 1).W)) 100730cfbc0SXuan Hu val memWaitUpdateReq = Flipped(new MemWaitUpdateReq) 101730cfbc0SXuan Hu }) else None 102730cfbc0SXuan Hu val toMem = if (params.isMemSchd) Some(new Bundle { 103730cfbc0SXuan Hu val loadFastMatch = Output(Vec(params.LduCnt, new IssueQueueLoadBundle)) 104730cfbc0SXuan Hu }) else None 105730cfbc0SXuan Hu} 106730cfbc0SXuan Hu 107730cfbc0SXuan Huabstract class SchedulerImpBase(wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters) 108730cfbc0SXuan Hu extends LazyModuleImp(wrapper) 109730cfbc0SXuan Hu with HasXSParameter 110730cfbc0SXuan Hu{ 111730cfbc0SXuan Hu val io = IO(new SchedulerIO()) 112730cfbc0SXuan Hu 113730cfbc0SXuan Hu // alias 114c0be7f33SXuan Hu private val iqWakeUpInMap: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] = 115c0be7f33SXuan Hu io.fromSchedulers.wakeupVec.map(x => (x.bits.exuIdx, x)).toMap 116730cfbc0SXuan Hu private val schdType = params.schdType 117730cfbc0SXuan Hu private val (numRfRead, numRfWrite) = params.numRfReadWrite.getOrElse((0, 0)) 118730cfbc0SXuan Hu private val numPregs = params.numPregs 119730cfbc0SXuan Hu 120730cfbc0SXuan Hu // Modules 121730cfbc0SXuan Hu val dispatch2Iq: Dispatch2IqImp = wrapper.dispatch2Iq.module 122730cfbc0SXuan Hu val issueQueues: Seq[IssueQueueImp] = wrapper.issueQueue.map(_.module) 123730cfbc0SXuan Hu 124730cfbc0SXuan Hu // BusyTable Modules 125730cfbc0SXuan Hu val intBusyTable = schdType match { 126730cfbc0SXuan Hu case IntScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numIntStateRead, wrapper.numIntStateWrite))) 127730cfbc0SXuan Hu case _ => None 128730cfbc0SXuan Hu } 129730cfbc0SXuan Hu 130730cfbc0SXuan Hu val vfBusyTable = schdType match { 131730cfbc0SXuan Hu case VfScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numVfStateRead, wrapper.numVfStateWrite))) 132730cfbc0SXuan Hu case _ => None 133730cfbc0SXuan Hu } 134730cfbc0SXuan Hu 135730cfbc0SXuan Hu dispatch2Iq.io match { case dp2iq => 136730cfbc0SXuan Hu dp2iq.redirect <> io.fromCtrlBlock.flush 137730cfbc0SXuan Hu dp2iq.in <> io.fromDispatch.uops 138730cfbc0SXuan Hu dp2iq.readIntState.foreach(_ <> intBusyTable.get.io.read) 139730cfbc0SXuan Hu dp2iq.readVfState.foreach(_ <> vfBusyTable.get.io.read) 140730cfbc0SXuan Hu } 141730cfbc0SXuan Hu 142730cfbc0SXuan Hu intBusyTable match { 143730cfbc0SXuan Hu case Some(bt) => 144730cfbc0SXuan Hu bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) => 145730cfbc0SXuan Hu btAllocPregs.valid := dpAllocPregs.isInt 146730cfbc0SXuan Hu btAllocPregs.bits := dpAllocPregs.preg 147730cfbc0SXuan Hu } 148730cfbc0SXuan Hu bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) => 149730cfbc0SXuan Hu wb.valid := io.intWriteBack(i).wen && io.intWriteBack(i).intWen 150730cfbc0SXuan Hu wb.bits := io.intWriteBack(i).addr 151730cfbc0SXuan Hu } 152730cfbc0SXuan Hu case None => 153730cfbc0SXuan Hu } 154730cfbc0SXuan Hu 155730cfbc0SXuan Hu vfBusyTable match { 156730cfbc0SXuan Hu case Some(bt) => 157730cfbc0SXuan Hu bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) => 158730cfbc0SXuan Hu btAllocPregs.valid := dpAllocPregs.isFp 159730cfbc0SXuan Hu btAllocPregs.bits := dpAllocPregs.preg 160730cfbc0SXuan Hu } 161730cfbc0SXuan Hu bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) => 162730cfbc0SXuan Hu wb.valid := io.vfWriteBack(i).wen && (io.vfWriteBack(i).fpWen || io.vfWriteBack(i).vecWen) 163730cfbc0SXuan Hu wb.bits := io.vfWriteBack(i).addr 164730cfbc0SXuan Hu } 165730cfbc0SXuan Hu case None => 166730cfbc0SXuan Hu } 167730cfbc0SXuan Hu 168c0be7f33SXuan Hu val wakeupFromWBVec = Wire(params.genWBWakeUpSinkValidBundle) 169730cfbc0SXuan Hu val writeback = params.schdType match { 170730cfbc0SXuan Hu case IntScheduler() => io.intWriteBack 171730cfbc0SXuan Hu case MemScheduler() => io.intWriteBack ++ io.vfWriteBack 172730cfbc0SXuan Hu case VfScheduler() => io.vfWriteBack 173730cfbc0SXuan Hu case _ => Seq() 174730cfbc0SXuan Hu } 175730cfbc0SXuan Hu wakeupFromWBVec.zip(writeback).foreach { case (sink, source) => 176730cfbc0SXuan Hu sink.valid := source.wen 177730cfbc0SXuan Hu sink.bits.rfWen := source.intWen 178730cfbc0SXuan Hu sink.bits.fpWen := source.fpWen 179730cfbc0SXuan Hu sink.bits.vecWen := source.vecWen 180730cfbc0SXuan Hu sink.bits.pdest := source.addr 181730cfbc0SXuan Hu } 182730cfbc0SXuan Hu 183bf35baadSXuan Hu // Connect bundles having the same wakeup source 184*59ef6009Sxiaofeibao-xjtu issueQueues.zipWithIndex.foreach { case(iq, i) => 185bf35baadSXuan Hu iq.io.wakeupFromIQ.foreach { wakeUp => 186c0be7f33SXuan Hu wakeUp := iqWakeUpInMap(wakeUp.bits.exuIdx) 187bf35baadSXuan Hu } 188ea46c302SXuan Hu iq.io.og0Cancel := io.fromDataPath.og0Cancel 189ea46c302SXuan Hu iq.io.og1Cancel := io.fromDataPath.og1Cancel 190*59ef6009Sxiaofeibao-xjtu iq.io.fromCancelNetwork <> io.fromCancelNetwork(i) 191bf35baadSXuan Hu } 192bf35baadSXuan Hu 193c0be7f33SXuan Hu private val iqWakeUpOutMap: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] = 194bf35baadSXuan Hu issueQueues.flatMap(_.io.wakeupToIQ) 195c0be7f33SXuan Hu .map(x => (x.bits.exuIdx, x)) 196bf35baadSXuan Hu .toMap 197bf35baadSXuan Hu 198bf35baadSXuan Hu // Connect bundles having the same wakeup source 199bf35baadSXuan Hu io.toSchedulers.wakeupVec.foreach { wakeUp => 200c0be7f33SXuan Hu wakeUp := iqWakeUpOutMap(wakeUp.bits.exuIdx) 201bf35baadSXuan Hu } 202bf35baadSXuan Hu 203730cfbc0SXuan Hu io.toDataPath.zipWithIndex.foreach { case (toDp, i) => 204730cfbc0SXuan Hu toDp <> issueQueues(i).io.deq 205730cfbc0SXuan Hu } 206*59ef6009Sxiaofeibao-xjtu io.toDataPathAfterDelay.zipWithIndex.foreach { case (toDpDy, i) => 207*59ef6009Sxiaofeibao-xjtu toDpDy <> issueQueues(i).io.deqDelay 208*59ef6009Sxiaofeibao-xjtu } 209bf35baadSXuan Hu 210c0be7f33SXuan Hu println(s"[Scheduler] io.fromSchedulers.wakeupVec: ${io.fromSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}") 211bf35baadSXuan Hu println(s"[Scheduler] iqWakeUpInKeys: ${iqWakeUpInMap.keys}") 212bf35baadSXuan Hu 213bf35baadSXuan Hu println(s"[Scheduler] iqWakeUpOutKeys: ${iqWakeUpOutMap.keys}") 214c0be7f33SXuan Hu println(s"[Scheduler] io.toSchedulers.wakeupVec: ${io.toSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}") 215730cfbc0SXuan Hu} 216730cfbc0SXuan Hu 217730cfbc0SXuan Huclass SchedulerArithImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters) 218730cfbc0SXuan Hu extends SchedulerImpBase(wrapper) 219730cfbc0SXuan Hu with HasXSParameter 220730cfbc0SXuan Hu{ 2212e0a7dc5Sfdy// dontTouch(io.vfWbFuBusyTable) 222730cfbc0SXuan Hu println(s"[SchedulerArithImp] " + 223730cfbc0SXuan Hu s"has intBusyTable: ${intBusyTable.nonEmpty}, " + 224730cfbc0SXuan Hu s"has vfBusyTable: ${vfBusyTable.nonEmpty}") 225730cfbc0SXuan Hu 226730cfbc0SXuan Hu issueQueues.zipWithIndex.foreach { case (iq, i) => 227730cfbc0SXuan Hu iq.io.flush <> io.fromCtrlBlock.flush 228730cfbc0SXuan Hu iq.io.enq <> dispatch2Iq.io.out(i) 229bf35baadSXuan Hu iq.io.wakeupFromWB := wakeupFromWBVec 230730cfbc0SXuan Hu iq.io.deqResp.zipWithIndex.foreach { case (deqResp, j) => 231ea0f92d8Sczw deqResp.valid := iq.io.deq(j).valid && io.toDataPath(i)(j).ready 232ea0f92d8Sczw deqResp.bits.respType := RSFeedbackType.issueSuccess 233730cfbc0SXuan Hu deqResp.bits.addrOH := iq.io.deq(j).bits.addrOH 2348d29ec32Sczw deqResp.bits.rfWen := iq.io.deq(j).bits.common.rfWen.getOrElse(false.B) 2358d29ec32Sczw deqResp.bits.fuType := iq.io.deq(j).bits.common.fuType 2368d29ec32Sczw 237730cfbc0SXuan Hu } 238730cfbc0SXuan Hu iq.io.og0Resp.zipWithIndex.foreach { case (og0Resp, j) => 239730cfbc0SXuan Hu og0Resp.valid := io.fromDataPath(i)(j).og0resp.valid 240730cfbc0SXuan Hu og0Resp.bits.respType := io.fromDataPath(i)(j).og0resp.bits.respType 241730cfbc0SXuan Hu og0Resp.bits.addrOH := io.fromDataPath(i)(j).og0resp.bits.addrOH 2428d29ec32Sczw og0Resp.bits.rfWen := io.fromDataPath(i)(j).og0resp.bits.rfWen 2438d29ec32Sczw og0Resp.bits.fuType := io.fromDataPath(i)(j).og0resp.bits.fuType 2448d29ec32Sczw 245730cfbc0SXuan Hu } 246730cfbc0SXuan Hu iq.io.og1Resp.zipWithIndex.foreach { case (og1Resp, j) => 247730cfbc0SXuan Hu og1Resp.valid := io.fromDataPath(i)(j).og1resp.valid 248730cfbc0SXuan Hu og1Resp.bits.respType := io.fromDataPath(i)(j).og1resp.bits.respType 249730cfbc0SXuan Hu og1Resp.bits.addrOH := io.fromDataPath(i)(j).og1resp.bits.addrOH 2508d29ec32Sczw og1Resp.bits.rfWen := io.fromDataPath(i)(j).og1resp.bits.rfWen 2518d29ec32Sczw og1Resp.bits.fuType := io.fromDataPath(i)(j).og1resp.bits.fuType 2528d29ec32Sczw 253730cfbc0SXuan Hu } 2542e0a7dc5Sfdy 2552e0a7dc5Sfdy iq.io.wbBusyTableRead := io.fromWbFuBusyTable.fuBusyTableRead(i) 256dd970561SzhanglyGit io.wbFuBusyTable(i) := iq.io.wbBusyTableWrite 257730cfbc0SXuan Hu } 258730cfbc0SXuan Hu 259730cfbc0SXuan Hu val iqJumpBundleVec: Seq[IssueQueueJumpBundle] = issueQueues.map { 260730cfbc0SXuan Hu case imp: IssueQueueIntImp => imp.io.enqJmp 261730cfbc0SXuan Hu case _ => None 262730cfbc0SXuan Hu }.filter(_.nonEmpty).flatMap(_.get) 263730cfbc0SXuan Hu println(s"[Scheduler] iqJumpBundleVec: ${iqJumpBundleVec}") 264730cfbc0SXuan Hu 265730cfbc0SXuan Hu iqJumpBundleVec.zip(io.fromCtrlBlock.pcVec zip io.fromCtrlBlock.targetVec).foreach { case (iqJmp, (pc, target)) => 266730cfbc0SXuan Hu iqJmp.pc := pc 267730cfbc0SXuan Hu iqJmp.target := target 268730cfbc0SXuan Hu } 269730cfbc0SXuan Hu} 270730cfbc0SXuan Hu 271730cfbc0SXuan Huclass SchedulerMemImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters) 272730cfbc0SXuan Hu extends SchedulerImpBase(wrapper) 273730cfbc0SXuan Hu with HasXSParameter 274730cfbc0SXuan Hu{ 275730cfbc0SXuan Hu println(s"[SchedulerMemImp] " + 276730cfbc0SXuan Hu s"has intBusyTable: ${intBusyTable.nonEmpty}, " + 277730cfbc0SXuan Hu s"has vfBusyTable: ${vfBusyTable.nonEmpty}") 278730cfbc0SXuan Hu 279730cfbc0SXuan Hu val memAddrIQs = issueQueues.filter(iq => iq.params.StdCnt == 0) 280730cfbc0SXuan Hu val stAddrIQs = issueQueues.filter(iq => iq.params.StaCnt > 0) // included in memAddrIQs 2817b753bebSXuan Hu val ldAddrIQs = issueQueues.filter(iq => iq.params.LduCnt > 0) 282730cfbc0SXuan Hu val stDataIQs = issueQueues.filter(iq => iq.params.StdCnt > 0) 283730cfbc0SXuan Hu require(memAddrIQs.nonEmpty && stDataIQs.nonEmpty) 284730cfbc0SXuan Hu 285730cfbc0SXuan Hu issueQueues.zipWithIndex.foreach { case (iq, i) => 286730cfbc0SXuan Hu iq.io.deqResp.zipWithIndex.foreach { case (deqResp, j) => 287ea0f92d8Sczw deqResp.valid := iq.io.deq(j).valid && io.toDataPath(i)(j).ready 288ea0f92d8Sczw deqResp.bits.respType := RSFeedbackType.issueSuccess 289730cfbc0SXuan Hu deqResp.bits.addrOH := iq.io.deq(j).bits.addrOH 2908d29ec32Sczw deqResp.bits.rfWen := iq.io.deq(j).bits.common.rfWen.getOrElse(false.B) 2918d29ec32Sczw deqResp.bits.fuType := iq.io.deq(j).bits.common.fuType 2928d29ec32Sczw 293730cfbc0SXuan Hu } 294730cfbc0SXuan Hu iq.io.og0Resp.zipWithIndex.foreach { case (og0Resp, j) => 295730cfbc0SXuan Hu og0Resp.valid := io.fromDataPath(i)(j).og0resp.valid 296730cfbc0SXuan Hu og0Resp.bits.respType := io.fromDataPath(i)(j).og0resp.bits.respType 297730cfbc0SXuan Hu og0Resp.bits.addrOH := io.fromDataPath(i)(j).og0resp.bits.addrOH 2988d29ec32Sczw og0Resp.bits.rfWen := io.fromDataPath(i)(j).og0resp.bits.rfWen 2998d29ec32Sczw og0Resp.bits.fuType := io.fromDataPath(i)(j).og0resp.bits.fuType 3008d29ec32Sczw 301730cfbc0SXuan Hu } 302730cfbc0SXuan Hu iq.io.og1Resp.zipWithIndex.foreach { case (og1Resp, j) => 303730cfbc0SXuan Hu og1Resp.valid := io.fromDataPath(i)(j).og1resp.valid 304730cfbc0SXuan Hu og1Resp.bits.respType := io.fromDataPath(i)(j).og1resp.bits.respType 305730cfbc0SXuan Hu og1Resp.bits.addrOH := io.fromDataPath(i)(j).og1resp.bits.addrOH 3068d29ec32Sczw og1Resp.bits.rfWen := io.fromDataPath(i)(j).og1resp.bits.rfWen 3078d29ec32Sczw og1Resp.bits.fuType := io.fromDataPath(i)(j).og1resp.bits.fuType 3088d29ec32Sczw 309730cfbc0SXuan Hu } 3102e0a7dc5Sfdy iq.io.wbBusyTableRead := io.fromWbFuBusyTable.fuBusyTableRead(i) 311dd970561SzhanglyGit io.wbFuBusyTable(i) := iq.io.wbBusyTableWrite 312730cfbc0SXuan Hu } 313730cfbc0SXuan Hu 314730cfbc0SXuan Hu memAddrIQs.zipWithIndex.foreach { case (iq, i) => 315730cfbc0SXuan Hu iq.io.flush <> io.fromCtrlBlock.flush 316730cfbc0SXuan Hu iq.io.enq <> dispatch2Iq.io.out(i) 317bf35baadSXuan Hu iq.io.wakeupFromWB := wakeupFromWBVec 318730cfbc0SXuan Hu } 319730cfbc0SXuan Hu 3207b753bebSXuan Hu ldAddrIQs.foreach { 321de784418SXuan Hu case imp: IssueQueueMemAddrImp => 322de784418SXuan Hu imp.io.memIO.get.feedbackIO <> io.fromMem.get.ldaFeedback 323de784418SXuan Hu imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 3247b753bebSXuan Hu case _ => 3257b753bebSXuan Hu } 3267b753bebSXuan Hu 3277b753bebSXuan Hu stAddrIQs.foreach { 3287b753bebSXuan Hu case imp: IssueQueueMemAddrImp => imp.io.memIO.get.feedbackIO <> io.fromMem.get.staFeedback 3297b753bebSXuan Hu case _ => 3307b753bebSXuan Hu } 331730cfbc0SXuan Hu 3329b258a00Sxgkiri private val staIdxSeq = issueQueues.filter(iq => iq.params.StaCnt > 0).map(iq => iq.params.idxInSchBlk) 3339b258a00Sxgkiri 3349b258a00Sxgkiri for ((idxInSchBlk, i) <- staIdxSeq.zipWithIndex) { 3359b258a00Sxgkiri dispatch2Iq.io.out(idxInSchBlk).zip(stAddrIQs(i).io.enq).zip(stDataIQs(i).io.enq).foreach{ case((di, staIQ), stdIQ) => 336730cfbc0SXuan Hu val isAllReady = staIQ.ready && stdIQ.ready 337730cfbc0SXuan Hu di.ready := isAllReady 338730cfbc0SXuan Hu staIQ.valid := di.valid && isAllReady 339730cfbc0SXuan Hu stdIQ.valid := di.valid && isAllReady 340730cfbc0SXuan Hu } 3419b258a00Sxgkiri } 342730cfbc0SXuan Hu 343730cfbc0SXuan Hu require(stAddrIQs.size == stDataIQs.size, s"number of store address IQs(${stAddrIQs.size}) " + 344730cfbc0SXuan Hu s"should be equal to number of data IQs(${stDataIQs})") 345730cfbc0SXuan Hu stDataIQs.zip(stAddrIQs).zipWithIndex.foreach { case ((stdIQ, staIQ), i) => 346730cfbc0SXuan Hu stdIQ.io.flush <> io.fromCtrlBlock.flush 347730cfbc0SXuan Hu 348730cfbc0SXuan Hu stdIQ.io.enq.zip(staIQ.io.enq).foreach { case (stdIQEnq, staIQEnq) => 349730cfbc0SXuan Hu stdIQEnq.bits := staIQEnq.bits 350730cfbc0SXuan Hu // Store data reuses store addr src(1) in dispatch2iq 351730cfbc0SXuan Hu // [dispatch2iq] --src*------src*(0)--> [staIQ] 352730cfbc0SXuan Hu // \ 353730cfbc0SXuan Hu // ---src*(1)--> [stdIQ] 354730cfbc0SXuan Hu // Since the src(1) of sta is easier to get, stdIQEnq.bits.src*(0) is assigned to staIQEnq.bits.src*(1) 355730cfbc0SXuan Hu // instead of dispatch2Iq.io.out(x).bits.src*(1) 356730cfbc0SXuan Hu stdIQEnq.bits.srcState(0) := staIQEnq.bits.srcState(1) 357730cfbc0SXuan Hu stdIQEnq.bits.srcType(0) := staIQEnq.bits.srcType(1) 358730cfbc0SXuan Hu stdIQEnq.bits.psrc(0) := staIQEnq.bits.psrc(1) 359730cfbc0SXuan Hu stdIQEnq.bits.sqIdx := staIQEnq.bits.sqIdx 360730cfbc0SXuan Hu } 361bf35baadSXuan Hu stdIQ.io.wakeupFromWB := wakeupFromWBVec 362730cfbc0SXuan Hu } 363730cfbc0SXuan Hu 364730cfbc0SXuan Hu val lsqEnqCtrl = Module(new LsqEnqCtrl) 365730cfbc0SXuan Hu 366730cfbc0SXuan Hu lsqEnqCtrl.io.redirect <> io.fromCtrlBlock.flush 367730cfbc0SXuan Hu lsqEnqCtrl.io.enq <> dispatch2Iq.io.enqLsqIO.get 368730cfbc0SXuan Hu lsqEnqCtrl.io.lcommit := io.fromMem.get.lcommit 369730cfbc0SXuan Hu lsqEnqCtrl.io.scommit := io.fromMem.get.scommit 370730cfbc0SXuan Hu lsqEnqCtrl.io.lqCancelCnt := io.fromMem.get.lqCancelCnt 371730cfbc0SXuan Hu lsqEnqCtrl.io.sqCancelCnt := io.fromMem.get.sqCancelCnt 372730cfbc0SXuan Hu io.memIO.get.lsqEnqIO <> lsqEnqCtrl.io.enqLsq 373730cfbc0SXuan Hu} 374