1730cfbc0SXuan Hupackage xiangshan.backend.issue 2730cfbc0SXuan Hu 383ba63b3SXuan Huimport org.chipsalliance.cde.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 { 231ca4a39dSXuan Hu override def shouldBeInlined: Boolean = false 241ca4a39dSXuan Hu 2539c59369SXuan Hu val numIntStateWrite = backendParams.numPregWb(IntData()) 2639c59369SXuan Hu val numVfStateWrite = backendParams.numPregWb(VecData()) 27730cfbc0SXuan Hu 28730cfbc0SXuan Hu val dispatch2Iq = LazyModule(new Dispatch2Iq(params)) 29730cfbc0SXuan Hu val issueQueue = params.issueBlockParams.map(x => LazyModule(new IssueQueue(x).suggestName(x.getIQName))) 30730cfbc0SXuan Hu 3183ba63b3SXuan Hu lazy val module: SchedulerImpBase = params.schdType match { 32730cfbc0SXuan Hu case IntScheduler() => new SchedulerArithImp(this)(params, p) 33730cfbc0SXuan Hu case MemScheduler() => new SchedulerMemImp(this)(params, p) 34730cfbc0SXuan Hu case VfScheduler() => new SchedulerArithImp(this)(params, p) 35730cfbc0SXuan Hu case _ => null 36730cfbc0SXuan Hu } 37730cfbc0SXuan Hu} 38730cfbc0SXuan Hu 397f8233d5SHaojin Tangclass SchedulerIO()(implicit params: SchdBlockParams, p: Parameters) extends XSBundle { 4068d13085SXuan Hu // params alias 417f8233d5SHaojin Tang private val LoadQueueSize = VirtualLoadQueueSize 4268d13085SXuan Hu 43730cfbc0SXuan Hu val fromTop = new Bundle { 44730cfbc0SXuan Hu val hartId = Input(UInt(8.W)) 45730cfbc0SXuan Hu } 462e0a7dc5Sfdy val fromWbFuBusyTable = new Bundle{ 472e0a7dc5Sfdy val fuBusyTableRead = MixedVec(params.issueBlockParams.map(x => Input(x.genWbFuBusyTableReadBundle))) 482e0a7dc5Sfdy } 49dd970561SzhanglyGit val wbFuBusyTable = MixedVec(params.issueBlockParams.map(x => Output(x.genWbFuBusyTableWriteBundle))) 50dd970561SzhanglyGit 51730cfbc0SXuan Hu val fromCtrlBlock = new Bundle { 52730cfbc0SXuan Hu val pcVec = Input(Vec(params.numPcReadPort, UInt(VAddrData().dataWidth.W))) 53730cfbc0SXuan Hu val flush = Flipped(ValidIO(new Redirect)) 54730cfbc0SXuan Hu } 55730cfbc0SXuan Hu val fromDispatch = new Bundle { 56730cfbc0SXuan Hu val allocPregs = Vec(RenameWidth, Input(new ResetPregStateReq)) 57730cfbc0SXuan Hu val uops = Vec(params.numUopIn, Flipped(DecoupledIO(new DynInst))) 58730cfbc0SXuan Hu } 5939c59369SXuan Hu val intWriteBack = MixedVec(Vec(backendParams.numPregWb(IntData()), 60730cfbc0SXuan Hu new RfWritePortWithConfig(backendParams.intPregParams.dataCfg, backendParams.intPregParams.addrWidth))) 6139c59369SXuan Hu val vfWriteBack = MixedVec(Vec(backendParams.numPregWb(VecData()), 62730cfbc0SXuan Hu new RfWritePortWithConfig(backendParams.vfPregParams.dataCfg, backendParams.vfPregParams.addrWidth))) 6310fe9778SXuan Hu val toDataPath: MixedVec[MixedVec[DecoupledIO[IssueQueueIssueBundle]]] = MixedVec(params.issueBlockParams.map(_.genIssueDecoupledBundle)) 6459ef6009Sxiaofeibao-xjtu val toDataPathAfterDelay: MixedVec[MixedVec[DecoupledIO[IssueQueueIssueBundle]]] = MixedVec(params.issueBlockParams.map(_.genIssueDecoupledBundle)) 6559ef6009Sxiaofeibao-xjtu val fromCancelNetwork = Flipped(MixedVec(params.issueBlockParams.map(_.genIssueDecoupledBundle))) 66730cfbc0SXuan Hu 67bf35baadSXuan Hu val fromSchedulers = new Bundle { 68c0be7f33SXuan Hu val wakeupVec: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpInValidBundle) 69bf35baadSXuan Hu } 70bf35baadSXuan Hu 71bf35baadSXuan Hu val toSchedulers = new Bundle { 72c0be7f33SXuan Hu val wakeupVec: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = params.genIQWakeUpOutValidBundle 73bf35baadSXuan Hu } 74bf35baadSXuan Hu 75c0be7f33SXuan Hu val fromDataPath = new Bundle { 7610fe9778SXuan Hu val resp: MixedVec[MixedVec[OGRespBundle]] = MixedVec(params.issueBlockParams.map(x => Flipped(x.genOGRespBundle))) 777a96cc7fSHaojin Tang val og0Cancel = Input(ExuOH(backendParams.numExu)) 78ea46c302SXuan Hu // Todo: remove this after no cancel signal from og1 797a96cc7fSHaojin Tang val og1Cancel = Input(ExuOH(backendParams.numExu)) 80bc7d6943SzhanglyGit val cancelToBusyTable = Vec(backendParams.numExu, Flipped(ValidIO(new CancelSignal))) 81c0be7f33SXuan Hu // just be compatible to old code 82c0be7f33SXuan Hu def apply(i: Int)(j: Int) = resp(i)(j) 83c0be7f33SXuan Hu } 84c0be7f33SXuan Hu 850f55a0d3SHaojin Tang val loadFinalIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.LduCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x))))))) 86e8800897SXuan Hu val memAddrIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.LduCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x))))))) 870f55a0d3SHaojin Tang 88*6810d1e8Ssfencevma val ldCancel = Vec(backendParams.LduCnt + backendParams.HyuCnt, Flipped(new LoadCancelIO)) 89c0be7f33SXuan Hu 90730cfbc0SXuan Hu val memIO = if (params.isMemSchd) Some(new Bundle { 91730cfbc0SXuan Hu val lsqEnqIO = Flipped(new LsqEnqIO) 92730cfbc0SXuan Hu }) else None 93730cfbc0SXuan Hu val fromMem = if (params.isMemSchd) Some(new Bundle { 947b753bebSXuan Hu val ldaFeedback = Flipped(Vec(params.LduCnt, new MemRSFeedbackIO)) 957b753bebSXuan Hu val staFeedback = Flipped(Vec(params.StaCnt, new MemRSFeedbackIO)) 968f1fa9b1Ssfencevma val hyuFeedback = Flipped(Vec(params.HyuCnt, new MemRSFeedbackIO)) 97730cfbc0SXuan Hu val stIssuePtr = Input(new SqPtr()) 98730cfbc0SXuan Hu val lcommit = Input(UInt(log2Up(CommitWidth + 1).W)) 99730cfbc0SXuan Hu val scommit = Input(UInt(log2Ceil(EnsbufferWidth + 1).W)) // connected to `memBlock.io.sqDeq` instead of ROB 100730cfbc0SXuan Hu // from lsq 101730cfbc0SXuan Hu val lqCancelCnt = Input(UInt(log2Up(LoadQueueSize + 1).W)) 102730cfbc0SXuan Hu val sqCancelCnt = Input(UInt(log2Up(StoreQueueSize + 1).W)) 103730cfbc0SXuan Hu val memWaitUpdateReq = Flipped(new MemWaitUpdateReq) 104730cfbc0SXuan Hu }) else None 105730cfbc0SXuan Hu val toMem = if (params.isMemSchd) Some(new Bundle { 106730cfbc0SXuan Hu val loadFastMatch = Output(Vec(params.LduCnt, new IssueQueueLoadBundle)) 107730cfbc0SXuan Hu }) else None 108730cfbc0SXuan Hu} 109730cfbc0SXuan Hu 110730cfbc0SXuan Huabstract class SchedulerImpBase(wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters) 111730cfbc0SXuan Hu extends LazyModuleImp(wrapper) 112730cfbc0SXuan Hu with HasXSParameter 113730cfbc0SXuan Hu{ 114730cfbc0SXuan Hu val io = IO(new SchedulerIO()) 115730cfbc0SXuan Hu 116730cfbc0SXuan Hu // alias 117c0be7f33SXuan Hu private val iqWakeUpInMap: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] = 118c0be7f33SXuan Hu io.fromSchedulers.wakeupVec.map(x => (x.bits.exuIdx, x)).toMap 119730cfbc0SXuan Hu private val schdType = params.schdType 120730cfbc0SXuan Hu 121730cfbc0SXuan Hu // Modules 122730cfbc0SXuan Hu val dispatch2Iq: Dispatch2IqImp = wrapper.dispatch2Iq.module 123730cfbc0SXuan Hu val issueQueues: Seq[IssueQueueImp] = wrapper.issueQueue.map(_.module) 124730cfbc0SXuan Hu 125730cfbc0SXuan Hu // BusyTable Modules 126730cfbc0SXuan Hu val intBusyTable = schdType match { 127bc7d6943SzhanglyGit case IntScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numIntStateRead, wrapper.numIntStateWrite, IntPhyRegs, IntWB()))) 128730cfbc0SXuan Hu case _ => None 129730cfbc0SXuan Hu } 130730cfbc0SXuan Hu 131730cfbc0SXuan Hu val vfBusyTable = schdType match { 132bc7d6943SzhanglyGit case VfScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numVfStateRead, wrapper.numVfStateWrite, VfPhyRegs, VfWB()))) 133730cfbc0SXuan Hu case _ => None 134730cfbc0SXuan Hu } 135730cfbc0SXuan Hu 136730cfbc0SXuan Hu dispatch2Iq.io match { case dp2iq => 137730cfbc0SXuan Hu dp2iq.redirect <> io.fromCtrlBlock.flush 138730cfbc0SXuan Hu dp2iq.in <> io.fromDispatch.uops 139730cfbc0SXuan Hu dp2iq.readIntState.foreach(_ <> intBusyTable.get.io.read) 140730cfbc0SXuan Hu dp2iq.readVfState.foreach(_ <> vfBusyTable.get.io.read) 141730cfbc0SXuan Hu } 142730cfbc0SXuan Hu 143730cfbc0SXuan Hu intBusyTable match { 144730cfbc0SXuan Hu case Some(bt) => 145730cfbc0SXuan Hu bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) => 146730cfbc0SXuan Hu btAllocPregs.valid := dpAllocPregs.isInt 147730cfbc0SXuan Hu btAllocPregs.bits := dpAllocPregs.preg 148730cfbc0SXuan Hu } 149730cfbc0SXuan Hu bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) => 150730cfbc0SXuan Hu wb.valid := io.intWriteBack(i).wen && io.intWriteBack(i).intWen 151730cfbc0SXuan Hu wb.bits := io.intWriteBack(i).addr 152730cfbc0SXuan Hu } 153bc7d6943SzhanglyGit bt.io.wakeUp := io.fromSchedulers.wakeupVec 154bc7d6943SzhanglyGit bt.io.cancel := io.fromDataPath.cancelToBusyTable 155730cfbc0SXuan Hu case None => 156730cfbc0SXuan Hu } 157730cfbc0SXuan Hu 158730cfbc0SXuan Hu vfBusyTable match { 159730cfbc0SXuan Hu case Some(bt) => 160730cfbc0SXuan Hu bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) => 161730cfbc0SXuan Hu btAllocPregs.valid := dpAllocPregs.isFp 162730cfbc0SXuan Hu btAllocPregs.bits := dpAllocPregs.preg 163730cfbc0SXuan Hu } 164730cfbc0SXuan Hu bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) => 165730cfbc0SXuan Hu wb.valid := io.vfWriteBack(i).wen && (io.vfWriteBack(i).fpWen || io.vfWriteBack(i).vecWen) 166730cfbc0SXuan Hu wb.bits := io.vfWriteBack(i).addr 167730cfbc0SXuan Hu } 168bc7d6943SzhanglyGit bt.io.wakeUp := io.fromSchedulers.wakeupVec 169bc7d6943SzhanglyGit bt.io.cancel := io.fromDataPath.cancelToBusyTable 170730cfbc0SXuan Hu case None => 171730cfbc0SXuan Hu } 172730cfbc0SXuan Hu 173c0be7f33SXuan Hu val wakeupFromWBVec = Wire(params.genWBWakeUpSinkValidBundle) 174730cfbc0SXuan Hu val writeback = params.schdType match { 175730cfbc0SXuan Hu case IntScheduler() => io.intWriteBack 176730cfbc0SXuan Hu case MemScheduler() => io.intWriteBack ++ io.vfWriteBack 177730cfbc0SXuan Hu case VfScheduler() => io.vfWriteBack 178730cfbc0SXuan Hu case _ => Seq() 179730cfbc0SXuan Hu } 180730cfbc0SXuan Hu wakeupFromWBVec.zip(writeback).foreach { case (sink, source) => 181730cfbc0SXuan Hu sink.valid := source.wen 182730cfbc0SXuan Hu sink.bits.rfWen := source.intWen 183730cfbc0SXuan Hu sink.bits.fpWen := source.fpWen 184730cfbc0SXuan Hu sink.bits.vecWen := source.vecWen 185730cfbc0SXuan Hu sink.bits.pdest := source.addr 186730cfbc0SXuan Hu } 187730cfbc0SXuan Hu 188bf35baadSXuan Hu // Connect bundles having the same wakeup source 18959ef6009Sxiaofeibao-xjtu issueQueues.zipWithIndex.foreach { case(iq, i) => 190bf35baadSXuan Hu iq.io.wakeupFromIQ.foreach { wakeUp => 191c0be7f33SXuan Hu wakeUp := iqWakeUpInMap(wakeUp.bits.exuIdx) 192bf35baadSXuan Hu } 193ea46c302SXuan Hu iq.io.og0Cancel := io.fromDataPath.og0Cancel 194ea46c302SXuan Hu iq.io.og1Cancel := io.fromDataPath.og1Cancel 1950f55a0d3SHaojin Tang iq.io.ldCancel := io.ldCancel 19659ef6009Sxiaofeibao-xjtu iq.io.fromCancelNetwork <> io.fromCancelNetwork(i) 197bf35baadSXuan Hu } 198bf35baadSXuan Hu 199c0be7f33SXuan Hu private val iqWakeUpOutMap: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] = 200bf35baadSXuan Hu issueQueues.flatMap(_.io.wakeupToIQ) 201c0be7f33SXuan Hu .map(x => (x.bits.exuIdx, x)) 202bf35baadSXuan Hu .toMap 203bf35baadSXuan Hu 204bf35baadSXuan Hu // Connect bundles having the same wakeup source 205bf35baadSXuan Hu io.toSchedulers.wakeupVec.foreach { wakeUp => 206c0be7f33SXuan Hu wakeUp := iqWakeUpOutMap(wakeUp.bits.exuIdx) 207bf35baadSXuan Hu } 208bf35baadSXuan Hu 209730cfbc0SXuan Hu io.toDataPath.zipWithIndex.foreach { case (toDp, i) => 210730cfbc0SXuan Hu toDp <> issueQueues(i).io.deq 211730cfbc0SXuan Hu } 21259ef6009Sxiaofeibao-xjtu io.toDataPathAfterDelay.zipWithIndex.foreach { case (toDpDy, i) => 21359ef6009Sxiaofeibao-xjtu toDpDy <> issueQueues(i).io.deqDelay 21459ef6009Sxiaofeibao-xjtu } 215bf35baadSXuan Hu 216f99b81adSHaojin Tang // Response 217f99b81adSHaojin Tang issueQueues.zipWithIndex.foreach { case (iq, i) => 218f99b81adSHaojin Tang iq.io.deqResp.zipWithIndex.foreach { case (deqResp, j) => 219f99b81adSHaojin Tang deqResp.valid := iq.io.deq(j).valid && io.toDataPath(i)(j).ready 220f99b81adSHaojin Tang deqResp.bits.respType := RSFeedbackType.issueSuccess 221f99b81adSHaojin Tang deqResp.bits.robIdx := iq.io.deq(j).bits.common.robIdx 222f99b81adSHaojin Tang deqResp.bits.dataInvalidSqIdx := DontCare 223f99b81adSHaojin Tang deqResp.bits.rfWen := iq.io.deq(j).bits.common.rfWen.getOrElse(false.B) 224f99b81adSHaojin Tang deqResp.bits.fuType := iq.io.deq(j).bits.common.fuType 225f99b81adSHaojin Tang } 226f99b81adSHaojin Tang iq.io.og0Resp.zipWithIndex.foreach { case (og0Resp, j) => 227f99b81adSHaojin Tang og0Resp := io.fromDataPath(i)(j).og0resp 228f99b81adSHaojin Tang } 229f99b81adSHaojin Tang iq.io.og1Resp.zipWithIndex.foreach { case (og1Resp, j) => 230f99b81adSHaojin Tang og1Resp := io.fromDataPath(i)(j).og1resp 231f99b81adSHaojin Tang } 232f99b81adSHaojin Tang iq.io.finalIssueResp.foreach(_.zipWithIndex.foreach { case (finalIssueResp, j) => 233f99b81adSHaojin Tang finalIssueResp := io.loadFinalIssueResp(i)(j) 234f99b81adSHaojin Tang }) 235e8800897SXuan Hu iq.io.memAddrIssueResp.foreach(_.zipWithIndex.foreach { case (memAddrIssueResp, j) => 236e8800897SXuan Hu memAddrIssueResp := io.memAddrIssueResp(i)(j) 237e8800897SXuan Hu }) 238f99b81adSHaojin Tang iq.io.wbBusyTableRead := io.fromWbFuBusyTable.fuBusyTableRead(i) 239f99b81adSHaojin Tang io.wbFuBusyTable(i) := iq.io.wbBusyTableWrite 240f99b81adSHaojin Tang } 241f99b81adSHaojin Tang 242c0be7f33SXuan Hu println(s"[Scheduler] io.fromSchedulers.wakeupVec: ${io.fromSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}") 243bf35baadSXuan Hu println(s"[Scheduler] iqWakeUpInKeys: ${iqWakeUpInMap.keys}") 244bf35baadSXuan Hu 245bf35baadSXuan Hu println(s"[Scheduler] iqWakeUpOutKeys: ${iqWakeUpOutMap.keys}") 246c0be7f33SXuan Hu println(s"[Scheduler] io.toSchedulers.wakeupVec: ${io.toSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}") 247730cfbc0SXuan Hu} 248730cfbc0SXuan Hu 249730cfbc0SXuan Huclass SchedulerArithImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters) 250730cfbc0SXuan Hu extends SchedulerImpBase(wrapper) 251730cfbc0SXuan Hu with HasXSParameter 252730cfbc0SXuan Hu{ 2532e0a7dc5Sfdy// dontTouch(io.vfWbFuBusyTable) 254730cfbc0SXuan Hu println(s"[SchedulerArithImp] " + 255730cfbc0SXuan Hu s"has intBusyTable: ${intBusyTable.nonEmpty}, " + 256730cfbc0SXuan Hu s"has vfBusyTable: ${vfBusyTable.nonEmpty}") 257730cfbc0SXuan Hu 258730cfbc0SXuan Hu issueQueues.zipWithIndex.foreach { case (iq, i) => 259730cfbc0SXuan Hu iq.io.flush <> io.fromCtrlBlock.flush 260730cfbc0SXuan Hu iq.io.enq <> dispatch2Iq.io.out(i) 261bf35baadSXuan Hu iq.io.wakeupFromWB := wakeupFromWBVec 262730cfbc0SXuan Hu } 263730cfbc0SXuan Hu} 264730cfbc0SXuan Hu 265f99b81adSHaojin Tang// FIXME: Vector mem instructions may not be handled properly! 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) 2788f1fa9b1Ssfencevma val hyuIQs = issueQueues.filter(iq => iq.params.HyuCnt > 0) 279730cfbc0SXuan Hu require(memAddrIQs.nonEmpty && stDataIQs.nonEmpty) 280730cfbc0SXuan Hu 281853cd2d8SHaojin Tang io.toMem.get.loadFastMatch := 0.U.asTypeOf(io.toMem.get.loadFastMatch) // TODO: is still needed? 282853cd2d8SHaojin Tang 283730cfbc0SXuan Hu memAddrIQs.zipWithIndex.foreach { case (iq, i) => 284730cfbc0SXuan Hu iq.io.flush <> io.fromCtrlBlock.flush 285730cfbc0SXuan Hu iq.io.enq <> dispatch2Iq.io.out(i) 286bf35baadSXuan Hu iq.io.wakeupFromWB := wakeupFromWBVec 287730cfbc0SXuan Hu } 288730cfbc0SXuan Hu 2897b753bebSXuan Hu ldAddrIQs.foreach { 290de784418SXuan Hu case imp: IssueQueueMemAddrImp => 291de784418SXuan Hu imp.io.memIO.get.feedbackIO <> io.fromMem.get.ldaFeedback 292c14e89f4SHaojin Tang imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr 293de784418SXuan Hu imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 2947b753bebSXuan Hu case _ => 2957b753bebSXuan Hu } 2967b753bebSXuan Hu 2977b753bebSXuan Hu stAddrIQs.foreach { 298c14e89f4SHaojin Tang case imp: IssueQueueMemAddrImp => 299c14e89f4SHaojin Tang imp.io.memIO.get.feedbackIO <> io.fromMem.get.staFeedback 300c14e89f4SHaojin Tang imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr 301c14e89f4SHaojin Tang imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 3027b753bebSXuan Hu case _ => 3037b753bebSXuan Hu } 304730cfbc0SXuan Hu 3058f1fa9b1Ssfencevma hyuIQs.foreach { 3068f1fa9b1Ssfencevma case imp: IssueQueueMemAddrImp => 3078f1fa9b1Ssfencevma imp.io.memIO.get.feedbackIO <> io.fromMem.get.hyuFeedback 3088f1fa9b1Ssfencevma imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr 3098f1fa9b1Ssfencevma imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 3108f1fa9b1Ssfencevma case _ => 3118f1fa9b1Ssfencevma } 3128f1fa9b1Ssfencevma 313166eb00dSHaojin Tang // TODO: Implement vstu 314166eb00dSHaojin Tang issueQueues.filter(iq => iq.params.VstuCnt > 0).foreach { 315166eb00dSHaojin Tang case imp: IssueQueueMemAddrImp => 316166eb00dSHaojin Tang imp.io.memIO.get.feedbackIO <> DontCare 317166eb00dSHaojin Tang imp.io.memIO.get.checkWait.stIssuePtr := DontCare 318166eb00dSHaojin Tang imp.io.memIO.get.checkWait.memWaitUpdateReq := DontCare 319166eb00dSHaojin Tang case _ => 320166eb00dSHaojin Tang } 321166eb00dSHaojin Tang 322166eb00dSHaojin Tang // TODO: Implement vldu 323166eb00dSHaojin Tang issueQueues.filter(iq => iq.params.VlduCnt > 0).foreach { 324166eb00dSHaojin Tang case imp: IssueQueueMemAddrImp => 325166eb00dSHaojin Tang imp.io.memIO.get.feedbackIO <> DontCare 326166eb00dSHaojin Tang imp.io.memIO.get.checkWait.stIssuePtr := DontCare 327166eb00dSHaojin Tang imp.io.memIO.get.checkWait.memWaitUpdateReq := DontCare 328166eb00dSHaojin Tang case _ => 329166eb00dSHaojin Tang } 330166eb00dSHaojin Tang 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) 357bc7d6943SzhanglyGit stdIQEnq.bits.dataSource(0) := staIQEnq.bits.dataSource(1) 358bc7d6943SzhanglyGit stdIQEnq.bits.l1ExuOH(0) := staIQEnq.bits.l1ExuOH(1) 359730cfbc0SXuan Hu stdIQEnq.bits.psrc(0) := staIQEnq.bits.psrc(1) 360730cfbc0SXuan Hu stdIQEnq.bits.sqIdx := staIQEnq.bits.sqIdx 361730cfbc0SXuan Hu } 362bf35baadSXuan Hu stdIQ.io.wakeupFromWB := wakeupFromWBVec 363730cfbc0SXuan Hu } 364730cfbc0SXuan Hu 365730cfbc0SXuan Hu val lsqEnqCtrl = Module(new LsqEnqCtrl) 366730cfbc0SXuan Hu 367730cfbc0SXuan Hu lsqEnqCtrl.io.redirect <> io.fromCtrlBlock.flush 368730cfbc0SXuan Hu lsqEnqCtrl.io.enq <> dispatch2Iq.io.enqLsqIO.get 369730cfbc0SXuan Hu lsqEnqCtrl.io.lcommit := io.fromMem.get.lcommit 370730cfbc0SXuan Hu lsqEnqCtrl.io.scommit := io.fromMem.get.scommit 371730cfbc0SXuan Hu lsqEnqCtrl.io.lqCancelCnt := io.fromMem.get.lqCancelCnt 372730cfbc0SXuan Hu lsqEnqCtrl.io.sqCancelCnt := io.fromMem.get.sqCancelCnt 373730cfbc0SXuan Hu io.memIO.get.lsqEnqIO <> lsqEnqCtrl.io.enqLsq 374730cfbc0SXuan Hu} 375