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._ 9*39c59369SXuan Huimport xiangshan.backend.datapath.DataConfig.{IntData, VAddrData, VecData} 10*39c59369SXuan 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 { 23*39c59369SXuan Hu val numIntStateWrite = backendParams.numPregWb(IntData()) 24*39c59369SXuan 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 37ea46c302SXuan Huclass SchedulerIO()(implicit params: SchdBlockParams, p: Parameters) extends Bundle { 3868d13085SXuan Hu // params alias 39ea46c302SXuan Hu private val backendParams = params.backendParam 40ea46c302SXuan Hu private val LoadQueueSize = p(XSCoreParamsKey).VirtualLoadQueueSize 41ea46c302SXuan Hu private val RenameWidth = p(XSCoreParamsKey).RenameWidth 42ea46c302SXuan Hu private val CommitWidth = p(XSCoreParamsKey).CommitWidth 43ea46c302SXuan Hu private val EnsbufferWidth = p(XSCoreParamsKey).EnsbufferWidth 44ea46c302SXuan Hu private val StoreQueueSize = p(XSCoreParamsKey).StoreQueueSize 4568d13085SXuan Hu 46730cfbc0SXuan Hu val fromTop = new Bundle { 47730cfbc0SXuan Hu val hartId = Input(UInt(8.W)) 48730cfbc0SXuan Hu } 492e0a7dc5Sfdy val fromWbFuBusyTable = new Bundle{ 502e0a7dc5Sfdy val fuBusyTableRead = MixedVec(params.issueBlockParams.map(x => Input(x.genWbFuBusyTableReadBundle))) 512e0a7dc5Sfdy } 52dd970561SzhanglyGit val wbFuBusyTable = MixedVec(params.issueBlockParams.map(x => Output(x.genWbFuBusyTableWriteBundle))) 53dd970561SzhanglyGit 54730cfbc0SXuan Hu val fromCtrlBlock = new Bundle { 55730cfbc0SXuan Hu val pcVec = Input(Vec(params.numPcReadPort, UInt(VAddrData().dataWidth.W))) 56730cfbc0SXuan Hu val targetVec = Input(Vec(params.numPcReadPort, UInt(VAddrData().dataWidth.W))) 57730cfbc0SXuan Hu val flush = Flipped(ValidIO(new Redirect)) 58730cfbc0SXuan Hu } 59730cfbc0SXuan Hu val fromDispatch = new Bundle { 60730cfbc0SXuan Hu val allocPregs = Vec(RenameWidth, Input(new ResetPregStateReq)) 61730cfbc0SXuan Hu val uops = Vec(params.numUopIn, Flipped(DecoupledIO(new DynInst))) 62730cfbc0SXuan Hu } 63*39c59369SXuan Hu val intWriteBack = MixedVec(Vec(backendParams.numPregWb(IntData()), 64730cfbc0SXuan Hu new RfWritePortWithConfig(backendParams.intPregParams.dataCfg, backendParams.intPregParams.addrWidth))) 65*39c59369SXuan Hu val vfWriteBack = MixedVec(Vec(backendParams.numPregWb(VecData()), 66730cfbc0SXuan Hu new RfWritePortWithConfig(backendParams.vfPregParams.dataCfg, backendParams.vfPregParams.addrWidth))) 6710fe9778SXuan Hu val toDataPath: MixedVec[MixedVec[DecoupledIO[IssueQueueIssueBundle]]] = MixedVec(params.issueBlockParams.map(_.genIssueDecoupledBundle)) 6859ef6009Sxiaofeibao-xjtu val toDataPathAfterDelay: MixedVec[MixedVec[DecoupledIO[IssueQueueIssueBundle]]] = MixedVec(params.issueBlockParams.map(_.genIssueDecoupledBundle)) 6959ef6009Sxiaofeibao-xjtu val fromCancelNetwork = Flipped(MixedVec(params.issueBlockParams.map(_.genIssueDecoupledBundle))) 70730cfbc0SXuan Hu 71bf35baadSXuan Hu val fromSchedulers = new Bundle { 72c0be7f33SXuan Hu val wakeupVec: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpInValidBundle) 73bf35baadSXuan Hu } 74bf35baadSXuan Hu 75bf35baadSXuan Hu val toSchedulers = new Bundle { 76c0be7f33SXuan Hu val wakeupVec: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = params.genIQWakeUpOutValidBundle 77bf35baadSXuan Hu } 78bf35baadSXuan Hu 79c0be7f33SXuan Hu val fromDataPath = new Bundle { 8010fe9778SXuan Hu val resp: MixedVec[MixedVec[OGRespBundle]] = MixedVec(params.issueBlockParams.map(x => Flipped(x.genOGRespBundle))) 81ea46c302SXuan Hu val og0Cancel = Input(ExuVec(backendParams.numExu)) 82ea46c302SXuan Hu // Todo: remove this after no cancel signal from og1 83ea46c302SXuan Hu val og1Cancel = Input(ExuVec(backendParams.numExu)) 84c0be7f33SXuan Hu // just be compatible to old code 85c0be7f33SXuan Hu def apply(i: Int)(j: Int) = resp(i)(j) 86c0be7f33SXuan Hu } 87c0be7f33SXuan Hu 88c0be7f33SXuan Hu 89730cfbc0SXuan Hu val memIO = if (params.isMemSchd) Some(new Bundle { 90730cfbc0SXuan Hu val lsqEnqIO = Flipped(new LsqEnqIO) 91730cfbc0SXuan Hu }) else None 92730cfbc0SXuan Hu val fromMem = if (params.isMemSchd) Some(new Bundle { 937b753bebSXuan Hu val ldaFeedback = Flipped(Vec(params.LduCnt, new MemRSFeedbackIO)) 947b753bebSXuan Hu val staFeedback = Flipped(Vec(params.StaCnt, new MemRSFeedbackIO)) 95730cfbc0SXuan Hu val stIssuePtr = Input(new SqPtr()) 96730cfbc0SXuan Hu val lcommit = Input(UInt(log2Up(CommitWidth + 1).W)) 97730cfbc0SXuan Hu val scommit = Input(UInt(log2Ceil(EnsbufferWidth + 1).W)) // connected to `memBlock.io.sqDeq` instead of ROB 98730cfbc0SXuan Hu // from lsq 99730cfbc0SXuan Hu val lqCancelCnt = Input(UInt(log2Up(LoadQueueSize + 1).W)) 100730cfbc0SXuan Hu val sqCancelCnt = Input(UInt(log2Up(StoreQueueSize + 1).W)) 101730cfbc0SXuan Hu val memWaitUpdateReq = Flipped(new MemWaitUpdateReq) 102730cfbc0SXuan Hu }) else None 103730cfbc0SXuan Hu val toMem = if (params.isMemSchd) Some(new Bundle { 104730cfbc0SXuan Hu val loadFastMatch = Output(Vec(params.LduCnt, new IssueQueueLoadBundle)) 105730cfbc0SXuan Hu }) else None 106730cfbc0SXuan Hu} 107730cfbc0SXuan Hu 108730cfbc0SXuan Huabstract class SchedulerImpBase(wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters) 109730cfbc0SXuan Hu extends LazyModuleImp(wrapper) 110730cfbc0SXuan Hu with HasXSParameter 111730cfbc0SXuan Hu{ 112730cfbc0SXuan Hu val io = IO(new SchedulerIO()) 113730cfbc0SXuan Hu 114730cfbc0SXuan Hu // alias 115c0be7f33SXuan Hu private val iqWakeUpInMap: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] = 116c0be7f33SXuan Hu io.fromSchedulers.wakeupVec.map(x => (x.bits.exuIdx, x)).toMap 117730cfbc0SXuan Hu private val schdType = params.schdType 118730cfbc0SXuan Hu 119730cfbc0SXuan Hu // Modules 120730cfbc0SXuan Hu val dispatch2Iq: Dispatch2IqImp = wrapper.dispatch2Iq.module 121730cfbc0SXuan Hu val issueQueues: Seq[IssueQueueImp] = wrapper.issueQueue.map(_.module) 122730cfbc0SXuan Hu 123730cfbc0SXuan Hu // BusyTable Modules 124730cfbc0SXuan Hu val intBusyTable = schdType match { 125*39c59369SXuan Hu case IntScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numIntStateRead, wrapper.numIntStateWrite, IntPhyRegs))) 126730cfbc0SXuan Hu case _ => None 127730cfbc0SXuan Hu } 128730cfbc0SXuan Hu 129730cfbc0SXuan Hu val vfBusyTable = schdType match { 130*39c59369SXuan Hu case VfScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numVfStateRead, wrapper.numVfStateWrite, VfPhyRegs))) 131730cfbc0SXuan Hu case _ => None 132730cfbc0SXuan Hu } 133730cfbc0SXuan Hu 134730cfbc0SXuan Hu dispatch2Iq.io match { case dp2iq => 135730cfbc0SXuan Hu dp2iq.redirect <> io.fromCtrlBlock.flush 136730cfbc0SXuan Hu dp2iq.in <> io.fromDispatch.uops 137730cfbc0SXuan Hu dp2iq.readIntState.foreach(_ <> intBusyTable.get.io.read) 138730cfbc0SXuan Hu dp2iq.readVfState.foreach(_ <> vfBusyTable.get.io.read) 139730cfbc0SXuan Hu } 140730cfbc0SXuan Hu 141730cfbc0SXuan Hu intBusyTable match { 142730cfbc0SXuan Hu case Some(bt) => 143730cfbc0SXuan Hu bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) => 144730cfbc0SXuan Hu btAllocPregs.valid := dpAllocPregs.isInt 145730cfbc0SXuan Hu btAllocPregs.bits := dpAllocPregs.preg 146730cfbc0SXuan Hu } 147730cfbc0SXuan Hu bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) => 148730cfbc0SXuan Hu wb.valid := io.intWriteBack(i).wen && io.intWriteBack(i).intWen 149730cfbc0SXuan Hu wb.bits := io.intWriteBack(i).addr 150730cfbc0SXuan Hu } 151730cfbc0SXuan Hu case None => 152730cfbc0SXuan Hu } 153730cfbc0SXuan Hu 154730cfbc0SXuan Hu vfBusyTable match { 155730cfbc0SXuan Hu case Some(bt) => 156730cfbc0SXuan Hu bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) => 157730cfbc0SXuan Hu btAllocPregs.valid := dpAllocPregs.isFp 158730cfbc0SXuan Hu btAllocPregs.bits := dpAllocPregs.preg 159730cfbc0SXuan Hu } 160730cfbc0SXuan Hu bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) => 161730cfbc0SXuan Hu wb.valid := io.vfWriteBack(i).wen && (io.vfWriteBack(i).fpWen || io.vfWriteBack(i).vecWen) 162730cfbc0SXuan Hu wb.bits := io.vfWriteBack(i).addr 163730cfbc0SXuan Hu } 164730cfbc0SXuan Hu case None => 165730cfbc0SXuan Hu } 166730cfbc0SXuan Hu 167c0be7f33SXuan Hu val wakeupFromWBVec = Wire(params.genWBWakeUpSinkValidBundle) 168730cfbc0SXuan Hu val writeback = params.schdType match { 169730cfbc0SXuan Hu case IntScheduler() => io.intWriteBack 170730cfbc0SXuan Hu case MemScheduler() => io.intWriteBack ++ io.vfWriteBack 171730cfbc0SXuan Hu case VfScheduler() => io.vfWriteBack 172730cfbc0SXuan Hu case _ => Seq() 173730cfbc0SXuan Hu } 174730cfbc0SXuan Hu wakeupFromWBVec.zip(writeback).foreach { case (sink, source) => 175730cfbc0SXuan Hu sink.valid := source.wen 176730cfbc0SXuan Hu sink.bits.rfWen := source.intWen 177730cfbc0SXuan Hu sink.bits.fpWen := source.fpWen 178730cfbc0SXuan Hu sink.bits.vecWen := source.vecWen 179730cfbc0SXuan Hu sink.bits.pdest := source.addr 180730cfbc0SXuan Hu } 181730cfbc0SXuan Hu 182bf35baadSXuan Hu // Connect bundles having the same wakeup source 18359ef6009Sxiaofeibao-xjtu issueQueues.zipWithIndex.foreach { case(iq, i) => 184bf35baadSXuan Hu iq.io.wakeupFromIQ.foreach { wakeUp => 185c0be7f33SXuan Hu wakeUp := iqWakeUpInMap(wakeUp.bits.exuIdx) 186bf35baadSXuan Hu } 187ea46c302SXuan Hu iq.io.og0Cancel := io.fromDataPath.og0Cancel 188ea46c302SXuan Hu iq.io.og1Cancel := io.fromDataPath.og1Cancel 18959ef6009Sxiaofeibao-xjtu iq.io.fromCancelNetwork <> io.fromCancelNetwork(i) 190bf35baadSXuan Hu } 191bf35baadSXuan Hu 192c0be7f33SXuan Hu private val iqWakeUpOutMap: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] = 193bf35baadSXuan Hu issueQueues.flatMap(_.io.wakeupToIQ) 194c0be7f33SXuan Hu .map(x => (x.bits.exuIdx, x)) 195bf35baadSXuan Hu .toMap 196bf35baadSXuan Hu 197bf35baadSXuan Hu // Connect bundles having the same wakeup source 198bf35baadSXuan Hu io.toSchedulers.wakeupVec.foreach { wakeUp => 199c0be7f33SXuan Hu wakeUp := iqWakeUpOutMap(wakeUp.bits.exuIdx) 200bf35baadSXuan Hu } 201bf35baadSXuan Hu 202730cfbc0SXuan Hu io.toDataPath.zipWithIndex.foreach { case (toDp, i) => 203730cfbc0SXuan Hu toDp <> issueQueues(i).io.deq 204730cfbc0SXuan Hu } 20559ef6009Sxiaofeibao-xjtu io.toDataPathAfterDelay.zipWithIndex.foreach { case (toDpDy, i) => 20659ef6009Sxiaofeibao-xjtu toDpDy <> issueQueues(i).io.deqDelay 20759ef6009Sxiaofeibao-xjtu } 208bf35baadSXuan Hu 209c0be7f33SXuan Hu println(s"[Scheduler] io.fromSchedulers.wakeupVec: ${io.fromSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}") 210bf35baadSXuan Hu println(s"[Scheduler] iqWakeUpInKeys: ${iqWakeUpInMap.keys}") 211bf35baadSXuan Hu 212bf35baadSXuan Hu println(s"[Scheduler] iqWakeUpOutKeys: ${iqWakeUpOutMap.keys}") 213c0be7f33SXuan Hu println(s"[Scheduler] io.toSchedulers.wakeupVec: ${io.toSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}") 214730cfbc0SXuan Hu} 215730cfbc0SXuan Hu 216730cfbc0SXuan Huclass SchedulerArithImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters) 217730cfbc0SXuan Hu extends SchedulerImpBase(wrapper) 218730cfbc0SXuan Hu with HasXSParameter 219730cfbc0SXuan Hu{ 2202e0a7dc5Sfdy// dontTouch(io.vfWbFuBusyTable) 221730cfbc0SXuan Hu println(s"[SchedulerArithImp] " + 222730cfbc0SXuan Hu s"has intBusyTable: ${intBusyTable.nonEmpty}, " + 223730cfbc0SXuan Hu s"has vfBusyTable: ${vfBusyTable.nonEmpty}") 224730cfbc0SXuan Hu 225730cfbc0SXuan Hu issueQueues.zipWithIndex.foreach { case (iq, i) => 226730cfbc0SXuan Hu iq.io.flush <> io.fromCtrlBlock.flush 227730cfbc0SXuan Hu iq.io.enq <> dispatch2Iq.io.out(i) 228bf35baadSXuan Hu iq.io.wakeupFromWB := wakeupFromWBVec 229730cfbc0SXuan Hu iq.io.deqResp.zipWithIndex.foreach { case (deqResp, j) => 230ea0f92d8Sczw deqResp.valid := iq.io.deq(j).valid && io.toDataPath(i)(j).ready 231ea0f92d8Sczw deqResp.bits.respType := RSFeedbackType.issueSuccess 232730cfbc0SXuan Hu deqResp.bits.addrOH := iq.io.deq(j).bits.addrOH 2338d29ec32Sczw deqResp.bits.rfWen := iq.io.deq(j).bits.common.rfWen.getOrElse(false.B) 2348d29ec32Sczw deqResp.bits.fuType := iq.io.deq(j).bits.common.fuType 2358d29ec32Sczw 236730cfbc0SXuan Hu } 237730cfbc0SXuan Hu iq.io.og0Resp.zipWithIndex.foreach { case (og0Resp, j) => 238730cfbc0SXuan Hu og0Resp.valid := io.fromDataPath(i)(j).og0resp.valid 239730cfbc0SXuan Hu og0Resp.bits.respType := io.fromDataPath(i)(j).og0resp.bits.respType 240730cfbc0SXuan Hu og0Resp.bits.addrOH := io.fromDataPath(i)(j).og0resp.bits.addrOH 2418d29ec32Sczw og0Resp.bits.rfWen := io.fromDataPath(i)(j).og0resp.bits.rfWen 2428d29ec32Sczw og0Resp.bits.fuType := io.fromDataPath(i)(j).og0resp.bits.fuType 2438d29ec32Sczw 244730cfbc0SXuan Hu } 245730cfbc0SXuan Hu iq.io.og1Resp.zipWithIndex.foreach { case (og1Resp, j) => 246730cfbc0SXuan Hu og1Resp.valid := io.fromDataPath(i)(j).og1resp.valid 247730cfbc0SXuan Hu og1Resp.bits.respType := io.fromDataPath(i)(j).og1resp.bits.respType 248730cfbc0SXuan Hu og1Resp.bits.addrOH := io.fromDataPath(i)(j).og1resp.bits.addrOH 2498d29ec32Sczw og1Resp.bits.rfWen := io.fromDataPath(i)(j).og1resp.bits.rfWen 2508d29ec32Sczw og1Resp.bits.fuType := io.fromDataPath(i)(j).og1resp.bits.fuType 2518d29ec32Sczw 252730cfbc0SXuan Hu } 2532e0a7dc5Sfdy 2542e0a7dc5Sfdy iq.io.wbBusyTableRead := io.fromWbFuBusyTable.fuBusyTableRead(i) 255dd970561SzhanglyGit io.wbFuBusyTable(i) := iq.io.wbBusyTableWrite 256730cfbc0SXuan Hu } 257730cfbc0SXuan Hu 258730cfbc0SXuan Hu val iqJumpBundleVec: Seq[IssueQueueJumpBundle] = issueQueues.map { 259730cfbc0SXuan Hu case imp: IssueQueueIntImp => imp.io.enqJmp 260730cfbc0SXuan Hu case _ => None 261730cfbc0SXuan Hu }.filter(_.nonEmpty).flatMap(_.get) 262730cfbc0SXuan Hu println(s"[Scheduler] iqJumpBundleVec: ${iqJumpBundleVec}") 263730cfbc0SXuan Hu 264730cfbc0SXuan Hu iqJumpBundleVec.zip(io.fromCtrlBlock.pcVec zip io.fromCtrlBlock.targetVec).foreach { case (iqJmp, (pc, target)) => 265730cfbc0SXuan Hu iqJmp.pc := pc 266730cfbc0SXuan Hu iqJmp.target := target 267730cfbc0SXuan Hu } 268730cfbc0SXuan Hu} 269730cfbc0SXuan Hu 270730cfbc0SXuan Huclass SchedulerMemImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters) 271730cfbc0SXuan Hu extends SchedulerImpBase(wrapper) 272730cfbc0SXuan Hu with HasXSParameter 273730cfbc0SXuan Hu{ 274730cfbc0SXuan Hu println(s"[SchedulerMemImp] " + 275730cfbc0SXuan Hu s"has intBusyTable: ${intBusyTable.nonEmpty}, " + 276730cfbc0SXuan Hu s"has vfBusyTable: ${vfBusyTable.nonEmpty}") 277730cfbc0SXuan Hu 278730cfbc0SXuan Hu val memAddrIQs = issueQueues.filter(iq => iq.params.StdCnt == 0) 279730cfbc0SXuan Hu val stAddrIQs = issueQueues.filter(iq => iq.params.StaCnt > 0) // included in memAddrIQs 2807b753bebSXuan Hu val ldAddrIQs = issueQueues.filter(iq => iq.params.LduCnt > 0) 281730cfbc0SXuan Hu val stDataIQs = issueQueues.filter(iq => iq.params.StdCnt > 0) 282730cfbc0SXuan Hu require(memAddrIQs.nonEmpty && stDataIQs.nonEmpty) 283730cfbc0SXuan Hu 284730cfbc0SXuan Hu issueQueues.zipWithIndex.foreach { case (iq, i) => 285730cfbc0SXuan Hu iq.io.deqResp.zipWithIndex.foreach { case (deqResp, j) => 286ea0f92d8Sczw deqResp.valid := iq.io.deq(j).valid && io.toDataPath(i)(j).ready 287ea0f92d8Sczw deqResp.bits.respType := RSFeedbackType.issueSuccess 288730cfbc0SXuan Hu deqResp.bits.addrOH := iq.io.deq(j).bits.addrOH 2898d29ec32Sczw deqResp.bits.rfWen := iq.io.deq(j).bits.common.rfWen.getOrElse(false.B) 2908d29ec32Sczw deqResp.bits.fuType := iq.io.deq(j).bits.common.fuType 2918d29ec32Sczw 292730cfbc0SXuan Hu } 293730cfbc0SXuan Hu iq.io.og0Resp.zipWithIndex.foreach { case (og0Resp, j) => 294730cfbc0SXuan Hu og0Resp.valid := io.fromDataPath(i)(j).og0resp.valid 295730cfbc0SXuan Hu og0Resp.bits.respType := io.fromDataPath(i)(j).og0resp.bits.respType 296730cfbc0SXuan Hu og0Resp.bits.addrOH := io.fromDataPath(i)(j).og0resp.bits.addrOH 2978d29ec32Sczw og0Resp.bits.rfWen := io.fromDataPath(i)(j).og0resp.bits.rfWen 2988d29ec32Sczw og0Resp.bits.fuType := io.fromDataPath(i)(j).og0resp.bits.fuType 2998d29ec32Sczw 300730cfbc0SXuan Hu } 301730cfbc0SXuan Hu iq.io.og1Resp.zipWithIndex.foreach { case (og1Resp, j) => 302730cfbc0SXuan Hu og1Resp.valid := io.fromDataPath(i)(j).og1resp.valid 303730cfbc0SXuan Hu og1Resp.bits.respType := io.fromDataPath(i)(j).og1resp.bits.respType 304730cfbc0SXuan Hu og1Resp.bits.addrOH := io.fromDataPath(i)(j).og1resp.bits.addrOH 3058d29ec32Sczw og1Resp.bits.rfWen := io.fromDataPath(i)(j).og1resp.bits.rfWen 3068d29ec32Sczw og1Resp.bits.fuType := io.fromDataPath(i)(j).og1resp.bits.fuType 3078d29ec32Sczw 308730cfbc0SXuan Hu } 3092e0a7dc5Sfdy iq.io.wbBusyTableRead := io.fromWbFuBusyTable.fuBusyTableRead(i) 310dd970561SzhanglyGit io.wbFuBusyTable(i) := iq.io.wbBusyTableWrite 311730cfbc0SXuan Hu } 312730cfbc0SXuan Hu 313730cfbc0SXuan Hu memAddrIQs.zipWithIndex.foreach { case (iq, i) => 314730cfbc0SXuan Hu iq.io.flush <> io.fromCtrlBlock.flush 315730cfbc0SXuan Hu iq.io.enq <> dispatch2Iq.io.out(i) 316bf35baadSXuan Hu iq.io.wakeupFromWB := wakeupFromWBVec 317730cfbc0SXuan Hu } 318730cfbc0SXuan Hu 3197b753bebSXuan Hu ldAddrIQs.foreach { 320de784418SXuan Hu case imp: IssueQueueMemAddrImp => 321de784418SXuan Hu imp.io.memIO.get.feedbackIO <> io.fromMem.get.ldaFeedback 322de784418SXuan Hu imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 3237b753bebSXuan Hu case _ => 3247b753bebSXuan Hu } 3257b753bebSXuan Hu 3267b753bebSXuan Hu stAddrIQs.foreach { 3277b753bebSXuan Hu case imp: IssueQueueMemAddrImp => imp.io.memIO.get.feedbackIO <> io.fromMem.get.staFeedback 3287b753bebSXuan Hu case _ => 3297b753bebSXuan Hu } 330730cfbc0SXuan Hu 3319b258a00Sxgkiri private val staIdxSeq = issueQueues.filter(iq => iq.params.StaCnt > 0).map(iq => iq.params.idxInSchBlk) 3329b258a00Sxgkiri 3339b258a00Sxgkiri for ((idxInSchBlk, i) <- staIdxSeq.zipWithIndex) { 3349b258a00Sxgkiri dispatch2Iq.io.out(idxInSchBlk).zip(stAddrIQs(i).io.enq).zip(stDataIQs(i).io.enq).foreach{ case((di, staIQ), stdIQ) => 335730cfbc0SXuan Hu val isAllReady = staIQ.ready && stdIQ.ready 336730cfbc0SXuan Hu di.ready := isAllReady 337730cfbc0SXuan Hu staIQ.valid := di.valid && isAllReady 338730cfbc0SXuan Hu stdIQ.valid := di.valid && isAllReady 339730cfbc0SXuan Hu } 3409b258a00Sxgkiri } 341730cfbc0SXuan Hu 342730cfbc0SXuan Hu require(stAddrIQs.size == stDataIQs.size, s"number of store address IQs(${stAddrIQs.size}) " + 343730cfbc0SXuan Hu s"should be equal to number of data IQs(${stDataIQs})") 344730cfbc0SXuan Hu stDataIQs.zip(stAddrIQs).zipWithIndex.foreach { case ((stdIQ, staIQ), i) => 345730cfbc0SXuan Hu stdIQ.io.flush <> io.fromCtrlBlock.flush 346730cfbc0SXuan Hu 347730cfbc0SXuan Hu stdIQ.io.enq.zip(staIQ.io.enq).foreach { case (stdIQEnq, staIQEnq) => 348730cfbc0SXuan Hu stdIQEnq.bits := staIQEnq.bits 349730cfbc0SXuan Hu // Store data reuses store addr src(1) in dispatch2iq 350730cfbc0SXuan Hu // [dispatch2iq] --src*------src*(0)--> [staIQ] 351730cfbc0SXuan Hu // \ 352730cfbc0SXuan Hu // ---src*(1)--> [stdIQ] 353730cfbc0SXuan Hu // Since the src(1) of sta is easier to get, stdIQEnq.bits.src*(0) is assigned to staIQEnq.bits.src*(1) 354730cfbc0SXuan Hu // instead of dispatch2Iq.io.out(x).bits.src*(1) 355730cfbc0SXuan Hu stdIQEnq.bits.srcState(0) := staIQEnq.bits.srcState(1) 356730cfbc0SXuan Hu stdIQEnq.bits.srcType(0) := staIQEnq.bits.srcType(1) 357730cfbc0SXuan Hu stdIQEnq.bits.psrc(0) := staIQEnq.bits.psrc(1) 358730cfbc0SXuan Hu stdIQEnq.bits.sqIdx := staIQEnq.bits.sqIdx 359730cfbc0SXuan Hu } 360bf35baadSXuan Hu stdIQ.io.wakeupFromWB := wakeupFromWBVec 361730cfbc0SXuan Hu } 362730cfbc0SXuan Hu 363730cfbc0SXuan Hu val lsqEnqCtrl = Module(new LsqEnqCtrl) 364730cfbc0SXuan Hu 365730cfbc0SXuan Hu lsqEnqCtrl.io.redirect <> io.fromCtrlBlock.flush 366730cfbc0SXuan Hu lsqEnqCtrl.io.enq <> dispatch2Iq.io.enqLsqIO.get 367730cfbc0SXuan Hu lsqEnqCtrl.io.lcommit := io.fromMem.get.lcommit 368730cfbc0SXuan Hu lsqEnqCtrl.io.scommit := io.fromMem.get.scommit 369730cfbc0SXuan Hu lsqEnqCtrl.io.lqCancelCnt := io.fromMem.get.lqCancelCnt 370730cfbc0SXuan Hu lsqEnqCtrl.io.sqCancelCnt := io.fromMem.get.sqCancelCnt 371730cfbc0SXuan Hu io.memIO.get.lsqEnqIO <> lsqEnqCtrl.io.enqLsq 372730cfbc0SXuan Hu} 373