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._ 939c59369SXuan Huimport xiangshan.backend.datapath.DataConfig.{IntData, VAddrData, VecData} 1039c59369SXuan Huimport xiangshan.backend.datapath.WbConfig.{IntWB, VfWB} 11730cfbc0SXuan Huimport xiangshan.backend.regfile.RfWritePortWithConfig 12730cfbc0SXuan Huimport xiangshan.backend.rename.BusyTable 13730cfbc0SXuan Huimport xiangshan.mem.{LsqEnqCtrl, LsqEnqIO, MemWaitUpdateReq, SqPtr} 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 { 2339c59369SXuan Hu val numIntStateWrite = backendParams.numPregWb(IntData()) 2439c59369SXuan Hu val numVfStateWrite = backendParams.numPregWb(VecData()) 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 37*7f8233d5SHaojin Tangclass SchedulerIO()(implicit params: SchdBlockParams, p: Parameters) extends XSBundle { 3868d13085SXuan Hu // params alias 39*7f8233d5SHaojin Tang 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 } 5839c59369SXuan Hu val intWriteBack = MixedVec(Vec(backendParams.numPregWb(IntData()), 59730cfbc0SXuan Hu new RfWritePortWithConfig(backendParams.intPregParams.dataCfg, backendParams.intPregParams.addrWidth))) 6039c59369SXuan Hu val vfWriteBack = MixedVec(Vec(backendParams.numPregWb(VecData()), 61730cfbc0SXuan Hu new RfWritePortWithConfig(backendParams.vfPregParams.dataCfg, backendParams.vfPregParams.addrWidth))) 6210fe9778SXuan Hu val toDataPath: MixedVec[MixedVec[DecoupledIO[IssueQueueIssueBundle]]] = MixedVec(params.issueBlockParams.map(_.genIssueDecoupledBundle)) 6359ef6009Sxiaofeibao-xjtu val toDataPathAfterDelay: MixedVec[MixedVec[DecoupledIO[IssueQueueIssueBundle]]] = MixedVec(params.issueBlockParams.map(_.genIssueDecoupledBundle)) 6459ef6009Sxiaofeibao-xjtu val fromCancelNetwork = Flipped(MixedVec(params.issueBlockParams.map(_.genIssueDecoupledBundle))) 65730cfbc0SXuan Hu 66bf35baadSXuan Hu val fromSchedulers = new Bundle { 67c0be7f33SXuan Hu val wakeupVec: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpInValidBundle) 68bf35baadSXuan Hu } 69bf35baadSXuan Hu 70bf35baadSXuan Hu val toSchedulers = new Bundle { 71c0be7f33SXuan Hu val wakeupVec: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = params.genIQWakeUpOutValidBundle 72bf35baadSXuan Hu } 73bf35baadSXuan Hu 74c0be7f33SXuan Hu val fromDataPath = new Bundle { 7510fe9778SXuan Hu val resp: MixedVec[MixedVec[OGRespBundle]] = MixedVec(params.issueBlockParams.map(x => Flipped(x.genOGRespBundle))) 76ea46c302SXuan Hu val og0Cancel = Input(ExuVec(backendParams.numExu)) 77ea46c302SXuan Hu // Todo: remove this after no cancel signal from og1 78ea46c302SXuan Hu val og1Cancel = Input(ExuVec(backendParams.numExu)) 79c0be7f33SXuan Hu // just be compatible to old code 80c0be7f33SXuan Hu def apply(i: Int)(j: Int) = resp(i)(j) 81c0be7f33SXuan Hu } 82c0be7f33SXuan Hu 83c0be7f33SXuan Hu 84730cfbc0SXuan Hu val memIO = if (params.isMemSchd) Some(new Bundle { 85730cfbc0SXuan Hu val lsqEnqIO = Flipped(new LsqEnqIO) 86730cfbc0SXuan Hu }) else None 87730cfbc0SXuan Hu val fromMem = if (params.isMemSchd) Some(new Bundle { 887b753bebSXuan Hu val ldaFeedback = Flipped(Vec(params.LduCnt, new MemRSFeedbackIO)) 897b753bebSXuan Hu val staFeedback = Flipped(Vec(params.StaCnt, new MemRSFeedbackIO)) 90730cfbc0SXuan Hu val stIssuePtr = Input(new SqPtr()) 91730cfbc0SXuan Hu val lcommit = Input(UInt(log2Up(CommitWidth + 1).W)) 92730cfbc0SXuan Hu val scommit = Input(UInt(log2Ceil(EnsbufferWidth + 1).W)) // connected to `memBlock.io.sqDeq` instead of ROB 93730cfbc0SXuan Hu // from lsq 94730cfbc0SXuan Hu val lqCancelCnt = Input(UInt(log2Up(LoadQueueSize + 1).W)) 95730cfbc0SXuan Hu val sqCancelCnt = Input(UInt(log2Up(StoreQueueSize + 1).W)) 96730cfbc0SXuan Hu val memWaitUpdateReq = Flipped(new MemWaitUpdateReq) 97730cfbc0SXuan Hu }) else None 98730cfbc0SXuan Hu val toMem = if (params.isMemSchd) Some(new Bundle { 99730cfbc0SXuan Hu val loadFastMatch = Output(Vec(params.LduCnt, new IssueQueueLoadBundle)) 100730cfbc0SXuan Hu }) else None 101730cfbc0SXuan Hu} 102730cfbc0SXuan Hu 103730cfbc0SXuan Huabstract class SchedulerImpBase(wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters) 104730cfbc0SXuan Hu extends LazyModuleImp(wrapper) 105730cfbc0SXuan Hu with HasXSParameter 106730cfbc0SXuan Hu{ 107730cfbc0SXuan Hu val io = IO(new SchedulerIO()) 108730cfbc0SXuan Hu 109730cfbc0SXuan Hu // alias 110c0be7f33SXuan Hu private val iqWakeUpInMap: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] = 111c0be7f33SXuan Hu io.fromSchedulers.wakeupVec.map(x => (x.bits.exuIdx, x)).toMap 112730cfbc0SXuan Hu private val schdType = params.schdType 113730cfbc0SXuan Hu 114730cfbc0SXuan Hu // Modules 115730cfbc0SXuan Hu val dispatch2Iq: Dispatch2IqImp = wrapper.dispatch2Iq.module 116730cfbc0SXuan Hu val issueQueues: Seq[IssueQueueImp] = wrapper.issueQueue.map(_.module) 117730cfbc0SXuan Hu 118730cfbc0SXuan Hu // BusyTable Modules 119730cfbc0SXuan Hu val intBusyTable = schdType match { 12039c59369SXuan Hu case IntScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numIntStateRead, wrapper.numIntStateWrite, IntPhyRegs))) 121730cfbc0SXuan Hu case _ => None 122730cfbc0SXuan Hu } 123730cfbc0SXuan Hu 124730cfbc0SXuan Hu val vfBusyTable = schdType match { 12539c59369SXuan Hu case VfScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numVfStateRead, wrapper.numVfStateWrite, VfPhyRegs))) 126730cfbc0SXuan Hu case _ => None 127730cfbc0SXuan Hu } 128730cfbc0SXuan Hu 129730cfbc0SXuan Hu dispatch2Iq.io match { case dp2iq => 130730cfbc0SXuan Hu dp2iq.redirect <> io.fromCtrlBlock.flush 131730cfbc0SXuan Hu dp2iq.in <> io.fromDispatch.uops 132730cfbc0SXuan Hu dp2iq.readIntState.foreach(_ <> intBusyTable.get.io.read) 133730cfbc0SXuan Hu dp2iq.readVfState.foreach(_ <> vfBusyTable.get.io.read) 134730cfbc0SXuan Hu } 135730cfbc0SXuan Hu 136730cfbc0SXuan Hu intBusyTable match { 137730cfbc0SXuan Hu case Some(bt) => 138730cfbc0SXuan Hu bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) => 139730cfbc0SXuan Hu btAllocPregs.valid := dpAllocPregs.isInt 140730cfbc0SXuan Hu btAllocPregs.bits := dpAllocPregs.preg 141730cfbc0SXuan Hu } 142730cfbc0SXuan Hu bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) => 143730cfbc0SXuan Hu wb.valid := io.intWriteBack(i).wen && io.intWriteBack(i).intWen 144730cfbc0SXuan Hu wb.bits := io.intWriteBack(i).addr 145730cfbc0SXuan Hu } 146730cfbc0SXuan Hu case None => 147730cfbc0SXuan Hu } 148730cfbc0SXuan Hu 149730cfbc0SXuan Hu vfBusyTable match { 150730cfbc0SXuan Hu case Some(bt) => 151730cfbc0SXuan Hu bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) => 152730cfbc0SXuan Hu btAllocPregs.valid := dpAllocPregs.isFp 153730cfbc0SXuan Hu btAllocPregs.bits := dpAllocPregs.preg 154730cfbc0SXuan Hu } 155730cfbc0SXuan Hu bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) => 156730cfbc0SXuan Hu wb.valid := io.vfWriteBack(i).wen && (io.vfWriteBack(i).fpWen || io.vfWriteBack(i).vecWen) 157730cfbc0SXuan Hu wb.bits := io.vfWriteBack(i).addr 158730cfbc0SXuan Hu } 159730cfbc0SXuan Hu case None => 160730cfbc0SXuan Hu } 161730cfbc0SXuan Hu 162c0be7f33SXuan Hu val wakeupFromWBVec = Wire(params.genWBWakeUpSinkValidBundle) 163730cfbc0SXuan Hu val writeback = params.schdType match { 164730cfbc0SXuan Hu case IntScheduler() => io.intWriteBack 165730cfbc0SXuan Hu case MemScheduler() => io.intWriteBack ++ io.vfWriteBack 166730cfbc0SXuan Hu case VfScheduler() => io.vfWriteBack 167730cfbc0SXuan Hu case _ => Seq() 168730cfbc0SXuan Hu } 169730cfbc0SXuan Hu wakeupFromWBVec.zip(writeback).foreach { case (sink, source) => 170730cfbc0SXuan Hu sink.valid := source.wen 171730cfbc0SXuan Hu sink.bits.rfWen := source.intWen 172730cfbc0SXuan Hu sink.bits.fpWen := source.fpWen 173730cfbc0SXuan Hu sink.bits.vecWen := source.vecWen 174730cfbc0SXuan Hu sink.bits.pdest := source.addr 175730cfbc0SXuan Hu } 176730cfbc0SXuan Hu 177bf35baadSXuan Hu // Connect bundles having the same wakeup source 17859ef6009Sxiaofeibao-xjtu issueQueues.zipWithIndex.foreach { case(iq, i) => 179bf35baadSXuan Hu iq.io.wakeupFromIQ.foreach { wakeUp => 180c0be7f33SXuan Hu wakeUp := iqWakeUpInMap(wakeUp.bits.exuIdx) 181bf35baadSXuan Hu } 182ea46c302SXuan Hu iq.io.og0Cancel := io.fromDataPath.og0Cancel 183ea46c302SXuan Hu iq.io.og1Cancel := io.fromDataPath.og1Cancel 18459ef6009Sxiaofeibao-xjtu iq.io.fromCancelNetwork <> io.fromCancelNetwork(i) 185bf35baadSXuan Hu } 186bf35baadSXuan Hu 187c0be7f33SXuan Hu private val iqWakeUpOutMap: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] = 188bf35baadSXuan Hu issueQueues.flatMap(_.io.wakeupToIQ) 189c0be7f33SXuan Hu .map(x => (x.bits.exuIdx, x)) 190bf35baadSXuan Hu .toMap 191bf35baadSXuan Hu 192bf35baadSXuan Hu // Connect bundles having the same wakeup source 193bf35baadSXuan Hu io.toSchedulers.wakeupVec.foreach { wakeUp => 194c0be7f33SXuan Hu wakeUp := iqWakeUpOutMap(wakeUp.bits.exuIdx) 195bf35baadSXuan Hu } 196bf35baadSXuan Hu 197730cfbc0SXuan Hu io.toDataPath.zipWithIndex.foreach { case (toDp, i) => 198730cfbc0SXuan Hu toDp <> issueQueues(i).io.deq 199730cfbc0SXuan Hu } 20059ef6009Sxiaofeibao-xjtu io.toDataPathAfterDelay.zipWithIndex.foreach { case (toDpDy, i) => 20159ef6009Sxiaofeibao-xjtu toDpDy <> issueQueues(i).io.deqDelay 20259ef6009Sxiaofeibao-xjtu } 203bf35baadSXuan Hu 204c0be7f33SXuan Hu println(s"[Scheduler] io.fromSchedulers.wakeupVec: ${io.fromSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}") 205bf35baadSXuan Hu println(s"[Scheduler] iqWakeUpInKeys: ${iqWakeUpInMap.keys}") 206bf35baadSXuan Hu 207bf35baadSXuan Hu println(s"[Scheduler] iqWakeUpOutKeys: ${iqWakeUpOutMap.keys}") 208c0be7f33SXuan Hu println(s"[Scheduler] io.toSchedulers.wakeupVec: ${io.toSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}") 209730cfbc0SXuan Hu} 210730cfbc0SXuan Hu 211730cfbc0SXuan Huclass SchedulerArithImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters) 212730cfbc0SXuan Hu extends SchedulerImpBase(wrapper) 213730cfbc0SXuan Hu with HasXSParameter 214730cfbc0SXuan Hu{ 2152e0a7dc5Sfdy// dontTouch(io.vfWbFuBusyTable) 216730cfbc0SXuan Hu println(s"[SchedulerArithImp] " + 217730cfbc0SXuan Hu s"has intBusyTable: ${intBusyTable.nonEmpty}, " + 218730cfbc0SXuan Hu s"has vfBusyTable: ${vfBusyTable.nonEmpty}") 219730cfbc0SXuan Hu 220730cfbc0SXuan Hu issueQueues.zipWithIndex.foreach { case (iq, i) => 221730cfbc0SXuan Hu iq.io.flush <> io.fromCtrlBlock.flush 222730cfbc0SXuan Hu iq.io.enq <> dispatch2Iq.io.out(i) 223bf35baadSXuan Hu iq.io.wakeupFromWB := wakeupFromWBVec 224730cfbc0SXuan Hu iq.io.deqResp.zipWithIndex.foreach { case (deqResp, j) => 225ea0f92d8Sczw deqResp.valid := iq.io.deq(j).valid && io.toDataPath(i)(j).ready 226ea0f92d8Sczw deqResp.bits.respType := RSFeedbackType.issueSuccess 2275db4956bSzhanglyGit deqResp.bits.robIdx := iq.io.deq(j).bits.common.robIdx 2288d29ec32Sczw deqResp.bits.rfWen := iq.io.deq(j).bits.common.rfWen.getOrElse(false.B) 2298d29ec32Sczw deqResp.bits.fuType := iq.io.deq(j).bits.common.fuType 2308d29ec32Sczw 231730cfbc0SXuan Hu } 232730cfbc0SXuan Hu iq.io.og0Resp.zipWithIndex.foreach { case (og0Resp, j) => 233730cfbc0SXuan Hu og0Resp.valid := io.fromDataPath(i)(j).og0resp.valid 234730cfbc0SXuan Hu og0Resp.bits.respType := io.fromDataPath(i)(j).og0resp.bits.respType 2355db4956bSzhanglyGit og0Resp.bits.robIdx := io.fromDataPath(i)(j).og0resp.bits.robIdx 2368d29ec32Sczw og0Resp.bits.rfWen := io.fromDataPath(i)(j).og0resp.bits.rfWen 2378d29ec32Sczw og0Resp.bits.fuType := io.fromDataPath(i)(j).og0resp.bits.fuType 2388d29ec32Sczw 239730cfbc0SXuan Hu } 240730cfbc0SXuan Hu iq.io.og1Resp.zipWithIndex.foreach { case (og1Resp, j) => 241730cfbc0SXuan Hu og1Resp.valid := io.fromDataPath(i)(j).og1resp.valid 242730cfbc0SXuan Hu og1Resp.bits.respType := io.fromDataPath(i)(j).og1resp.bits.respType 2435db4956bSzhanglyGit og1Resp.bits.robIdx := io.fromDataPath(i)(j).og1resp.bits.robIdx 2448d29ec32Sczw og1Resp.bits.rfWen := io.fromDataPath(i)(j).og1resp.bits.rfWen 2458d29ec32Sczw og1Resp.bits.fuType := io.fromDataPath(i)(j).og1resp.bits.fuType 2468d29ec32Sczw 247730cfbc0SXuan Hu } 2482e0a7dc5Sfdy 2492e0a7dc5Sfdy iq.io.wbBusyTableRead := io.fromWbFuBusyTable.fuBusyTableRead(i) 250dd970561SzhanglyGit io.wbFuBusyTable(i) := iq.io.wbBusyTableWrite 251730cfbc0SXuan Hu } 252730cfbc0SXuan Hu 253730cfbc0SXuan Hu val iqJumpBundleVec: Seq[IssueQueueJumpBundle] = issueQueues.map { 254730cfbc0SXuan Hu case imp: IssueQueueIntImp => imp.io.enqJmp 255730cfbc0SXuan Hu case _ => None 256730cfbc0SXuan Hu }.filter(_.nonEmpty).flatMap(_.get) 257730cfbc0SXuan Hu println(s"[Scheduler] iqJumpBundleVec: ${iqJumpBundleVec}") 258730cfbc0SXuan Hu 259730cfbc0SXuan Hu iqJumpBundleVec.zip(io.fromCtrlBlock.pcVec zip io.fromCtrlBlock.targetVec).foreach { case (iqJmp, (pc, target)) => 260730cfbc0SXuan Hu iqJmp.pc := pc 261730cfbc0SXuan Hu iqJmp.target := target 262730cfbc0SXuan Hu } 263730cfbc0SXuan Hu} 264730cfbc0SXuan Hu 265730cfbc0SXuan Huclass SchedulerMemImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters) 266730cfbc0SXuan Hu extends SchedulerImpBase(wrapper) 267730cfbc0SXuan Hu with HasXSParameter 268730cfbc0SXuan Hu{ 269730cfbc0SXuan Hu println(s"[SchedulerMemImp] " + 270730cfbc0SXuan Hu s"has intBusyTable: ${intBusyTable.nonEmpty}, " + 271730cfbc0SXuan Hu s"has vfBusyTable: ${vfBusyTable.nonEmpty}") 272730cfbc0SXuan Hu 273730cfbc0SXuan Hu val memAddrIQs = issueQueues.filter(iq => iq.params.StdCnt == 0) 274730cfbc0SXuan Hu val stAddrIQs = issueQueues.filter(iq => iq.params.StaCnt > 0) // included in memAddrIQs 2757b753bebSXuan Hu val ldAddrIQs = issueQueues.filter(iq => iq.params.LduCnt > 0) 276730cfbc0SXuan Hu val stDataIQs = issueQueues.filter(iq => iq.params.StdCnt > 0) 277730cfbc0SXuan Hu require(memAddrIQs.nonEmpty && stDataIQs.nonEmpty) 278730cfbc0SXuan Hu 279730cfbc0SXuan Hu issueQueues.zipWithIndex.foreach { case (iq, i) => 280730cfbc0SXuan Hu iq.io.deqResp.zipWithIndex.foreach { case (deqResp, j) => 281ea0f92d8Sczw deqResp.valid := iq.io.deq(j).valid && io.toDataPath(i)(j).ready 282ea0f92d8Sczw deqResp.bits.respType := RSFeedbackType.issueSuccess 2835db4956bSzhanglyGit deqResp.bits.robIdx := iq.io.deq(j).bits.common.robIdx 2848d29ec32Sczw deqResp.bits.rfWen := iq.io.deq(j).bits.common.rfWen.getOrElse(false.B) 2858d29ec32Sczw deqResp.bits.fuType := iq.io.deq(j).bits.common.fuType 2868d29ec32Sczw 287730cfbc0SXuan Hu } 288730cfbc0SXuan Hu iq.io.og0Resp.zipWithIndex.foreach { case (og0Resp, j) => 289730cfbc0SXuan Hu og0Resp.valid := io.fromDataPath(i)(j).og0resp.valid 290730cfbc0SXuan Hu og0Resp.bits.respType := io.fromDataPath(i)(j).og0resp.bits.respType 2915db4956bSzhanglyGit og0Resp.bits.robIdx := io.fromDataPath(i)(j).og0resp.bits.robIdx 2928d29ec32Sczw og0Resp.bits.rfWen := io.fromDataPath(i)(j).og0resp.bits.rfWen 2938d29ec32Sczw og0Resp.bits.fuType := io.fromDataPath(i)(j).og0resp.bits.fuType 2948d29ec32Sczw 295730cfbc0SXuan Hu } 296730cfbc0SXuan Hu iq.io.og1Resp.zipWithIndex.foreach { case (og1Resp, j) => 297730cfbc0SXuan Hu og1Resp.valid := io.fromDataPath(i)(j).og1resp.valid 298730cfbc0SXuan Hu og1Resp.bits.respType := io.fromDataPath(i)(j).og1resp.bits.respType 2995db4956bSzhanglyGit og1Resp.bits.robIdx := io.fromDataPath(i)(j).og1resp.bits.robIdx 3008d29ec32Sczw og1Resp.bits.rfWen := io.fromDataPath(i)(j).og1resp.bits.rfWen 3018d29ec32Sczw og1Resp.bits.fuType := io.fromDataPath(i)(j).og1resp.bits.fuType 3028d29ec32Sczw 303730cfbc0SXuan Hu } 3042e0a7dc5Sfdy iq.io.wbBusyTableRead := io.fromWbFuBusyTable.fuBusyTableRead(i) 305dd970561SzhanglyGit io.wbFuBusyTable(i) := iq.io.wbBusyTableWrite 306730cfbc0SXuan Hu } 307730cfbc0SXuan Hu 308730cfbc0SXuan Hu memAddrIQs.zipWithIndex.foreach { case (iq, i) => 309730cfbc0SXuan Hu iq.io.flush <> io.fromCtrlBlock.flush 310730cfbc0SXuan Hu iq.io.enq <> dispatch2Iq.io.out(i) 311bf35baadSXuan Hu iq.io.wakeupFromWB := wakeupFromWBVec 312730cfbc0SXuan Hu } 313730cfbc0SXuan Hu 3147b753bebSXuan Hu ldAddrIQs.foreach { 315de784418SXuan Hu case imp: IssueQueueMemAddrImp => 316de784418SXuan Hu imp.io.memIO.get.feedbackIO <> io.fromMem.get.ldaFeedback 317de784418SXuan Hu imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 3187b753bebSXuan Hu case _ => 3197b753bebSXuan Hu } 3207b753bebSXuan Hu 3217b753bebSXuan Hu stAddrIQs.foreach { 3227b753bebSXuan Hu case imp: IssueQueueMemAddrImp => imp.io.memIO.get.feedbackIO <> io.fromMem.get.staFeedback 3237b753bebSXuan Hu case _ => 3247b753bebSXuan Hu } 325730cfbc0SXuan Hu 3269b258a00Sxgkiri private val staIdxSeq = issueQueues.filter(iq => iq.params.StaCnt > 0).map(iq => iq.params.idxInSchBlk) 3279b258a00Sxgkiri 3289b258a00Sxgkiri for ((idxInSchBlk, i) <- staIdxSeq.zipWithIndex) { 3299b258a00Sxgkiri dispatch2Iq.io.out(idxInSchBlk).zip(stAddrIQs(i).io.enq).zip(stDataIQs(i).io.enq).foreach{ case((di, staIQ), stdIQ) => 330730cfbc0SXuan Hu val isAllReady = staIQ.ready && stdIQ.ready 331730cfbc0SXuan Hu di.ready := isAllReady 332730cfbc0SXuan Hu staIQ.valid := di.valid && isAllReady 333730cfbc0SXuan Hu stdIQ.valid := di.valid && isAllReady 334730cfbc0SXuan Hu } 3359b258a00Sxgkiri } 336730cfbc0SXuan Hu 337730cfbc0SXuan Hu require(stAddrIQs.size == stDataIQs.size, s"number of store address IQs(${stAddrIQs.size}) " + 338730cfbc0SXuan Hu s"should be equal to number of data IQs(${stDataIQs})") 339730cfbc0SXuan Hu stDataIQs.zip(stAddrIQs).zipWithIndex.foreach { case ((stdIQ, staIQ), i) => 340730cfbc0SXuan Hu stdIQ.io.flush <> io.fromCtrlBlock.flush 341730cfbc0SXuan Hu 342730cfbc0SXuan Hu stdIQ.io.enq.zip(staIQ.io.enq).foreach { case (stdIQEnq, staIQEnq) => 343730cfbc0SXuan Hu stdIQEnq.bits := staIQEnq.bits 344730cfbc0SXuan Hu // Store data reuses store addr src(1) in dispatch2iq 345730cfbc0SXuan Hu // [dispatch2iq] --src*------src*(0)--> [staIQ] 346730cfbc0SXuan Hu // \ 347730cfbc0SXuan Hu // ---src*(1)--> [stdIQ] 348730cfbc0SXuan Hu // Since the src(1) of sta is easier to get, stdIQEnq.bits.src*(0) is assigned to staIQEnq.bits.src*(1) 349730cfbc0SXuan Hu // instead of dispatch2Iq.io.out(x).bits.src*(1) 350730cfbc0SXuan Hu stdIQEnq.bits.srcState(0) := staIQEnq.bits.srcState(1) 351730cfbc0SXuan Hu stdIQEnq.bits.srcType(0) := staIQEnq.bits.srcType(1) 352730cfbc0SXuan Hu stdIQEnq.bits.psrc(0) := staIQEnq.bits.psrc(1) 353730cfbc0SXuan Hu stdIQEnq.bits.sqIdx := staIQEnq.bits.sqIdx 354730cfbc0SXuan Hu } 355bf35baadSXuan Hu stdIQ.io.wakeupFromWB := wakeupFromWBVec 356730cfbc0SXuan Hu } 357730cfbc0SXuan Hu 358730cfbc0SXuan Hu val lsqEnqCtrl = Module(new LsqEnqCtrl) 359730cfbc0SXuan Hu 360730cfbc0SXuan Hu lsqEnqCtrl.io.redirect <> io.fromCtrlBlock.flush 361730cfbc0SXuan Hu lsqEnqCtrl.io.enq <> dispatch2Iq.io.enqLsqIO.get 362730cfbc0SXuan Hu lsqEnqCtrl.io.lcommit := io.fromMem.get.lcommit 363730cfbc0SXuan Hu lsqEnqCtrl.io.scommit := io.fromMem.get.scommit 364730cfbc0SXuan Hu lsqEnqCtrl.io.lqCancelCnt := io.fromMem.get.lqCancelCnt 365730cfbc0SXuan Hu lsqEnqCtrl.io.sqCancelCnt := io.fromMem.get.sqCancelCnt 366730cfbc0SXuan Hu io.memIO.get.lsqEnqIO <> lsqEnqCtrl.io.enqLsq 367730cfbc0SXuan Hu} 368