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 { 23*1ca4a39dSXuan Hu override def shouldBeInlined: Boolean = false 24*1ca4a39dSXuan 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))) 77ea46c302SXuan Hu val og0Cancel = Input(ExuVec(backendParams.numExu)) 78ea46c302SXuan Hu // Todo: remove this after no cancel signal from og1 79ea46c302SXuan Hu val og1Cancel = Input(ExuVec(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))))))) 860f55a0d3SHaojin Tang 870f55a0d3SHaojin Tang val ldCancel = Vec(backendParams.LduCnt, Flipped(new LoadCancelIO)) 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 { 125bc7d6943SzhanglyGit case IntScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numIntStateRead, wrapper.numIntStateWrite, IntPhyRegs, IntWB()))) 126730cfbc0SXuan Hu case _ => None 127730cfbc0SXuan Hu } 128730cfbc0SXuan Hu 129730cfbc0SXuan Hu val vfBusyTable = schdType match { 130bc7d6943SzhanglyGit case VfScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numVfStateRead, wrapper.numVfStateWrite, VfPhyRegs, VfWB()))) 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 } 151bc7d6943SzhanglyGit bt.io.wakeUp := io.fromSchedulers.wakeupVec 152bc7d6943SzhanglyGit bt.io.cancel := io.fromDataPath.cancelToBusyTable 153730cfbc0SXuan Hu case None => 154730cfbc0SXuan Hu } 155730cfbc0SXuan Hu 156730cfbc0SXuan Hu vfBusyTable match { 157730cfbc0SXuan Hu case Some(bt) => 158730cfbc0SXuan Hu bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) => 159730cfbc0SXuan Hu btAllocPregs.valid := dpAllocPregs.isFp 160730cfbc0SXuan Hu btAllocPregs.bits := dpAllocPregs.preg 161730cfbc0SXuan Hu } 162730cfbc0SXuan Hu bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) => 163730cfbc0SXuan Hu wb.valid := io.vfWriteBack(i).wen && (io.vfWriteBack(i).fpWen || io.vfWriteBack(i).vecWen) 164730cfbc0SXuan Hu wb.bits := io.vfWriteBack(i).addr 165730cfbc0SXuan Hu } 166bc7d6943SzhanglyGit bt.io.wakeUp := io.fromSchedulers.wakeupVec 167bc7d6943SzhanglyGit bt.io.cancel := io.fromDataPath.cancelToBusyTable 168730cfbc0SXuan Hu case None => 169730cfbc0SXuan Hu } 170730cfbc0SXuan Hu 171c0be7f33SXuan Hu val wakeupFromWBVec = Wire(params.genWBWakeUpSinkValidBundle) 172730cfbc0SXuan Hu val writeback = params.schdType match { 173730cfbc0SXuan Hu case IntScheduler() => io.intWriteBack 174730cfbc0SXuan Hu case MemScheduler() => io.intWriteBack ++ io.vfWriteBack 175730cfbc0SXuan Hu case VfScheduler() => io.vfWriteBack 176730cfbc0SXuan Hu case _ => Seq() 177730cfbc0SXuan Hu } 178730cfbc0SXuan Hu wakeupFromWBVec.zip(writeback).foreach { case (sink, source) => 179730cfbc0SXuan Hu sink.valid := source.wen 180730cfbc0SXuan Hu sink.bits.rfWen := source.intWen 181730cfbc0SXuan Hu sink.bits.fpWen := source.fpWen 182730cfbc0SXuan Hu sink.bits.vecWen := source.vecWen 183730cfbc0SXuan Hu sink.bits.pdest := source.addr 184730cfbc0SXuan Hu } 185730cfbc0SXuan Hu 186bf35baadSXuan Hu // Connect bundles having the same wakeup source 18759ef6009Sxiaofeibao-xjtu issueQueues.zipWithIndex.foreach { case(iq, i) => 188bf35baadSXuan Hu iq.io.wakeupFromIQ.foreach { wakeUp => 189c0be7f33SXuan Hu wakeUp := iqWakeUpInMap(wakeUp.bits.exuIdx) 190bf35baadSXuan Hu } 191ea46c302SXuan Hu iq.io.og0Cancel := io.fromDataPath.og0Cancel 192ea46c302SXuan Hu iq.io.og1Cancel := io.fromDataPath.og1Cancel 1930f55a0d3SHaojin Tang iq.io.ldCancel := io.ldCancel 19459ef6009Sxiaofeibao-xjtu iq.io.fromCancelNetwork <> io.fromCancelNetwork(i) 195bf35baadSXuan Hu } 196bf35baadSXuan Hu 197c0be7f33SXuan Hu private val iqWakeUpOutMap: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] = 198bf35baadSXuan Hu issueQueues.flatMap(_.io.wakeupToIQ) 199c0be7f33SXuan Hu .map(x => (x.bits.exuIdx, x)) 200bf35baadSXuan Hu .toMap 201bf35baadSXuan Hu 202bf35baadSXuan Hu // Connect bundles having the same wakeup source 203bf35baadSXuan Hu io.toSchedulers.wakeupVec.foreach { wakeUp => 204c0be7f33SXuan Hu wakeUp := iqWakeUpOutMap(wakeUp.bits.exuIdx) 205bf35baadSXuan Hu } 206bf35baadSXuan Hu 207730cfbc0SXuan Hu io.toDataPath.zipWithIndex.foreach { case (toDp, i) => 208730cfbc0SXuan Hu toDp <> issueQueues(i).io.deq 209730cfbc0SXuan Hu } 21059ef6009Sxiaofeibao-xjtu io.toDataPathAfterDelay.zipWithIndex.foreach { case (toDpDy, i) => 21159ef6009Sxiaofeibao-xjtu toDpDy <> issueQueues(i).io.deqDelay 21259ef6009Sxiaofeibao-xjtu } 213bf35baadSXuan Hu 214f99b81adSHaojin Tang // Response 215f99b81adSHaojin Tang issueQueues.zipWithIndex.foreach { case (iq, i) => 216f99b81adSHaojin Tang iq.io.deqResp.zipWithIndex.foreach { case (deqResp, j) => 217f99b81adSHaojin Tang deqResp.valid := iq.io.deq(j).valid && io.toDataPath(i)(j).ready 218f99b81adSHaojin Tang deqResp.bits.respType := RSFeedbackType.issueSuccess 219f99b81adSHaojin Tang deqResp.bits.robIdx := iq.io.deq(j).bits.common.robIdx 220f99b81adSHaojin Tang deqResp.bits.dataInvalidSqIdx := DontCare 221f99b81adSHaojin Tang deqResp.bits.rfWen := iq.io.deq(j).bits.common.rfWen.getOrElse(false.B) 222f99b81adSHaojin Tang deqResp.bits.fuType := iq.io.deq(j).bits.common.fuType 223f99b81adSHaojin Tang } 224f99b81adSHaojin Tang iq.io.og0Resp.zipWithIndex.foreach { case (og0Resp, j) => 225f99b81adSHaojin Tang og0Resp := io.fromDataPath(i)(j).og0resp 226f99b81adSHaojin Tang } 227f99b81adSHaojin Tang iq.io.og1Resp.zipWithIndex.foreach { case (og1Resp, j) => 228f99b81adSHaojin Tang og1Resp := io.fromDataPath(i)(j).og1resp 229f99b81adSHaojin Tang } 230f99b81adSHaojin Tang iq.io.finalIssueResp.foreach(_.zipWithIndex.foreach { case (finalIssueResp, j) => 231f99b81adSHaojin Tang finalIssueResp := io.loadFinalIssueResp(i)(j) 232f99b81adSHaojin Tang }) 233f99b81adSHaojin Tang iq.io.wbBusyTableRead := io.fromWbFuBusyTable.fuBusyTableRead(i) 234f99b81adSHaojin Tang io.wbFuBusyTable(i) := iq.io.wbBusyTableWrite 235f99b81adSHaojin Tang } 236f99b81adSHaojin Tang 237c0be7f33SXuan Hu println(s"[Scheduler] io.fromSchedulers.wakeupVec: ${io.fromSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}") 238bf35baadSXuan Hu println(s"[Scheduler] iqWakeUpInKeys: ${iqWakeUpInMap.keys}") 239bf35baadSXuan Hu 240bf35baadSXuan Hu println(s"[Scheduler] iqWakeUpOutKeys: ${iqWakeUpOutMap.keys}") 241c0be7f33SXuan Hu println(s"[Scheduler] io.toSchedulers.wakeupVec: ${io.toSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}") 242730cfbc0SXuan Hu} 243730cfbc0SXuan Hu 244730cfbc0SXuan Huclass SchedulerArithImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters) 245730cfbc0SXuan Hu extends SchedulerImpBase(wrapper) 246730cfbc0SXuan Hu with HasXSParameter 247730cfbc0SXuan Hu{ 2482e0a7dc5Sfdy// dontTouch(io.vfWbFuBusyTable) 249730cfbc0SXuan Hu println(s"[SchedulerArithImp] " + 250730cfbc0SXuan Hu s"has intBusyTable: ${intBusyTable.nonEmpty}, " + 251730cfbc0SXuan Hu s"has vfBusyTable: ${vfBusyTable.nonEmpty}") 252730cfbc0SXuan Hu 253730cfbc0SXuan Hu issueQueues.zipWithIndex.foreach { case (iq, i) => 254730cfbc0SXuan Hu iq.io.flush <> io.fromCtrlBlock.flush 255730cfbc0SXuan Hu iq.io.enq <> dispatch2Iq.io.out(i) 256bf35baadSXuan Hu iq.io.wakeupFromWB := wakeupFromWBVec 257730cfbc0SXuan Hu } 258730cfbc0SXuan Hu} 259730cfbc0SXuan Hu 260f99b81adSHaojin Tang// FIXME: Vector mem instructions may not be handled properly! 261730cfbc0SXuan Huclass SchedulerMemImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters) 262730cfbc0SXuan Hu extends SchedulerImpBase(wrapper) 263730cfbc0SXuan Hu with HasXSParameter 264730cfbc0SXuan Hu{ 265730cfbc0SXuan Hu println(s"[SchedulerMemImp] " + 266730cfbc0SXuan Hu s"has intBusyTable: ${intBusyTable.nonEmpty}, " + 267730cfbc0SXuan Hu s"has vfBusyTable: ${vfBusyTable.nonEmpty}") 268730cfbc0SXuan Hu 269730cfbc0SXuan Hu val memAddrIQs = issueQueues.filter(iq => iq.params.StdCnt == 0) 270730cfbc0SXuan Hu val stAddrIQs = issueQueues.filter(iq => iq.params.StaCnt > 0) // included in memAddrIQs 2717b753bebSXuan Hu val ldAddrIQs = issueQueues.filter(iq => iq.params.LduCnt > 0) 272730cfbc0SXuan Hu val stDataIQs = issueQueues.filter(iq => iq.params.StdCnt > 0) 273730cfbc0SXuan Hu require(memAddrIQs.nonEmpty && stDataIQs.nonEmpty) 274730cfbc0SXuan Hu 275853cd2d8SHaojin Tang io.toMem.get.loadFastMatch := 0.U.asTypeOf(io.toMem.get.loadFastMatch) // TODO: is still needed? 276853cd2d8SHaojin Tang 277730cfbc0SXuan Hu memAddrIQs.zipWithIndex.foreach { case (iq, i) => 278730cfbc0SXuan Hu iq.io.flush <> io.fromCtrlBlock.flush 279730cfbc0SXuan Hu iq.io.enq <> dispatch2Iq.io.out(i) 280bf35baadSXuan Hu iq.io.wakeupFromWB := wakeupFromWBVec 281730cfbc0SXuan Hu } 282730cfbc0SXuan Hu 2837b753bebSXuan Hu ldAddrIQs.foreach { 284de784418SXuan Hu case imp: IssueQueueMemAddrImp => 285de784418SXuan Hu imp.io.memIO.get.feedbackIO <> io.fromMem.get.ldaFeedback 286c14e89f4SHaojin Tang imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr 287de784418SXuan Hu imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 2887b753bebSXuan Hu case _ => 2897b753bebSXuan Hu } 2907b753bebSXuan Hu 2917b753bebSXuan Hu stAddrIQs.foreach { 292c14e89f4SHaojin Tang case imp: IssueQueueMemAddrImp => 293c14e89f4SHaojin Tang imp.io.memIO.get.feedbackIO <> io.fromMem.get.staFeedback 294c14e89f4SHaojin Tang imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr 295c14e89f4SHaojin Tang imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 2967b753bebSXuan Hu case _ => 2977b753bebSXuan Hu } 298730cfbc0SXuan Hu 299166eb00dSHaojin Tang // TODO: Implement vstu 300166eb00dSHaojin Tang issueQueues.filter(iq => iq.params.VstuCnt > 0).foreach { 301166eb00dSHaojin Tang case imp: IssueQueueMemAddrImp => 302166eb00dSHaojin Tang imp.io.memIO.get.feedbackIO <> DontCare 303166eb00dSHaojin Tang imp.io.memIO.get.checkWait.stIssuePtr := DontCare 304166eb00dSHaojin Tang imp.io.memIO.get.checkWait.memWaitUpdateReq := DontCare 305166eb00dSHaojin Tang case _ => 306166eb00dSHaojin Tang } 307166eb00dSHaojin Tang 308166eb00dSHaojin Tang // TODO: Implement vldu 309166eb00dSHaojin Tang issueQueues.filter(iq => iq.params.VlduCnt > 0).foreach { 310166eb00dSHaojin Tang case imp: IssueQueueMemAddrImp => 311166eb00dSHaojin Tang imp.io.memIO.get.feedbackIO <> DontCare 312166eb00dSHaojin Tang imp.io.memIO.get.checkWait.stIssuePtr := DontCare 313166eb00dSHaojin Tang imp.io.memIO.get.checkWait.memWaitUpdateReq := DontCare 314166eb00dSHaojin Tang case _ => 315166eb00dSHaojin Tang } 316166eb00dSHaojin Tang 3179b258a00Sxgkiri private val staIdxSeq = issueQueues.filter(iq => iq.params.StaCnt > 0).map(iq => iq.params.idxInSchBlk) 3189b258a00Sxgkiri 3199b258a00Sxgkiri for ((idxInSchBlk, i) <- staIdxSeq.zipWithIndex) { 3209b258a00Sxgkiri dispatch2Iq.io.out(idxInSchBlk).zip(stAddrIQs(i).io.enq).zip(stDataIQs(i).io.enq).foreach{ case((di, staIQ), stdIQ) => 321730cfbc0SXuan Hu val isAllReady = staIQ.ready && stdIQ.ready 322730cfbc0SXuan Hu di.ready := isAllReady 323730cfbc0SXuan Hu staIQ.valid := di.valid && isAllReady 324730cfbc0SXuan Hu stdIQ.valid := di.valid && isAllReady 325730cfbc0SXuan Hu } 3269b258a00Sxgkiri } 327730cfbc0SXuan Hu 328730cfbc0SXuan Hu require(stAddrIQs.size == stDataIQs.size, s"number of store address IQs(${stAddrIQs.size}) " + 329730cfbc0SXuan Hu s"should be equal to number of data IQs(${stDataIQs})") 330730cfbc0SXuan Hu stDataIQs.zip(stAddrIQs).zipWithIndex.foreach { case ((stdIQ, staIQ), i) => 331730cfbc0SXuan Hu stdIQ.io.flush <> io.fromCtrlBlock.flush 332730cfbc0SXuan Hu 333730cfbc0SXuan Hu stdIQ.io.enq.zip(staIQ.io.enq).foreach { case (stdIQEnq, staIQEnq) => 334730cfbc0SXuan Hu stdIQEnq.bits := staIQEnq.bits 335730cfbc0SXuan Hu // Store data reuses store addr src(1) in dispatch2iq 336730cfbc0SXuan Hu // [dispatch2iq] --src*------src*(0)--> [staIQ] 337730cfbc0SXuan Hu // \ 338730cfbc0SXuan Hu // ---src*(1)--> [stdIQ] 339730cfbc0SXuan Hu // Since the src(1) of sta is easier to get, stdIQEnq.bits.src*(0) is assigned to staIQEnq.bits.src*(1) 340730cfbc0SXuan Hu // instead of dispatch2Iq.io.out(x).bits.src*(1) 341730cfbc0SXuan Hu stdIQEnq.bits.srcState(0) := staIQEnq.bits.srcState(1) 342730cfbc0SXuan Hu stdIQEnq.bits.srcType(0) := staIQEnq.bits.srcType(1) 343bc7d6943SzhanglyGit stdIQEnq.bits.dataSource(0) := staIQEnq.bits.dataSource(1) 344bc7d6943SzhanglyGit stdIQEnq.bits.l1ExuOH(0) := staIQEnq.bits.l1ExuOH(1) 345730cfbc0SXuan Hu stdIQEnq.bits.psrc(0) := staIQEnq.bits.psrc(1) 346730cfbc0SXuan Hu stdIQEnq.bits.sqIdx := staIQEnq.bits.sqIdx 347730cfbc0SXuan Hu } 348bf35baadSXuan Hu stdIQ.io.wakeupFromWB := wakeupFromWBVec 349730cfbc0SXuan Hu } 350730cfbc0SXuan Hu 351730cfbc0SXuan Hu val lsqEnqCtrl = Module(new LsqEnqCtrl) 352730cfbc0SXuan Hu 353730cfbc0SXuan Hu lsqEnqCtrl.io.redirect <> io.fromCtrlBlock.flush 354730cfbc0SXuan Hu lsqEnqCtrl.io.enq <> dispatch2Iq.io.enqLsqIO.get 355730cfbc0SXuan Hu lsqEnqCtrl.io.lcommit := io.fromMem.get.lcommit 356730cfbc0SXuan Hu lsqEnqCtrl.io.scommit := io.fromMem.get.scommit 357730cfbc0SXuan Hu lsqEnqCtrl.io.lqCancelCnt := io.fromMem.get.lqCancelCnt 358730cfbc0SXuan Hu lsqEnqCtrl.io.sqCancelCnt := io.fromMem.get.sqCancelCnt 359730cfbc0SXuan Hu io.memIO.get.lsqEnqIO <> lsqEnqCtrl.io.enqLsq 360730cfbc0SXuan Hu} 361