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} 13ea46c302SXuan Huimport xiangshan.backend.Bundles.{DynInst, ExuVec, IssueQueueCancelBundle, IssueQueueIQWakeUpBundle, IssueQueueWBWakeUpBundle} 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 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 } 63730cfbc0SXuan Hu val intWriteBack = MixedVec(Vec(backendParams.intPregParams.numWrite, 64730cfbc0SXuan Hu new RfWritePortWithConfig(backendParams.intPregParams.dataCfg, backendParams.intPregParams.addrWidth))) 65730cfbc0SXuan Hu val vfWriteBack = MixedVec(Vec(backendParams.vfPregParams.numWrite, 66730cfbc0SXuan Hu new RfWritePortWithConfig(backendParams.vfPregParams.dataCfg, backendParams.vfPregParams.addrWidth))) 67730cfbc0SXuan Hu val toDataPath: MixedVec[MixedVec[DecoupledIO[Bundles.IssueQueueIssueBundle]]] = MixedVec(params.issueBlockParams.map(_.genIssueDecoupledBundle)) 68730cfbc0SXuan Hu 69bf35baadSXuan Hu val fromSchedulers = new Bundle { 70c0be7f33SXuan Hu val wakeupVec: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpInValidBundle) 71bf35baadSXuan Hu } 72bf35baadSXuan Hu 73bf35baadSXuan Hu val toSchedulers = new Bundle { 74c0be7f33SXuan Hu val wakeupVec: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = params.genIQWakeUpOutValidBundle 75bf35baadSXuan Hu } 76bf35baadSXuan Hu 77c0be7f33SXuan Hu val fromDataPath = new Bundle { 78c0be7f33SXuan Hu val resp: MixedVec[MixedVec[Bundles.OGRespBundle]] = MixedVec(params.issueBlockParams.map(x => Flipped(x.genOGRespBundle))) 79ea46c302SXuan Hu val og0Cancel = Input(ExuVec(backendParams.numExu)) 80ea46c302SXuan Hu // Todo: remove this after no cancel signal from og1 81ea46c302SXuan Hu val og1Cancel = Input(ExuVec(backendParams.numExu)) 82c0be7f33SXuan Hu // just be compatible to old code 83c0be7f33SXuan Hu def apply(i: Int)(j: Int) = resp(i)(j) 84c0be7f33SXuan Hu } 85c0be7f33SXuan Hu 86c0be7f33SXuan Hu 87730cfbc0SXuan Hu val memIO = if (params.isMemSchd) Some(new Bundle { 88730cfbc0SXuan Hu val lsqEnqIO = Flipped(new LsqEnqIO) 89730cfbc0SXuan Hu }) else None 90730cfbc0SXuan Hu val fromMem = if (params.isMemSchd) Some(new Bundle { 917b753bebSXuan Hu val ldaFeedback = Flipped(Vec(params.LduCnt, new MemRSFeedbackIO)) 927b753bebSXuan Hu val staFeedback = Flipped(Vec(params.StaCnt, new MemRSFeedbackIO)) 93730cfbc0SXuan Hu val stIssuePtr = Input(new SqPtr()) 94730cfbc0SXuan Hu val lcommit = Input(UInt(log2Up(CommitWidth + 1).W)) 95730cfbc0SXuan Hu val scommit = Input(UInt(log2Ceil(EnsbufferWidth + 1).W)) // connected to `memBlock.io.sqDeq` instead of ROB 96730cfbc0SXuan Hu // from lsq 97730cfbc0SXuan Hu val lqCancelCnt = Input(UInt(log2Up(LoadQueueSize + 1).W)) 98730cfbc0SXuan Hu val sqCancelCnt = Input(UInt(log2Up(StoreQueueSize + 1).W)) 99730cfbc0SXuan Hu val memWaitUpdateReq = Flipped(new MemWaitUpdateReq) 100730cfbc0SXuan Hu }) else None 101730cfbc0SXuan Hu val toMem = if (params.isMemSchd) Some(new Bundle { 102730cfbc0SXuan Hu val loadFastMatch = Output(Vec(params.LduCnt, new IssueQueueLoadBundle)) 103730cfbc0SXuan Hu }) else None 104730cfbc0SXuan Hu} 105730cfbc0SXuan Hu 106730cfbc0SXuan Huabstract class SchedulerImpBase(wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters) 107730cfbc0SXuan Hu extends LazyModuleImp(wrapper) 108730cfbc0SXuan Hu with HasXSParameter 109730cfbc0SXuan Hu{ 110730cfbc0SXuan Hu val io = IO(new SchedulerIO()) 111730cfbc0SXuan Hu 112730cfbc0SXuan Hu // alias 113c0be7f33SXuan Hu private val iqWakeUpInMap: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] = 114c0be7f33SXuan Hu io.fromSchedulers.wakeupVec.map(x => (x.bits.exuIdx, x)).toMap 115730cfbc0SXuan Hu private val schdType = params.schdType 116730cfbc0SXuan Hu private val (numRfRead, numRfWrite) = params.numRfReadWrite.getOrElse((0, 0)) 117730cfbc0SXuan Hu private val numPregs = params.numPregs 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 { 125730cfbc0SXuan Hu case IntScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numIntStateRead, wrapper.numIntStateWrite))) 126730cfbc0SXuan Hu case _ => None 127730cfbc0SXuan Hu } 128730cfbc0SXuan Hu 129730cfbc0SXuan Hu val vfBusyTable = schdType match { 130730cfbc0SXuan Hu case VfScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numVfStateRead, wrapper.numVfStateWrite))) 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 183bf35baadSXuan Hu issueQueues.foreach { iq => 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 189bf35baadSXuan Hu } 190bf35baadSXuan Hu 191c0be7f33SXuan Hu private val iqWakeUpOutMap: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] = 192bf35baadSXuan Hu issueQueues.flatMap(_.io.wakeupToIQ) 193c0be7f33SXuan Hu .map(x => (x.bits.exuIdx, x)) 194bf35baadSXuan Hu .toMap 195bf35baadSXuan Hu 196bf35baadSXuan Hu // Connect bundles having the same wakeup source 197bf35baadSXuan Hu io.toSchedulers.wakeupVec.foreach { wakeUp => 198c0be7f33SXuan Hu wakeUp := iqWakeUpOutMap(wakeUp.bits.exuIdx) 199bf35baadSXuan Hu } 200bf35baadSXuan Hu 201730cfbc0SXuan Hu io.toDataPath.zipWithIndex.foreach { case (toDp, i) => 202730cfbc0SXuan Hu toDp <> issueQueues(i).io.deq 203730cfbc0SXuan Hu } 204bf35baadSXuan Hu 205c0be7f33SXuan Hu println(s"[Scheduler] io.fromSchedulers.wakeupVec: ${io.fromSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}") 206bf35baadSXuan Hu println(s"[Scheduler] iqWakeUpInKeys: ${iqWakeUpInMap.keys}") 207bf35baadSXuan Hu 208bf35baadSXuan Hu println(s"[Scheduler] iqWakeUpOutKeys: ${iqWakeUpOutMap.keys}") 209c0be7f33SXuan Hu println(s"[Scheduler] io.toSchedulers.wakeupVec: ${io.toSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}") 210730cfbc0SXuan Hu} 211730cfbc0SXuan Hu 212730cfbc0SXuan Huclass SchedulerArithImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters) 213730cfbc0SXuan Hu extends SchedulerImpBase(wrapper) 214730cfbc0SXuan Hu with HasXSParameter 215730cfbc0SXuan Hu{ 2162e0a7dc5Sfdy// dontTouch(io.vfWbFuBusyTable) 217730cfbc0SXuan Hu println(s"[SchedulerArithImp] " + 218730cfbc0SXuan Hu s"has intBusyTable: ${intBusyTable.nonEmpty}, " + 219730cfbc0SXuan Hu s"has vfBusyTable: ${vfBusyTable.nonEmpty}") 220730cfbc0SXuan Hu 221730cfbc0SXuan Hu issueQueues.zipWithIndex.foreach { case (iq, i) => 222730cfbc0SXuan Hu iq.io.flush <> io.fromCtrlBlock.flush 223730cfbc0SXuan Hu iq.io.enq <> dispatch2Iq.io.out(i) 224bf35baadSXuan Hu iq.io.wakeupFromWB := wakeupFromWBVec 225730cfbc0SXuan Hu iq.io.deqResp.zipWithIndex.foreach { case (deqResp, j) => 226ea0f92d8Sczw deqResp.valid := iq.io.deq(j).valid && io.toDataPath(i)(j).ready 227ea0f92d8Sczw deqResp.bits.respType := RSFeedbackType.issueSuccess 228730cfbc0SXuan Hu deqResp.bits.addrOH := iq.io.deq(j).bits.addrOH 2298d29ec32Sczw deqResp.bits.rfWen := iq.io.deq(j).bits.common.rfWen.getOrElse(false.B) 2308d29ec32Sczw deqResp.bits.fuType := iq.io.deq(j).bits.common.fuType 2318d29ec32Sczw 232730cfbc0SXuan Hu } 233730cfbc0SXuan Hu iq.io.og0Resp.zipWithIndex.foreach { case (og0Resp, j) => 234730cfbc0SXuan Hu og0Resp.valid := io.fromDataPath(i)(j).og0resp.valid 235730cfbc0SXuan Hu og0Resp.bits.respType := io.fromDataPath(i)(j).og0resp.bits.respType 236730cfbc0SXuan Hu og0Resp.bits.addrOH := io.fromDataPath(i)(j).og0resp.bits.addrOH 2378d29ec32Sczw og0Resp.bits.rfWen := io.fromDataPath(i)(j).og0resp.bits.rfWen 2388d29ec32Sczw og0Resp.bits.fuType := io.fromDataPath(i)(j).og0resp.bits.fuType 2398d29ec32Sczw 240730cfbc0SXuan Hu } 241730cfbc0SXuan Hu iq.io.og1Resp.zipWithIndex.foreach { case (og1Resp, j) => 242730cfbc0SXuan Hu og1Resp.valid := io.fromDataPath(i)(j).og1resp.valid 243730cfbc0SXuan Hu og1Resp.bits.respType := io.fromDataPath(i)(j).og1resp.bits.respType 244730cfbc0SXuan Hu og1Resp.bits.addrOH := io.fromDataPath(i)(j).og1resp.bits.addrOH 2458d29ec32Sczw og1Resp.bits.rfWen := io.fromDataPath(i)(j).og1resp.bits.rfWen 2468d29ec32Sczw og1Resp.bits.fuType := io.fromDataPath(i)(j).og1resp.bits.fuType 2478d29ec32Sczw 248730cfbc0SXuan Hu } 2492e0a7dc5Sfdy 2502e0a7dc5Sfdy iq.io.wbBusyTableRead := io.fromWbFuBusyTable.fuBusyTableRead(i) 251dd970561SzhanglyGit io.wbFuBusyTable(i) := iq.io.wbBusyTableWrite 252730cfbc0SXuan Hu } 253730cfbc0SXuan Hu 254730cfbc0SXuan Hu val iqJumpBundleVec: Seq[IssueQueueJumpBundle] = issueQueues.map { 255730cfbc0SXuan Hu case imp: IssueQueueIntImp => imp.io.enqJmp 256730cfbc0SXuan Hu case _ => None 257730cfbc0SXuan Hu }.filter(_.nonEmpty).flatMap(_.get) 258730cfbc0SXuan Hu println(s"[Scheduler] iqJumpBundleVec: ${iqJumpBundleVec}") 259730cfbc0SXuan Hu 260730cfbc0SXuan Hu iqJumpBundleVec.zip(io.fromCtrlBlock.pcVec zip io.fromCtrlBlock.targetVec).foreach { case (iqJmp, (pc, target)) => 261730cfbc0SXuan Hu iqJmp.pc := pc 262730cfbc0SXuan Hu iqJmp.target := target 263730cfbc0SXuan Hu } 264730cfbc0SXuan Hu} 265730cfbc0SXuan Hu 266730cfbc0SXuan Huclass SchedulerMemImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters) 267730cfbc0SXuan Hu extends SchedulerImpBase(wrapper) 268730cfbc0SXuan Hu with HasXSParameter 269730cfbc0SXuan Hu{ 270730cfbc0SXuan Hu println(s"[SchedulerMemImp] " + 271730cfbc0SXuan Hu s"has intBusyTable: ${intBusyTable.nonEmpty}, " + 272730cfbc0SXuan Hu s"has vfBusyTable: ${vfBusyTable.nonEmpty}") 273730cfbc0SXuan Hu 274730cfbc0SXuan Hu val memAddrIQs = issueQueues.filter(iq => iq.params.StdCnt == 0) 275730cfbc0SXuan Hu val stAddrIQs = issueQueues.filter(iq => iq.params.StaCnt > 0) // included in memAddrIQs 2767b753bebSXuan Hu val ldAddrIQs = issueQueues.filter(iq => iq.params.LduCnt > 0) 277730cfbc0SXuan Hu val stDataIQs = issueQueues.filter(iq => iq.params.StdCnt > 0) 278730cfbc0SXuan Hu require(memAddrIQs.nonEmpty && stDataIQs.nonEmpty) 279730cfbc0SXuan Hu 280730cfbc0SXuan Hu issueQueues.zipWithIndex.foreach { case (iq, i) => 281730cfbc0SXuan Hu iq.io.deqResp.zipWithIndex.foreach { case (deqResp, j) => 282ea0f92d8Sczw deqResp.valid := iq.io.deq(j).valid && io.toDataPath(i)(j).ready 283ea0f92d8Sczw deqResp.bits.respType := RSFeedbackType.issueSuccess 284730cfbc0SXuan Hu deqResp.bits.addrOH := iq.io.deq(j).bits.addrOH 2858d29ec32Sczw deqResp.bits.rfWen := iq.io.deq(j).bits.common.rfWen.getOrElse(false.B) 2868d29ec32Sczw deqResp.bits.fuType := iq.io.deq(j).bits.common.fuType 2878d29ec32Sczw 288730cfbc0SXuan Hu } 289730cfbc0SXuan Hu iq.io.og0Resp.zipWithIndex.foreach { case (og0Resp, j) => 290730cfbc0SXuan Hu og0Resp.valid := io.fromDataPath(i)(j).og0resp.valid 291730cfbc0SXuan Hu og0Resp.bits.respType := io.fromDataPath(i)(j).og0resp.bits.respType 292730cfbc0SXuan Hu og0Resp.bits.addrOH := io.fromDataPath(i)(j).og0resp.bits.addrOH 2938d29ec32Sczw og0Resp.bits.rfWen := io.fromDataPath(i)(j).og0resp.bits.rfWen 2948d29ec32Sczw og0Resp.bits.fuType := io.fromDataPath(i)(j).og0resp.bits.fuType 2958d29ec32Sczw 296730cfbc0SXuan Hu } 297730cfbc0SXuan Hu iq.io.og1Resp.zipWithIndex.foreach { case (og1Resp, j) => 298730cfbc0SXuan Hu og1Resp.valid := io.fromDataPath(i)(j).og1resp.valid 299730cfbc0SXuan Hu og1Resp.bits.respType := io.fromDataPath(i)(j).og1resp.bits.respType 300730cfbc0SXuan Hu og1Resp.bits.addrOH := io.fromDataPath(i)(j).og1resp.bits.addrOH 3018d29ec32Sczw og1Resp.bits.rfWen := io.fromDataPath(i)(j).og1resp.bits.rfWen 3028d29ec32Sczw og1Resp.bits.fuType := io.fromDataPath(i)(j).og1resp.bits.fuType 3038d29ec32Sczw 304730cfbc0SXuan Hu } 3052e0a7dc5Sfdy iq.io.wbBusyTableRead := io.fromWbFuBusyTable.fuBusyTableRead(i) 306dd970561SzhanglyGit io.wbFuBusyTable(i) := iq.io.wbBusyTableWrite 307730cfbc0SXuan Hu } 308730cfbc0SXuan Hu 309730cfbc0SXuan Hu memAddrIQs.zipWithIndex.foreach { case (iq, i) => 310730cfbc0SXuan Hu iq.io.flush <> io.fromCtrlBlock.flush 311730cfbc0SXuan Hu iq.io.enq <> dispatch2Iq.io.out(i) 312bf35baadSXuan Hu iq.io.wakeupFromWB := wakeupFromWBVec 313730cfbc0SXuan Hu } 314730cfbc0SXuan Hu 3157b753bebSXuan Hu ldAddrIQs.foreach { 316*de784418SXuan Hu case imp: IssueQueueMemAddrImp => 317*de784418SXuan Hu imp.io.memIO.get.feedbackIO <> io.fromMem.get.ldaFeedback 318*de784418SXuan Hu imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 3197b753bebSXuan Hu case _ => 3207b753bebSXuan Hu } 3217b753bebSXuan Hu 3227b753bebSXuan Hu stAddrIQs.foreach { 3237b753bebSXuan Hu case imp: IssueQueueMemAddrImp => imp.io.memIO.get.feedbackIO <> io.fromMem.get.staFeedback 3247b753bebSXuan Hu case _ => 3257b753bebSXuan Hu } 326730cfbc0SXuan Hu 3279b258a00Sxgkiri private val staIdxSeq = issueQueues.filter(iq => iq.params.StaCnt > 0).map(iq => iq.params.idxInSchBlk) 3289b258a00Sxgkiri 3299b258a00Sxgkiri for ((idxInSchBlk, i) <- staIdxSeq.zipWithIndex) { 3309b258a00Sxgkiri dispatch2Iq.io.out(idxInSchBlk).zip(stAddrIQs(i).io.enq).zip(stDataIQs(i).io.enq).foreach{ case((di, staIQ), stdIQ) => 331730cfbc0SXuan Hu val isAllReady = staIQ.ready && stdIQ.ready 332730cfbc0SXuan Hu di.ready := isAllReady 333730cfbc0SXuan Hu staIQ.valid := di.valid && isAllReady 334730cfbc0SXuan Hu stdIQ.valid := di.valid && isAllReady 335730cfbc0SXuan Hu } 3369b258a00Sxgkiri } 337730cfbc0SXuan Hu 338730cfbc0SXuan Hu require(stAddrIQs.size == stDataIQs.size, s"number of store address IQs(${stAddrIQs.size}) " + 339730cfbc0SXuan Hu s"should be equal to number of data IQs(${stDataIQs})") 340730cfbc0SXuan Hu stDataIQs.zip(stAddrIQs).zipWithIndex.foreach { case ((stdIQ, staIQ), i) => 341730cfbc0SXuan Hu stdIQ.io.flush <> io.fromCtrlBlock.flush 342730cfbc0SXuan Hu 343730cfbc0SXuan Hu stdIQ.io.enq.zip(staIQ.io.enq).foreach { case (stdIQEnq, staIQEnq) => 344730cfbc0SXuan Hu stdIQEnq.bits := staIQEnq.bits 345730cfbc0SXuan Hu // Store data reuses store addr src(1) in dispatch2iq 346730cfbc0SXuan Hu // [dispatch2iq] --src*------src*(0)--> [staIQ] 347730cfbc0SXuan Hu // \ 348730cfbc0SXuan Hu // ---src*(1)--> [stdIQ] 349730cfbc0SXuan Hu // Since the src(1) of sta is easier to get, stdIQEnq.bits.src*(0) is assigned to staIQEnq.bits.src*(1) 350730cfbc0SXuan Hu // instead of dispatch2Iq.io.out(x).bits.src*(1) 351730cfbc0SXuan Hu stdIQEnq.bits.srcState(0) := staIQEnq.bits.srcState(1) 352730cfbc0SXuan Hu stdIQEnq.bits.srcType(0) := staIQEnq.bits.srcType(1) 353730cfbc0SXuan Hu stdIQEnq.bits.psrc(0) := staIQEnq.bits.psrc(1) 354730cfbc0SXuan Hu stdIQEnq.bits.sqIdx := staIQEnq.bits.sqIdx 355730cfbc0SXuan Hu } 356bf35baadSXuan Hu stdIQ.io.wakeupFromWB := wakeupFromWBVec 357730cfbc0SXuan Hu } 358730cfbc0SXuan Hu 359730cfbc0SXuan Hu val lsqEnqCtrl = Module(new LsqEnqCtrl) 360730cfbc0SXuan Hu 361730cfbc0SXuan Hu lsqEnqCtrl.io.redirect <> io.fromCtrlBlock.flush 362730cfbc0SXuan Hu lsqEnqCtrl.io.enq <> dispatch2Iq.io.enqLsqIO.get 363730cfbc0SXuan Hu lsqEnqCtrl.io.lcommit := io.fromMem.get.lcommit 364730cfbc0SXuan Hu lsqEnqCtrl.io.scommit := io.fromMem.get.scommit 365730cfbc0SXuan Hu lsqEnqCtrl.io.lqCancelCnt := io.fromMem.get.lqCancelCnt 366730cfbc0SXuan Hu lsqEnqCtrl.io.sqCancelCnt := io.fromMem.get.sqCancelCnt 367730cfbc0SXuan Hu io.memIO.get.lsqEnqIO <> lsqEnqCtrl.io.enqLsq 368730cfbc0SXuan Hu} 369