1730cfbc0SXuan Hupackage xiangshan.backend.issue 2730cfbc0SXuan Hu 3*83ba63b3SXuan 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 { 2339c59369SXuan Hu val numIntStateWrite = backendParams.numPregWb(IntData()) 2439c59369SXuan 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 29*83ba63b3SXuan Hu lazy val module: SchedulerImpBase = 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 377f8233d5SHaojin Tangclass SchedulerIO()(implicit params: SchdBlockParams, p: Parameters) extends XSBundle { 3868d13085SXuan Hu // params alias 397f8233d5SHaojin Tang private val LoadQueueSize = VirtualLoadQueueSize 4068d13085SXuan Hu 41730cfbc0SXuan Hu val fromTop = new Bundle { 42730cfbc0SXuan Hu val hartId = Input(UInt(8.W)) 43730cfbc0SXuan Hu } 442e0a7dc5Sfdy val fromWbFuBusyTable = new Bundle{ 452e0a7dc5Sfdy val fuBusyTableRead = MixedVec(params.issueBlockParams.map(x => Input(x.genWbFuBusyTableReadBundle))) 462e0a7dc5Sfdy } 47dd970561SzhanglyGit val wbFuBusyTable = MixedVec(params.issueBlockParams.map(x => Output(x.genWbFuBusyTableWriteBundle))) 48dd970561SzhanglyGit 49730cfbc0SXuan Hu val fromCtrlBlock = new Bundle { 50730cfbc0SXuan Hu val pcVec = 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 } 5739c59369SXuan Hu val intWriteBack = MixedVec(Vec(backendParams.numPregWb(IntData()), 58730cfbc0SXuan Hu new RfWritePortWithConfig(backendParams.intPregParams.dataCfg, backendParams.intPregParams.addrWidth))) 5939c59369SXuan Hu val vfWriteBack = MixedVec(Vec(backendParams.numPregWb(VecData()), 60730cfbc0SXuan Hu new RfWritePortWithConfig(backendParams.vfPregParams.dataCfg, backendParams.vfPregParams.addrWidth))) 6110fe9778SXuan Hu val toDataPath: MixedVec[MixedVec[DecoupledIO[IssueQueueIssueBundle]]] = MixedVec(params.issueBlockParams.map(_.genIssueDecoupledBundle)) 6259ef6009Sxiaofeibao-xjtu val toDataPathAfterDelay: MixedVec[MixedVec[DecoupledIO[IssueQueueIssueBundle]]] = MixedVec(params.issueBlockParams.map(_.genIssueDecoupledBundle)) 6359ef6009Sxiaofeibao-xjtu val fromCancelNetwork = Flipped(MixedVec(params.issueBlockParams.map(_.genIssueDecoupledBundle))) 64730cfbc0SXuan Hu 65bf35baadSXuan Hu val fromSchedulers = new Bundle { 66c0be7f33SXuan Hu val wakeupVec: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpInValidBundle) 67bf35baadSXuan Hu } 68bf35baadSXuan Hu 69bf35baadSXuan Hu val toSchedulers = new Bundle { 70c0be7f33SXuan Hu val wakeupVec: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = params.genIQWakeUpOutValidBundle 71bf35baadSXuan Hu } 72bf35baadSXuan Hu 73c0be7f33SXuan Hu val fromDataPath = new Bundle { 7410fe9778SXuan Hu val resp: MixedVec[MixedVec[OGRespBundle]] = MixedVec(params.issueBlockParams.map(x => Flipped(x.genOGRespBundle))) 75ea46c302SXuan Hu val og0Cancel = Input(ExuVec(backendParams.numExu)) 76ea46c302SXuan Hu // Todo: remove this after no cancel signal from og1 77ea46c302SXuan Hu val og1Cancel = Input(ExuVec(backendParams.numExu)) 78bc7d6943SzhanglyGit val cancelToBusyTable = Vec(backendParams.numExu, Flipped(ValidIO(new CancelSignal))) 79c0be7f33SXuan Hu // just be compatible to old code 80c0be7f33SXuan Hu def apply(i: Int)(j: Int) = resp(i)(j) 81c0be7f33SXuan Hu } 82c0be7f33SXuan Hu 830f55a0d3SHaojin Tang val loadFinalIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.LduCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x))))))) 840f55a0d3SHaojin Tang 850f55a0d3SHaojin Tang val ldCancel = Vec(backendParams.LduCnt, Flipped(new LoadCancelIO)) 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 117730cfbc0SXuan Hu // Modules 118730cfbc0SXuan Hu val dispatch2Iq: Dispatch2IqImp = wrapper.dispatch2Iq.module 119730cfbc0SXuan Hu val issueQueues: Seq[IssueQueueImp] = wrapper.issueQueue.map(_.module) 120730cfbc0SXuan Hu 121730cfbc0SXuan Hu // BusyTable Modules 122730cfbc0SXuan Hu val intBusyTable = schdType match { 123bc7d6943SzhanglyGit case IntScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numIntStateRead, wrapper.numIntStateWrite, IntPhyRegs, IntWB()))) 124730cfbc0SXuan Hu case _ => None 125730cfbc0SXuan Hu } 126730cfbc0SXuan Hu 127730cfbc0SXuan Hu val vfBusyTable = schdType match { 128bc7d6943SzhanglyGit case VfScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numVfStateRead, wrapper.numVfStateWrite, VfPhyRegs, VfWB()))) 129730cfbc0SXuan Hu case _ => None 130730cfbc0SXuan Hu } 131730cfbc0SXuan Hu 132730cfbc0SXuan Hu dispatch2Iq.io match { case dp2iq => 133730cfbc0SXuan Hu dp2iq.redirect <> io.fromCtrlBlock.flush 134730cfbc0SXuan Hu dp2iq.in <> io.fromDispatch.uops 135730cfbc0SXuan Hu dp2iq.readIntState.foreach(_ <> intBusyTable.get.io.read) 136730cfbc0SXuan Hu dp2iq.readVfState.foreach(_ <> vfBusyTable.get.io.read) 137730cfbc0SXuan Hu } 138730cfbc0SXuan Hu 139730cfbc0SXuan Hu intBusyTable match { 140730cfbc0SXuan Hu case Some(bt) => 141730cfbc0SXuan Hu bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) => 142730cfbc0SXuan Hu btAllocPregs.valid := dpAllocPregs.isInt 143730cfbc0SXuan Hu btAllocPregs.bits := dpAllocPregs.preg 144730cfbc0SXuan Hu } 145730cfbc0SXuan Hu bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) => 146730cfbc0SXuan Hu wb.valid := io.intWriteBack(i).wen && io.intWriteBack(i).intWen 147730cfbc0SXuan Hu wb.bits := io.intWriteBack(i).addr 148730cfbc0SXuan Hu } 149bc7d6943SzhanglyGit bt.io.wakeUp := io.fromSchedulers.wakeupVec 150bc7d6943SzhanglyGit bt.io.cancel := io.fromDataPath.cancelToBusyTable 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 } 164bc7d6943SzhanglyGit bt.io.wakeUp := io.fromSchedulers.wakeupVec 165bc7d6943SzhanglyGit bt.io.cancel := io.fromDataPath.cancelToBusyTable 166730cfbc0SXuan Hu case None => 167730cfbc0SXuan Hu } 168730cfbc0SXuan Hu 169c0be7f33SXuan Hu val wakeupFromWBVec = Wire(params.genWBWakeUpSinkValidBundle) 170730cfbc0SXuan Hu val writeback = params.schdType match { 171730cfbc0SXuan Hu case IntScheduler() => io.intWriteBack 172730cfbc0SXuan Hu case MemScheduler() => io.intWriteBack ++ io.vfWriteBack 173730cfbc0SXuan Hu case VfScheduler() => io.vfWriteBack 174730cfbc0SXuan Hu case _ => Seq() 175730cfbc0SXuan Hu } 176730cfbc0SXuan Hu wakeupFromWBVec.zip(writeback).foreach { case (sink, source) => 177730cfbc0SXuan Hu sink.valid := source.wen 178730cfbc0SXuan Hu sink.bits.rfWen := source.intWen 179730cfbc0SXuan Hu sink.bits.fpWen := source.fpWen 180730cfbc0SXuan Hu sink.bits.vecWen := source.vecWen 181730cfbc0SXuan Hu sink.bits.pdest := source.addr 182730cfbc0SXuan Hu } 183730cfbc0SXuan Hu 184bf35baadSXuan Hu // Connect bundles having the same wakeup source 18559ef6009Sxiaofeibao-xjtu issueQueues.zipWithIndex.foreach { case(iq, i) => 186bf35baadSXuan Hu iq.io.wakeupFromIQ.foreach { wakeUp => 187c0be7f33SXuan Hu wakeUp := iqWakeUpInMap(wakeUp.bits.exuIdx) 188bf35baadSXuan Hu } 189ea46c302SXuan Hu iq.io.og0Cancel := io.fromDataPath.og0Cancel 190ea46c302SXuan Hu iq.io.og1Cancel := io.fromDataPath.og1Cancel 1910f55a0d3SHaojin Tang iq.io.ldCancel := io.ldCancel 19259ef6009Sxiaofeibao-xjtu iq.io.fromCancelNetwork <> io.fromCancelNetwork(i) 193bf35baadSXuan Hu } 194bf35baadSXuan Hu 195c0be7f33SXuan Hu private val iqWakeUpOutMap: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] = 196bf35baadSXuan Hu issueQueues.flatMap(_.io.wakeupToIQ) 197c0be7f33SXuan Hu .map(x => (x.bits.exuIdx, x)) 198bf35baadSXuan Hu .toMap 199bf35baadSXuan Hu 200bf35baadSXuan Hu // Connect bundles having the same wakeup source 201bf35baadSXuan Hu io.toSchedulers.wakeupVec.foreach { wakeUp => 202c0be7f33SXuan Hu wakeUp := iqWakeUpOutMap(wakeUp.bits.exuIdx) 203bf35baadSXuan Hu } 204bf35baadSXuan Hu 205730cfbc0SXuan Hu io.toDataPath.zipWithIndex.foreach { case (toDp, i) => 206730cfbc0SXuan Hu toDp <> issueQueues(i).io.deq 207730cfbc0SXuan Hu } 20859ef6009Sxiaofeibao-xjtu io.toDataPathAfterDelay.zipWithIndex.foreach { case (toDpDy, i) => 20959ef6009Sxiaofeibao-xjtu toDpDy <> issueQueues(i).io.deqDelay 21059ef6009Sxiaofeibao-xjtu } 211bf35baadSXuan Hu 212f99b81adSHaojin Tang // Response 213f99b81adSHaojin Tang issueQueues.zipWithIndex.foreach { case (iq, i) => 214f99b81adSHaojin Tang iq.io.deqResp.zipWithIndex.foreach { case (deqResp, j) => 215f99b81adSHaojin Tang deqResp.valid := iq.io.deq(j).valid && io.toDataPath(i)(j).ready 216f99b81adSHaojin Tang deqResp.bits.respType := RSFeedbackType.issueSuccess 217f99b81adSHaojin Tang deqResp.bits.robIdx := iq.io.deq(j).bits.common.robIdx 218f99b81adSHaojin Tang deqResp.bits.dataInvalidSqIdx := DontCare 219f99b81adSHaojin Tang deqResp.bits.rfWen := iq.io.deq(j).bits.common.rfWen.getOrElse(false.B) 220f99b81adSHaojin Tang deqResp.bits.fuType := iq.io.deq(j).bits.common.fuType 221f99b81adSHaojin Tang } 222f99b81adSHaojin Tang iq.io.og0Resp.zipWithIndex.foreach { case (og0Resp, j) => 223f99b81adSHaojin Tang og0Resp := io.fromDataPath(i)(j).og0resp 224f99b81adSHaojin Tang } 225f99b81adSHaojin Tang iq.io.og1Resp.zipWithIndex.foreach { case (og1Resp, j) => 226f99b81adSHaojin Tang og1Resp := io.fromDataPath(i)(j).og1resp 227f99b81adSHaojin Tang } 228f99b81adSHaojin Tang iq.io.finalIssueResp.foreach(_.zipWithIndex.foreach { case (finalIssueResp, j) => 229f99b81adSHaojin Tang finalIssueResp := io.loadFinalIssueResp(i)(j) 230f99b81adSHaojin Tang }) 231f99b81adSHaojin Tang iq.io.wbBusyTableRead := io.fromWbFuBusyTable.fuBusyTableRead(i) 232f99b81adSHaojin Tang io.wbFuBusyTable(i) := iq.io.wbBusyTableWrite 233f99b81adSHaojin Tang } 234f99b81adSHaojin Tang 235c0be7f33SXuan Hu println(s"[Scheduler] io.fromSchedulers.wakeupVec: ${io.fromSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}") 236bf35baadSXuan Hu println(s"[Scheduler] iqWakeUpInKeys: ${iqWakeUpInMap.keys}") 237bf35baadSXuan Hu 238bf35baadSXuan Hu println(s"[Scheduler] iqWakeUpOutKeys: ${iqWakeUpOutMap.keys}") 239c0be7f33SXuan Hu println(s"[Scheduler] io.toSchedulers.wakeupVec: ${io.toSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}") 240730cfbc0SXuan Hu} 241730cfbc0SXuan Hu 242730cfbc0SXuan Huclass SchedulerArithImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters) 243730cfbc0SXuan Hu extends SchedulerImpBase(wrapper) 244730cfbc0SXuan Hu with HasXSParameter 245730cfbc0SXuan Hu{ 2462e0a7dc5Sfdy// dontTouch(io.vfWbFuBusyTable) 247730cfbc0SXuan Hu println(s"[SchedulerArithImp] " + 248730cfbc0SXuan Hu s"has intBusyTable: ${intBusyTable.nonEmpty}, " + 249730cfbc0SXuan Hu s"has vfBusyTable: ${vfBusyTable.nonEmpty}") 250730cfbc0SXuan Hu 251730cfbc0SXuan Hu issueQueues.zipWithIndex.foreach { case (iq, i) => 252730cfbc0SXuan Hu iq.io.flush <> io.fromCtrlBlock.flush 253730cfbc0SXuan Hu iq.io.enq <> dispatch2Iq.io.out(i) 254bf35baadSXuan Hu iq.io.wakeupFromWB := wakeupFromWBVec 255730cfbc0SXuan Hu } 256730cfbc0SXuan Hu} 257730cfbc0SXuan Hu 258f99b81adSHaojin Tang// FIXME: Vector mem instructions may not be handled properly! 259730cfbc0SXuan Huclass SchedulerMemImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters) 260730cfbc0SXuan Hu extends SchedulerImpBase(wrapper) 261730cfbc0SXuan Hu with HasXSParameter 262730cfbc0SXuan Hu{ 263730cfbc0SXuan Hu println(s"[SchedulerMemImp] " + 264730cfbc0SXuan Hu s"has intBusyTable: ${intBusyTable.nonEmpty}, " + 265730cfbc0SXuan Hu s"has vfBusyTable: ${vfBusyTable.nonEmpty}") 266730cfbc0SXuan Hu 267730cfbc0SXuan Hu val memAddrIQs = issueQueues.filter(iq => iq.params.StdCnt == 0) 268730cfbc0SXuan Hu val stAddrIQs = issueQueues.filter(iq => iq.params.StaCnt > 0) // included in memAddrIQs 2697b753bebSXuan Hu val ldAddrIQs = issueQueues.filter(iq => iq.params.LduCnt > 0) 270730cfbc0SXuan Hu val stDataIQs = issueQueues.filter(iq => iq.params.StdCnt > 0) 271730cfbc0SXuan Hu require(memAddrIQs.nonEmpty && stDataIQs.nonEmpty) 272730cfbc0SXuan Hu 273853cd2d8SHaojin Tang io.toMem.get.loadFastMatch := 0.U.asTypeOf(io.toMem.get.loadFastMatch) // TODO: is still needed? 274853cd2d8SHaojin Tang 275730cfbc0SXuan Hu memAddrIQs.zipWithIndex.foreach { case (iq, i) => 276730cfbc0SXuan Hu iq.io.flush <> io.fromCtrlBlock.flush 277730cfbc0SXuan Hu iq.io.enq <> dispatch2Iq.io.out(i) 278bf35baadSXuan Hu iq.io.wakeupFromWB := wakeupFromWBVec 279730cfbc0SXuan Hu } 280730cfbc0SXuan Hu 2817b753bebSXuan Hu ldAddrIQs.foreach { 282de784418SXuan Hu case imp: IssueQueueMemAddrImp => 283de784418SXuan Hu imp.io.memIO.get.feedbackIO <> io.fromMem.get.ldaFeedback 284c14e89f4SHaojin Tang imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr 285de784418SXuan Hu imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 2867b753bebSXuan Hu case _ => 2877b753bebSXuan Hu } 2887b753bebSXuan Hu 2897b753bebSXuan Hu stAddrIQs.foreach { 290c14e89f4SHaojin Tang case imp: IssueQueueMemAddrImp => 291c14e89f4SHaojin Tang imp.io.memIO.get.feedbackIO <> io.fromMem.get.staFeedback 292c14e89f4SHaojin Tang imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr 293c14e89f4SHaojin Tang imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 2947b753bebSXuan Hu case _ => 2957b753bebSXuan Hu } 296730cfbc0SXuan Hu 297166eb00dSHaojin Tang // TODO: Implement vstu 298166eb00dSHaojin Tang issueQueues.filter(iq => iq.params.VstuCnt > 0).foreach { 299166eb00dSHaojin Tang case imp: IssueQueueMemAddrImp => 300166eb00dSHaojin Tang imp.io.memIO.get.feedbackIO <> DontCare 301166eb00dSHaojin Tang imp.io.memIO.get.checkWait.stIssuePtr := DontCare 302166eb00dSHaojin Tang imp.io.memIO.get.checkWait.memWaitUpdateReq := DontCare 303166eb00dSHaojin Tang case _ => 304166eb00dSHaojin Tang } 305166eb00dSHaojin Tang 306166eb00dSHaojin Tang // TODO: Implement vldu 307166eb00dSHaojin Tang issueQueues.filter(iq => iq.params.VlduCnt > 0).foreach { 308166eb00dSHaojin Tang case imp: IssueQueueMemAddrImp => 309166eb00dSHaojin Tang imp.io.memIO.get.feedbackIO <> DontCare 310166eb00dSHaojin Tang imp.io.memIO.get.checkWait.stIssuePtr := DontCare 311166eb00dSHaojin Tang imp.io.memIO.get.checkWait.memWaitUpdateReq := DontCare 312166eb00dSHaojin Tang case _ => 313166eb00dSHaojin Tang } 314166eb00dSHaojin Tang 3159b258a00Sxgkiri private val staIdxSeq = issueQueues.filter(iq => iq.params.StaCnt > 0).map(iq => iq.params.idxInSchBlk) 3169b258a00Sxgkiri 3179b258a00Sxgkiri for ((idxInSchBlk, i) <- staIdxSeq.zipWithIndex) { 3189b258a00Sxgkiri dispatch2Iq.io.out(idxInSchBlk).zip(stAddrIQs(i).io.enq).zip(stDataIQs(i).io.enq).foreach{ case((di, staIQ), stdIQ) => 319730cfbc0SXuan Hu val isAllReady = staIQ.ready && stdIQ.ready 320730cfbc0SXuan Hu di.ready := isAllReady 321730cfbc0SXuan Hu staIQ.valid := di.valid && isAllReady 322730cfbc0SXuan Hu stdIQ.valid := di.valid && isAllReady 323730cfbc0SXuan Hu } 3249b258a00Sxgkiri } 325730cfbc0SXuan Hu 326730cfbc0SXuan Hu require(stAddrIQs.size == stDataIQs.size, s"number of store address IQs(${stAddrIQs.size}) " + 327730cfbc0SXuan Hu s"should be equal to number of data IQs(${stDataIQs})") 328730cfbc0SXuan Hu stDataIQs.zip(stAddrIQs).zipWithIndex.foreach { case ((stdIQ, staIQ), i) => 329730cfbc0SXuan Hu stdIQ.io.flush <> io.fromCtrlBlock.flush 330730cfbc0SXuan Hu 331730cfbc0SXuan Hu stdIQ.io.enq.zip(staIQ.io.enq).foreach { case (stdIQEnq, staIQEnq) => 332730cfbc0SXuan Hu stdIQEnq.bits := staIQEnq.bits 333730cfbc0SXuan Hu // Store data reuses store addr src(1) in dispatch2iq 334730cfbc0SXuan Hu // [dispatch2iq] --src*------src*(0)--> [staIQ] 335730cfbc0SXuan Hu // \ 336730cfbc0SXuan Hu // ---src*(1)--> [stdIQ] 337730cfbc0SXuan Hu // Since the src(1) of sta is easier to get, stdIQEnq.bits.src*(0) is assigned to staIQEnq.bits.src*(1) 338730cfbc0SXuan Hu // instead of dispatch2Iq.io.out(x).bits.src*(1) 339730cfbc0SXuan Hu stdIQEnq.bits.srcState(0) := staIQEnq.bits.srcState(1) 340730cfbc0SXuan Hu stdIQEnq.bits.srcType(0) := staIQEnq.bits.srcType(1) 341bc7d6943SzhanglyGit stdIQEnq.bits.dataSource(0) := staIQEnq.bits.dataSource(1) 342bc7d6943SzhanglyGit stdIQEnq.bits.l1ExuOH(0) := staIQEnq.bits.l1ExuOH(1) 343730cfbc0SXuan Hu stdIQEnq.bits.psrc(0) := staIQEnq.bits.psrc(1) 344730cfbc0SXuan Hu stdIQEnq.bits.sqIdx := staIQEnq.bits.sqIdx 345730cfbc0SXuan Hu } 346bf35baadSXuan Hu stdIQ.io.wakeupFromWB := wakeupFromWBVec 347730cfbc0SXuan Hu } 348730cfbc0SXuan Hu 349730cfbc0SXuan Hu val lsqEnqCtrl = Module(new LsqEnqCtrl) 350730cfbc0SXuan Hu 351730cfbc0SXuan Hu lsqEnqCtrl.io.redirect <> io.fromCtrlBlock.flush 352730cfbc0SXuan Hu lsqEnqCtrl.io.enq <> dispatch2Iq.io.enqLsqIO.get 353730cfbc0SXuan Hu lsqEnqCtrl.io.lcommit := io.fromMem.get.lcommit 354730cfbc0SXuan Hu lsqEnqCtrl.io.scommit := io.fromMem.get.scommit 355730cfbc0SXuan Hu lsqEnqCtrl.io.lqCancelCnt := io.fromMem.get.lqCancelCnt 356730cfbc0SXuan Hu lsqEnqCtrl.io.sqCancelCnt := io.fromMem.get.sqCancelCnt 357730cfbc0SXuan Hu io.memIO.get.lsqEnqIO <> lsqEnqCtrl.io.enqLsq 358730cfbc0SXuan Hu} 359