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 } 44*8d29ec32Sczw val wbFuBusyTable = new Bundle{ 45*8d29ec32Sczw val fuBusyTableWrite = MixedVec(params.issueBlockParams.map(x => x.genFuBusyTableWriteBundle)) 46*8d29ec32Sczw val fuBusyTableRead = MixedVec(params.issueBlockParams.map(x => Input(x.genFuBusyTableReadBundle))) 47*8d29ec32Sczw } 48730cfbc0SXuan Hu val fromCtrlBlock = new Bundle { 49730cfbc0SXuan Hu val pcVec = Input(Vec(params.numPcReadPort, UInt(VAddrData().dataWidth.W))) 50730cfbc0SXuan Hu val targetVec = Input(Vec(params.numPcReadPort, UInt(VAddrData().dataWidth.W))) 51730cfbc0SXuan Hu val flush = Flipped(ValidIO(new Redirect)) 52730cfbc0SXuan Hu } 53730cfbc0SXuan Hu val fromDispatch = new Bundle { 54730cfbc0SXuan Hu val allocPregs = Vec(RenameWidth, Input(new ResetPregStateReq)) 55730cfbc0SXuan Hu val uops = Vec(params.numUopIn, Flipped(DecoupledIO(new DynInst))) 56730cfbc0SXuan Hu } 57730cfbc0SXuan Hu val intWriteBack = MixedVec(Vec(backendParams.intPregParams.numWrite, 58730cfbc0SXuan Hu new RfWritePortWithConfig(backendParams.intPregParams.dataCfg, backendParams.intPregParams.addrWidth))) 59730cfbc0SXuan Hu val vfWriteBack = MixedVec(Vec(backendParams.vfPregParams.numWrite, 60730cfbc0SXuan Hu new RfWritePortWithConfig(backendParams.vfPregParams.dataCfg, backendParams.vfPregParams.addrWidth))) 61730cfbc0SXuan Hu val toDataPath: MixedVec[MixedVec[DecoupledIO[Bundles.IssueQueueIssueBundle]]] = MixedVec(params.issueBlockParams.map(_.genIssueDecoupledBundle)) 62730cfbc0SXuan Hu val fromDataPath: MixedVec[MixedVec[Bundles.OGRespBundle]] = MixedVec(params.issueBlockParams.map(x => Flipped(x.genOGRespBundle))) 63730cfbc0SXuan Hu 64730cfbc0SXuan Hu val memIO = if (params.isMemSchd) Some(new Bundle { 65730cfbc0SXuan Hu val lsqEnqIO = Flipped(new LsqEnqIO) 66730cfbc0SXuan Hu }) else None 67730cfbc0SXuan Hu val fromMem = if (params.isMemSchd) Some(new Bundle { 687b753bebSXuan Hu val ldaFeedback = Flipped(Vec(params.LduCnt, new MemRSFeedbackIO)) 697b753bebSXuan Hu val staFeedback = Flipped(Vec(params.StaCnt, new MemRSFeedbackIO)) 70730cfbc0SXuan Hu val stIssuePtr = Input(new SqPtr()) 71730cfbc0SXuan Hu val lcommit = Input(UInt(log2Up(CommitWidth + 1).W)) 72730cfbc0SXuan Hu val scommit = Input(UInt(log2Ceil(EnsbufferWidth + 1).W)) // connected to `memBlock.io.sqDeq` instead of ROB 73730cfbc0SXuan Hu // from lsq 74730cfbc0SXuan Hu val lqCancelCnt = Input(UInt(log2Up(LoadQueueSize + 1).W)) 75730cfbc0SXuan Hu val sqCancelCnt = Input(UInt(log2Up(StoreQueueSize + 1).W)) 76730cfbc0SXuan Hu val memWaitUpdateReq = Flipped(new MemWaitUpdateReq) 77730cfbc0SXuan Hu }) else None 78730cfbc0SXuan Hu val toMem = if (params.isMemSchd) Some(new Bundle { 79730cfbc0SXuan Hu val loadFastMatch = Output(Vec(params.LduCnt, new IssueQueueLoadBundle)) 80730cfbc0SXuan Hu }) else None 81730cfbc0SXuan Hu} 82730cfbc0SXuan Hu 83730cfbc0SXuan Huabstract class SchedulerImpBase(wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters) 84730cfbc0SXuan Hu extends LazyModuleImp(wrapper) 85730cfbc0SXuan Hu with HasXSParameter 86730cfbc0SXuan Hu{ 87730cfbc0SXuan Hu val io = IO(new SchedulerIO()) 88730cfbc0SXuan Hu 89730cfbc0SXuan Hu // alias 90730cfbc0SXuan Hu private val schdType = params.schdType 91730cfbc0SXuan Hu private val (numRfRead, numRfWrite) = params.numRfReadWrite.getOrElse((0, 0)) 92730cfbc0SXuan Hu private val numPregs = params.numPregs 93730cfbc0SXuan Hu 94730cfbc0SXuan Hu // Modules 95730cfbc0SXuan Hu val dispatch2Iq: Dispatch2IqImp = wrapper.dispatch2Iq.module 96730cfbc0SXuan Hu val issueQueues: Seq[IssueQueueImp] = wrapper.issueQueue.map(_.module) 97730cfbc0SXuan Hu 98730cfbc0SXuan Hu // BusyTable Modules 99730cfbc0SXuan Hu val intBusyTable = schdType match { 100730cfbc0SXuan Hu case IntScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numIntStateRead, wrapper.numIntStateWrite))) 101730cfbc0SXuan Hu case _ => None 102730cfbc0SXuan Hu } 103730cfbc0SXuan Hu 104730cfbc0SXuan Hu val vfBusyTable = schdType match { 105730cfbc0SXuan Hu case VfScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numVfStateRead, wrapper.numVfStateWrite))) 106730cfbc0SXuan Hu case _ => None 107730cfbc0SXuan Hu } 108730cfbc0SXuan Hu 109730cfbc0SXuan Hu dispatch2Iq.io match { case dp2iq => 110730cfbc0SXuan Hu dp2iq.redirect <> io.fromCtrlBlock.flush 111730cfbc0SXuan Hu dp2iq.in <> io.fromDispatch.uops 112730cfbc0SXuan Hu dp2iq.readIntState.foreach(_ <> intBusyTable.get.io.read) 113730cfbc0SXuan Hu dp2iq.readVfState.foreach(_ <> vfBusyTable.get.io.read) 114730cfbc0SXuan Hu } 115730cfbc0SXuan Hu 116730cfbc0SXuan Hu intBusyTable match { 117730cfbc0SXuan Hu case Some(bt) => 118730cfbc0SXuan Hu bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) => 119730cfbc0SXuan Hu btAllocPregs.valid := dpAllocPregs.isInt 120730cfbc0SXuan Hu btAllocPregs.bits := dpAllocPregs.preg 121730cfbc0SXuan Hu } 122730cfbc0SXuan Hu bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) => 123730cfbc0SXuan Hu wb.valid := io.intWriteBack(i).wen && io.intWriteBack(i).intWen 124730cfbc0SXuan Hu wb.bits := io.intWriteBack(i).addr 125730cfbc0SXuan Hu } 126730cfbc0SXuan Hu case None => 127730cfbc0SXuan Hu } 128730cfbc0SXuan Hu 129730cfbc0SXuan Hu vfBusyTable match { 130730cfbc0SXuan Hu case Some(bt) => 131730cfbc0SXuan Hu bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) => 132730cfbc0SXuan Hu btAllocPregs.valid := dpAllocPregs.isFp 133730cfbc0SXuan Hu btAllocPregs.bits := dpAllocPregs.preg 134730cfbc0SXuan Hu } 135730cfbc0SXuan Hu bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) => 136730cfbc0SXuan Hu wb.valid := io.vfWriteBack(i).wen && (io.vfWriteBack(i).fpWen || io.vfWriteBack(i).vecWen) 137730cfbc0SXuan Hu wb.bits := io.vfWriteBack(i).addr 138730cfbc0SXuan Hu } 139730cfbc0SXuan Hu case None => 140730cfbc0SXuan Hu } 141730cfbc0SXuan Hu 142730cfbc0SXuan Hu val wakeupFromWBVec = Wire(Vec(params.numWakeupFromWB, ValidIO(new IssueQueueWakeUpBundle(params.pregIdxWidth)))) 143730cfbc0SXuan Hu val writeback = params.schdType match { 144730cfbc0SXuan Hu case IntScheduler() => io.intWriteBack 145730cfbc0SXuan Hu case MemScheduler() => io.intWriteBack ++ io.vfWriteBack 146730cfbc0SXuan Hu case VfScheduler() => io.vfWriteBack 147730cfbc0SXuan Hu case _ => Seq() 148730cfbc0SXuan Hu } 149730cfbc0SXuan Hu wakeupFromWBVec.zip(writeback).foreach { case (sink, source) => 150730cfbc0SXuan Hu sink.valid := source.wen 151730cfbc0SXuan Hu sink.bits.rfWen := source.intWen 152730cfbc0SXuan Hu sink.bits.fpWen := source.fpWen 153730cfbc0SXuan Hu sink.bits.vecWen := source.vecWen 154730cfbc0SXuan Hu sink.bits.pdest := source.addr 155730cfbc0SXuan Hu } 156730cfbc0SXuan Hu 157730cfbc0SXuan Hu io.toDataPath.zipWithIndex.foreach { case (toDp, i) => 158730cfbc0SXuan Hu toDp <> issueQueues(i).io.deq 159730cfbc0SXuan Hu } 160730cfbc0SXuan Hu} 161730cfbc0SXuan Hu 162730cfbc0SXuan Huclass SchedulerArithImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters) 163730cfbc0SXuan Hu extends SchedulerImpBase(wrapper) 164730cfbc0SXuan Hu with HasXSParameter 165730cfbc0SXuan Hu{ 166730cfbc0SXuan Hu println(s"[SchedulerArithImp] " + 167730cfbc0SXuan Hu s"has intBusyTable: ${intBusyTable.nonEmpty}, " + 168730cfbc0SXuan Hu s"has vfBusyTable: ${vfBusyTable.nonEmpty}") 169730cfbc0SXuan Hu 170730cfbc0SXuan Hu issueQueues.zipWithIndex.foreach { case (iq, i) => 171730cfbc0SXuan Hu iq.io.flush <> io.fromCtrlBlock.flush 172730cfbc0SXuan Hu iq.io.enq <> dispatch2Iq.io.out(i) 173730cfbc0SXuan Hu iq.io.wakeup := wakeupFromWBVec 174730cfbc0SXuan Hu iq.io.deqResp.zipWithIndex.foreach { case (deqResp, j) => 175ea0f92d8Sczw deqResp.valid := iq.io.deq(j).valid && io.toDataPath(i)(j).ready 176730cfbc0SXuan Hu deqResp.bits.success := false.B 177ea0f92d8Sczw deqResp.bits.respType := RSFeedbackType.issueSuccess 178730cfbc0SXuan Hu deqResp.bits.addrOH := iq.io.deq(j).bits.addrOH 179*8d29ec32Sczw deqResp.bits.rfWen := iq.io.deq(j).bits.common.rfWen.getOrElse(false.B) 180*8d29ec32Sczw deqResp.bits.fuType := iq.io.deq(j).bits.common.fuType 181*8d29ec32Sczw 182*8d29ec32Sczw io.wbFuBusyTable.fuBusyTableWrite(i)(j).deqResp.valid := iq.io.deq(j).valid && io.toDataPath(i)(j).ready 183*8d29ec32Sczw io.wbFuBusyTable.fuBusyTableWrite(i)(j).deqResp.bits.fuType := iq.io.deq(j).bits.common.fuType 184*8d29ec32Sczw io.wbFuBusyTable.fuBusyTableWrite(i)(j).deqResp.bits.respType := RSFeedbackType.issueSuccess 185*8d29ec32Sczw io.wbFuBusyTable.fuBusyTableWrite(i)(j).deqResp.bits.rfWen := iq.io.deq(j).bits.common.rfWen.getOrElse(false.B) 186730cfbc0SXuan Hu } 187730cfbc0SXuan Hu iq.io.og0Resp.zipWithIndex.foreach { case (og0Resp, j) => 188730cfbc0SXuan Hu og0Resp.valid := io.fromDataPath(i)(j).og0resp.valid 189730cfbc0SXuan Hu og0Resp.bits.success := false.B // Todo: remove it 190730cfbc0SXuan Hu og0Resp.bits.respType := io.fromDataPath(i)(j).og0resp.bits.respType 191730cfbc0SXuan Hu og0Resp.bits.addrOH := io.fromDataPath(i)(j).og0resp.bits.addrOH 192*8d29ec32Sczw og0Resp.bits.rfWen := io.fromDataPath(i)(j).og0resp.bits.rfWen 193*8d29ec32Sczw og0Resp.bits.fuType := io.fromDataPath(i)(j).og0resp.bits.fuType 194*8d29ec32Sczw 195*8d29ec32Sczw io.wbFuBusyTable.fuBusyTableWrite(i)(j).og0Resp.valid := io.fromDataPath(i)(j).og0resp.valid 196*8d29ec32Sczw io.wbFuBusyTable.fuBusyTableWrite(i)(j).og0Resp.bits.fuType := io.fromDataPath(i)(j).og0resp.bits.fuType 197*8d29ec32Sczw io.wbFuBusyTable.fuBusyTableWrite(i)(j).og0Resp.bits.respType := io.fromDataPath(i)(j).og0resp.bits.respType 198*8d29ec32Sczw io.wbFuBusyTable.fuBusyTableWrite(i)(j).og0Resp.bits.rfWen := io.fromDataPath(i)(j).og0resp.bits.rfWen 199730cfbc0SXuan Hu } 200730cfbc0SXuan Hu iq.io.og1Resp.zipWithIndex.foreach { case (og1Resp, j) => 201730cfbc0SXuan Hu og1Resp.valid := io.fromDataPath(i)(j).og1resp.valid 202730cfbc0SXuan Hu og1Resp.bits.success := false.B 203730cfbc0SXuan Hu og1Resp.bits.respType := io.fromDataPath(i)(j).og1resp.bits.respType 204730cfbc0SXuan Hu og1Resp.bits.addrOH := io.fromDataPath(i)(j).og1resp.bits.addrOH 205*8d29ec32Sczw og1Resp.bits.rfWen := io.fromDataPath(i)(j).og1resp.bits.rfWen 206*8d29ec32Sczw og1Resp.bits.fuType := io.fromDataPath(i)(j).og1resp.bits.fuType 207*8d29ec32Sczw 208*8d29ec32Sczw io.wbFuBusyTable.fuBusyTableWrite(i)(j).og1Resp.valid := io.fromDataPath(i)(j).og1resp.valid 209*8d29ec32Sczw io.wbFuBusyTable.fuBusyTableWrite(i)(j).og1Resp.bits.fuType := io.fromDataPath(i)(j).og1resp.bits.fuType 210*8d29ec32Sczw io.wbFuBusyTable.fuBusyTableWrite(i)(j).og1Resp.bits.respType := io.fromDataPath(i)(j).og1resp.bits.respType 211*8d29ec32Sczw io.wbFuBusyTable.fuBusyTableWrite(i)(j).og1Resp.bits.rfWen := io.fromDataPath(i)(j).og1resp.bits.rfWen 212730cfbc0SXuan Hu } 213*8d29ec32Sczw iq.io.wbBusyRead := io.wbFuBusyTable.fuBusyTableRead(i) 214730cfbc0SXuan Hu } 215730cfbc0SXuan Hu 216730cfbc0SXuan Hu val iqJumpBundleVec: Seq[IssueQueueJumpBundle] = issueQueues.map { 217730cfbc0SXuan Hu case imp: IssueQueueIntImp => imp.io.enqJmp 218730cfbc0SXuan Hu case _ => None 219730cfbc0SXuan Hu }.filter(_.nonEmpty).flatMap(_.get) 220730cfbc0SXuan Hu println(s"[Scheduler] iqJumpBundleVec: ${iqJumpBundleVec}") 221730cfbc0SXuan Hu 222730cfbc0SXuan Hu iqJumpBundleVec.zip(io.fromCtrlBlock.pcVec zip io.fromCtrlBlock.targetVec).foreach { case (iqJmp, (pc, target)) => 223730cfbc0SXuan Hu iqJmp.pc := pc 224730cfbc0SXuan Hu iqJmp.target := target 225730cfbc0SXuan Hu } 226730cfbc0SXuan Hu} 227730cfbc0SXuan Hu 228730cfbc0SXuan Huclass SchedulerMemImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters) 229730cfbc0SXuan Hu extends SchedulerImpBase(wrapper) 230730cfbc0SXuan Hu with HasXSParameter 231730cfbc0SXuan Hu{ 232730cfbc0SXuan Hu println(s"[SchedulerMemImp] " + 233730cfbc0SXuan Hu s"has intBusyTable: ${intBusyTable.nonEmpty}, " + 234730cfbc0SXuan Hu s"has vfBusyTable: ${vfBusyTable.nonEmpty}") 235730cfbc0SXuan Hu 236730cfbc0SXuan Hu val memAddrIQs = issueQueues.filter(iq => iq.params.StdCnt == 0) 237730cfbc0SXuan Hu val stAddrIQs = issueQueues.filter(iq => iq.params.StaCnt > 0) // included in memAddrIQs 2387b753bebSXuan Hu val ldAddrIQs = issueQueues.filter(iq => iq.params.LduCnt > 0) 239730cfbc0SXuan Hu val stDataIQs = issueQueues.filter(iq => iq.params.StdCnt > 0) 240730cfbc0SXuan Hu require(memAddrIQs.nonEmpty && stDataIQs.nonEmpty) 241730cfbc0SXuan Hu 242730cfbc0SXuan Hu issueQueues.zipWithIndex.foreach { case (iq, i) => 243730cfbc0SXuan Hu iq.io.deqResp.zipWithIndex.foreach { case (deqResp, j) => 244ea0f92d8Sczw deqResp.valid := iq.io.deq(j).valid && io.toDataPath(i)(j).ready 245730cfbc0SXuan Hu deqResp.bits.success := false.B 246ea0f92d8Sczw deqResp.bits.respType := RSFeedbackType.issueSuccess 247730cfbc0SXuan Hu deqResp.bits.addrOH := iq.io.deq(j).bits.addrOH 248*8d29ec32Sczw deqResp.bits.rfWen := iq.io.deq(j).bits.common.rfWen.getOrElse(false.B) 249*8d29ec32Sczw deqResp.bits.fuType := iq.io.deq(j).bits.common.fuType 250*8d29ec32Sczw 251*8d29ec32Sczw io.wbFuBusyTable.fuBusyTableWrite(i)(j).deqResp.valid := iq.io.deq(j).valid && io.toDataPath(i)(j).ready 252*8d29ec32Sczw io.wbFuBusyTable.fuBusyTableWrite(i)(j).deqResp.bits.fuType := iq.io.deq(j).bits.common.fuType 253*8d29ec32Sczw io.wbFuBusyTable.fuBusyTableWrite(i)(j).deqResp.bits.respType := RSFeedbackType.issueSuccess 254*8d29ec32Sczw io.wbFuBusyTable.fuBusyTableWrite(i)(j).deqResp.bits.rfWen := iq.io.deq(j).bits.common.rfWen.getOrElse(false.B) 255730cfbc0SXuan Hu } 256730cfbc0SXuan Hu iq.io.og0Resp.zipWithIndex.foreach { case (og0Resp, j) => 257730cfbc0SXuan Hu og0Resp.valid := io.fromDataPath(i)(j).og0resp.valid 258730cfbc0SXuan Hu og0Resp.bits.success := false.B // Todo: remove it 259730cfbc0SXuan Hu og0Resp.bits.respType := io.fromDataPath(i)(j).og0resp.bits.respType 260730cfbc0SXuan Hu og0Resp.bits.addrOH := io.fromDataPath(i)(j).og0resp.bits.addrOH 261*8d29ec32Sczw og0Resp.bits.rfWen := io.fromDataPath(i)(j).og0resp.bits.rfWen 262*8d29ec32Sczw og0Resp.bits.fuType := io.fromDataPath(i)(j).og0resp.bits.fuType 263*8d29ec32Sczw 264*8d29ec32Sczw io.wbFuBusyTable.fuBusyTableWrite(i)(j).og0Resp.valid := io.fromDataPath(i)(j).og0resp.valid 265*8d29ec32Sczw io.wbFuBusyTable.fuBusyTableWrite(i)(j).og0Resp.bits.fuType := io.fromDataPath(i)(j).og0resp.bits.fuType 266*8d29ec32Sczw io.wbFuBusyTable.fuBusyTableWrite(i)(j).og0Resp.bits.respType := io.fromDataPath(i)(j).og0resp.bits.respType 267*8d29ec32Sczw io.wbFuBusyTable.fuBusyTableWrite(i)(j).og0Resp.bits.rfWen := io.fromDataPath(i)(j).og0resp.bits.rfWen 268730cfbc0SXuan Hu } 269730cfbc0SXuan Hu iq.io.og1Resp.zipWithIndex.foreach { case (og1Resp, j) => 270730cfbc0SXuan Hu og1Resp.valid := io.fromDataPath(i)(j).og1resp.valid 271730cfbc0SXuan Hu og1Resp.bits.success := false.B 272730cfbc0SXuan Hu og1Resp.bits.respType := io.fromDataPath(i)(j).og1resp.bits.respType 273730cfbc0SXuan Hu og1Resp.bits.addrOH := io.fromDataPath(i)(j).og1resp.bits.addrOH 274*8d29ec32Sczw og1Resp.bits.rfWen := io.fromDataPath(i)(j).og1resp.bits.rfWen 275*8d29ec32Sczw og1Resp.bits.fuType := io.fromDataPath(i)(j).og1resp.bits.fuType 276*8d29ec32Sczw 277*8d29ec32Sczw io.wbFuBusyTable.fuBusyTableWrite(i)(j).og1Resp.valid := io.fromDataPath(i)(j).og1resp.valid 278*8d29ec32Sczw io.wbFuBusyTable.fuBusyTableWrite(i)(j).og1Resp.bits.fuType := io.fromDataPath(i)(j).og1resp.bits.fuType 279*8d29ec32Sczw io.wbFuBusyTable.fuBusyTableWrite(i)(j).og1Resp.bits.respType := io.fromDataPath(i)(j).og1resp.bits.respType 280*8d29ec32Sczw io.wbFuBusyTable.fuBusyTableWrite(i)(j).og1Resp.bits.rfWen := io.fromDataPath(i)(j).og1resp.bits.rfWen 281730cfbc0SXuan Hu } 282730cfbc0SXuan Hu } 283730cfbc0SXuan Hu 284730cfbc0SXuan Hu memAddrIQs.zipWithIndex.foreach { case (iq, i) => 285730cfbc0SXuan Hu iq.io.flush <> io.fromCtrlBlock.flush 286730cfbc0SXuan Hu iq.io.enq <> dispatch2Iq.io.out(i) 287730cfbc0SXuan Hu iq.io.wakeup := wakeupFromWBVec 288730cfbc0SXuan Hu } 289730cfbc0SXuan Hu 2907b753bebSXuan Hu ldAddrIQs.foreach { 2917b753bebSXuan Hu case imp: IssueQueueMemAddrImp => imp.io.memIO.get.feedbackIO <> io.fromMem.get.ldaFeedback 2927b753bebSXuan Hu case _ => 2937b753bebSXuan Hu } 2947b753bebSXuan Hu 2957b753bebSXuan Hu stAddrIQs.foreach { 2967b753bebSXuan Hu case imp: IssueQueueMemAddrImp => imp.io.memIO.get.feedbackIO <> io.fromMem.get.staFeedback 2977b753bebSXuan Hu case _ => 2987b753bebSXuan Hu } 299730cfbc0SXuan Hu 300730cfbc0SXuan Hu dispatch2Iq.io.out(1).zip(stAddrIQs(0).io.enq).zip(stDataIQs(0).io.enq).foreach{ case((di, staIQ), stdIQ) => 301730cfbc0SXuan Hu val isAllReady = staIQ.ready && stdIQ.ready 302730cfbc0SXuan Hu di.ready := isAllReady 303730cfbc0SXuan Hu staIQ.valid := di.valid && isAllReady 304730cfbc0SXuan Hu stdIQ.valid := di.valid && isAllReady 305730cfbc0SXuan Hu } 306730cfbc0SXuan Hu 307730cfbc0SXuan Hu require(stAddrIQs.size == stDataIQs.size, s"number of store address IQs(${stAddrIQs.size}) " + 308730cfbc0SXuan Hu s"should be equal to number of data IQs(${stDataIQs})") 309730cfbc0SXuan Hu stDataIQs.zip(stAddrIQs).zipWithIndex.foreach { case ((stdIQ, staIQ), i) => 310730cfbc0SXuan Hu stdIQ.io.flush <> io.fromCtrlBlock.flush 311730cfbc0SXuan Hu 312730cfbc0SXuan Hu stdIQ.io.enq.zip(staIQ.io.enq).foreach { case (stdIQEnq, staIQEnq) => 313730cfbc0SXuan Hu stdIQEnq.bits := staIQEnq.bits 314730cfbc0SXuan Hu // Store data reuses store addr src(1) in dispatch2iq 315730cfbc0SXuan Hu // [dispatch2iq] --src*------src*(0)--> [staIQ] 316730cfbc0SXuan Hu // \ 317730cfbc0SXuan Hu // ---src*(1)--> [stdIQ] 318730cfbc0SXuan Hu // Since the src(1) of sta is easier to get, stdIQEnq.bits.src*(0) is assigned to staIQEnq.bits.src*(1) 319730cfbc0SXuan Hu // instead of dispatch2Iq.io.out(x).bits.src*(1) 320730cfbc0SXuan Hu stdIQEnq.bits.srcState(0) := staIQEnq.bits.srcState(1) 321730cfbc0SXuan Hu stdIQEnq.bits.srcType(0) := staIQEnq.bits.srcType(1) 322730cfbc0SXuan Hu stdIQEnq.bits.psrc(0) := staIQEnq.bits.psrc(1) 323730cfbc0SXuan Hu stdIQEnq.bits.sqIdx := staIQEnq.bits.sqIdx 324730cfbc0SXuan Hu } 325730cfbc0SXuan Hu stdIQ.io.wakeup := wakeupFromWBVec 326730cfbc0SXuan Hu } 327730cfbc0SXuan Hu 328730cfbc0SXuan Hu val lsqEnqCtrl = Module(new LsqEnqCtrl) 329730cfbc0SXuan Hu 330730cfbc0SXuan Hu lsqEnqCtrl.io.redirect <> io.fromCtrlBlock.flush 331730cfbc0SXuan Hu lsqEnqCtrl.io.enq <> dispatch2Iq.io.enqLsqIO.get 332730cfbc0SXuan Hu lsqEnqCtrl.io.lcommit := io.fromMem.get.lcommit 333730cfbc0SXuan Hu lsqEnqCtrl.io.scommit := io.fromMem.get.scommit 334730cfbc0SXuan Hu lsqEnqCtrl.io.lqCancelCnt := io.fromMem.get.lqCancelCnt 335730cfbc0SXuan Hu lsqEnqCtrl.io.sqCancelCnt := io.fromMem.get.sqCancelCnt 336730cfbc0SXuan Hu io.memIO.get.lsqEnqIO <> lsqEnqCtrl.io.enqLsq 337730cfbc0SXuan Hu} 338