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} 74fa00a44SzhanglyGitimport utils.OptionWrapper 8730cfbc0SXuan Huimport xiangshan._ 910fe9778SXuan Huimport xiangshan.backend.Bundles._ 10*c720aa49Ssinsanctionimport xiangshan.backend.datapath.DataConfig._ 11*c720aa49Ssinsanctionimport xiangshan.backend.datapath.WbConfig._ 12e62b6911SXuan Huimport xiangshan.backend.fu.FuType 13730cfbc0SXuan Huimport xiangshan.backend.regfile.RfWritePortWithConfig 14730cfbc0SXuan Huimport xiangshan.backend.rename.BusyTable 152d270511Ssinsanctionimport xiangshan.mem.{LsqEnqCtrl, LsqEnqIO, MemWaitUpdateReq, SqPtr, LqPtr} 16*c720aa49Ssinsanctionimport xiangshan.backend.datapath.WbConfig.V0WB 17*c720aa49Ssinsanctionimport xiangshan.backend.regfile.VlPregParams 18730cfbc0SXuan Hu 19730cfbc0SXuan Husealed trait SchedulerType 20730cfbc0SXuan Hu 21730cfbc0SXuan Hucase class IntScheduler() extends SchedulerType 2260f0c5aeSxiaofeibaocase class FpScheduler() extends SchedulerType 23730cfbc0SXuan Hucase class MemScheduler() extends SchedulerType 24730cfbc0SXuan Hucase class VfScheduler() extends SchedulerType 25730cfbc0SXuan Hucase class NoScheduler() extends SchedulerType 26730cfbc0SXuan Hu 27730cfbc0SXuan Huclass Scheduler(val params: SchdBlockParams)(implicit p: Parameters) extends LazyModule with HasXSParameter { 281ca4a39dSXuan Hu override def shouldBeInlined: Boolean = false 291ca4a39dSXuan Hu 3039c59369SXuan Hu val numIntStateWrite = backendParams.numPregWb(IntData()) 3160f0c5aeSxiaofeibao val numFpStateWrite = backendParams.numPregWb(FpData()) 3239c59369SXuan Hu val numVfStateWrite = backendParams.numPregWb(VecData()) 33*c720aa49Ssinsanction val numV0StateWrite = backendParams.numPregWb(MaskSrcData()) 34*c720aa49Ssinsanction val numVlStateWrite = backendParams.numPregWb(VConfigData()) 35730cfbc0SXuan Hu 36730cfbc0SXuan Hu val dispatch2Iq = LazyModule(new Dispatch2Iq(params)) 37730cfbc0SXuan Hu val issueQueue = params.issueBlockParams.map(x => LazyModule(new IssueQueue(x).suggestName(x.getIQName))) 38730cfbc0SXuan Hu 3983ba63b3SXuan Hu lazy val module: SchedulerImpBase = params.schdType match { 40730cfbc0SXuan Hu case IntScheduler() => new SchedulerArithImp(this)(params, p) 4160f0c5aeSxiaofeibao case FpScheduler() => new SchedulerArithImp(this)(params, p) 42730cfbc0SXuan Hu case MemScheduler() => new SchedulerMemImp(this)(params, p) 43730cfbc0SXuan Hu case VfScheduler() => new SchedulerArithImp(this)(params, p) 44730cfbc0SXuan Hu case _ => null 45730cfbc0SXuan Hu } 46730cfbc0SXuan Hu} 47730cfbc0SXuan Hu 487f8233d5SHaojin Tangclass SchedulerIO()(implicit params: SchdBlockParams, p: Parameters) extends XSBundle { 4968d13085SXuan Hu // params alias 507f8233d5SHaojin Tang private val LoadQueueSize = VirtualLoadQueueSize 5168d13085SXuan Hu 52730cfbc0SXuan Hu val fromTop = new Bundle { 53730cfbc0SXuan Hu val hartId = Input(UInt(8.W)) 54730cfbc0SXuan Hu } 552e0a7dc5Sfdy val fromWbFuBusyTable = new Bundle{ 562e0a7dc5Sfdy val fuBusyTableRead = MixedVec(params.issueBlockParams.map(x => Input(x.genWbFuBusyTableReadBundle))) 572e0a7dc5Sfdy } 58dd970561SzhanglyGit val wbFuBusyTable = MixedVec(params.issueBlockParams.map(x => Output(x.genWbFuBusyTableWriteBundle))) 5982674533Sxiaofeibao val intIQValidNumVec = Output(MixedVec(backendParams.genIntIQValidNumBundle)) 6082674533Sxiaofeibao val fpIQValidNumVec = Output(MixedVec(backendParams.genFpIQValidNumBundle)) 61dd970561SzhanglyGit 62730cfbc0SXuan Hu val fromCtrlBlock = new Bundle { 63730cfbc0SXuan Hu val flush = Flipped(ValidIO(new Redirect)) 64730cfbc0SXuan Hu } 65730cfbc0SXuan Hu val fromDispatch = new Bundle { 66730cfbc0SXuan Hu val allocPregs = Vec(RenameWidth, Input(new ResetPregStateReq)) 67730cfbc0SXuan Hu val uops = Vec(params.numUopIn, Flipped(DecoupledIO(new DynInst))) 68730cfbc0SXuan Hu } 6939c59369SXuan Hu val intWriteBack = MixedVec(Vec(backendParams.numPregWb(IntData()), 70730cfbc0SXuan Hu new RfWritePortWithConfig(backendParams.intPregParams.dataCfg, backendParams.intPregParams.addrWidth))) 7160f0c5aeSxiaofeibao val fpWriteBack = MixedVec(Vec(backendParams.numPregWb(FpData()), 7260f0c5aeSxiaofeibao new RfWritePortWithConfig(backendParams.fpPregParams.dataCfg, backendParams.fpPregParams.addrWidth))) 7339c59369SXuan Hu val vfWriteBack = MixedVec(Vec(backendParams.numPregWb(VecData()), 74730cfbc0SXuan Hu new RfWritePortWithConfig(backendParams.vfPregParams.dataCfg, backendParams.vfPregParams.addrWidth))) 75*c720aa49Ssinsanction val v0WriteBack = MixedVec(Vec(backendParams.numPregWb(MaskSrcData()), 76*c720aa49Ssinsanction new RfWritePortWithConfig(backendParams.v0PregParams.dataCfg, backendParams.v0PregParams.addrWidth))) 77*c720aa49Ssinsanction val vlWriteBack = MixedVec(Vec(backendParams.numPregWb(VConfigData()), 78*c720aa49Ssinsanction new RfWritePortWithConfig(backendParams.vlPregParams.dataCfg, backendParams.vlPregParams.addrWidth))) 7959ef6009Sxiaofeibao-xjtu val toDataPathAfterDelay: MixedVec[MixedVec[DecoupledIO[IssueQueueIssueBundle]]] = MixedVec(params.issueBlockParams.map(_.genIssueDecoupledBundle)) 80730cfbc0SXuan Hu 81*c720aa49Ssinsanction val vlWriteBackInfo = new Bundle { 82b6279fc6SZiyue Zhang val vlIsZero = Input(Bool()) 83b6279fc6SZiyue Zhang val vlIsVlmax = Input(Bool()) 84b6279fc6SZiyue Zhang } 85b6279fc6SZiyue Zhang 86bf35baadSXuan Hu val fromSchedulers = new Bundle { 87c0be7f33SXuan Hu val wakeupVec: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpInValidBundle) 88bf35baadSXuan Hu } 89bf35baadSXuan Hu 90bf35baadSXuan Hu val toSchedulers = new Bundle { 91c0be7f33SXuan Hu val wakeupVec: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = params.genIQWakeUpOutValidBundle 92bf35baadSXuan Hu } 93bf35baadSXuan Hu 94c0be7f33SXuan Hu val fromDataPath = new Bundle { 9510fe9778SXuan Hu val resp: MixedVec[MixedVec[OGRespBundle]] = MixedVec(params.issueBlockParams.map(x => Flipped(x.genOGRespBundle))) 967a96cc7fSHaojin Tang val og0Cancel = Input(ExuOH(backendParams.numExu)) 97ea46c302SXuan Hu // Todo: remove this after no cancel signal from og1 987a96cc7fSHaojin Tang val og1Cancel = Input(ExuOH(backendParams.numExu)) 99bc7d6943SzhanglyGit val cancelToBusyTable = Vec(backendParams.numExu, Flipped(ValidIO(new CancelSignal))) 100c0be7f33SXuan Hu // just be compatible to old code 101c0be7f33SXuan Hu def apply(i: Int)(j: Int) = resp(i)(j) 102c0be7f33SXuan Hu } 103c0be7f33SXuan Hu 1048a66c02cSXuan Hu val loadFinalIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.LdExuCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x))))))) 1058a66c02cSXuan Hu val memAddrIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.LdExuCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x))))))) 1067e471bf8SXuan Hu val vecLoadIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.VlduCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x))))))) 1070f55a0d3SHaojin Tang 1086810d1e8Ssfencevma val ldCancel = Vec(backendParams.LduCnt + backendParams.HyuCnt, Flipped(new LoadCancelIO)) 109c0be7f33SXuan Hu 110730cfbc0SXuan Hu val memIO = if (params.isMemSchd) Some(new Bundle { 111730cfbc0SXuan Hu val lsqEnqIO = Flipped(new LsqEnqIO) 112730cfbc0SXuan Hu }) else None 113730cfbc0SXuan Hu val fromMem = if (params.isMemSchd) Some(new Bundle { 1147b753bebSXuan Hu val ldaFeedback = Flipped(Vec(params.LduCnt, new MemRSFeedbackIO)) 1157b753bebSXuan Hu val staFeedback = Flipped(Vec(params.StaCnt, new MemRSFeedbackIO)) 1168f1fa9b1Ssfencevma val hyuFeedback = Flipped(Vec(params.HyuCnt, new MemRSFeedbackIO)) 117fd490615Sweiding liu val vstuFeedback = Flipped(Vec(params.VstuCnt, new MemRSFeedbackIO(isVector = true))) 118fd490615Sweiding liu val vlduFeedback = Flipped(Vec(params.VlduCnt, new MemRSFeedbackIO(isVector = true))) 119730cfbc0SXuan Hu val stIssuePtr = Input(new SqPtr()) 120730cfbc0SXuan Hu val lcommit = Input(UInt(log2Up(CommitWidth + 1).W)) 121730cfbc0SXuan Hu val scommit = Input(UInt(log2Ceil(EnsbufferWidth + 1).W)) // connected to `memBlock.io.sqDeq` instead of ROB 122fc45ed13SXuan Hu val wakeup = Vec(params.LdExuCnt, Flipped(Valid(new DynInst))) 1232d270511Ssinsanction val lqDeqPtr = Input(new LqPtr) 1242d270511Ssinsanction val sqDeqPtr = Input(new SqPtr) 125730cfbc0SXuan Hu // from lsq 126730cfbc0SXuan Hu val lqCancelCnt = Input(UInt(log2Up(LoadQueueSize + 1).W)) 127730cfbc0SXuan Hu val sqCancelCnt = Input(UInt(log2Up(StoreQueueSize + 1).W)) 128730cfbc0SXuan Hu val memWaitUpdateReq = Flipped(new MemWaitUpdateReq) 129730cfbc0SXuan Hu }) else None 130730cfbc0SXuan Hu val toMem = if (params.isMemSchd) Some(new Bundle { 131730cfbc0SXuan Hu val loadFastMatch = Output(Vec(params.LduCnt, new IssueQueueLoadBundle)) 132730cfbc0SXuan Hu }) else None 133c38df446SzhanglyGit val fromOg2 = if(params.isVfSchd) Some(MixedVec(params.issueBlockParams.map(x => Flipped(x.genOG2RespBundle)))) else None 134730cfbc0SXuan Hu} 135730cfbc0SXuan Hu 136730cfbc0SXuan Huabstract class SchedulerImpBase(wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters) 137730cfbc0SXuan Hu extends LazyModuleImp(wrapper) 138730cfbc0SXuan Hu with HasXSParameter 139730cfbc0SXuan Hu{ 140730cfbc0SXuan Hu val io = IO(new SchedulerIO()) 141730cfbc0SXuan Hu 142730cfbc0SXuan Hu // alias 143c0be7f33SXuan Hu private val iqWakeUpInMap: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] = 144c0be7f33SXuan Hu io.fromSchedulers.wakeupVec.map(x => (x.bits.exuIdx, x)).toMap 145730cfbc0SXuan Hu private val schdType = params.schdType 146730cfbc0SXuan Hu 147730cfbc0SXuan Hu // Modules 148730cfbc0SXuan Hu val dispatch2Iq: Dispatch2IqImp = wrapper.dispatch2Iq.module 149730cfbc0SXuan Hu val issueQueues: Seq[IssueQueueImp] = wrapper.issueQueue.map(_.module) 15082674533Sxiaofeibao io.intIQValidNumVec := 0.U.asTypeOf(io.intIQValidNumVec) 15182674533Sxiaofeibao io.fpIQValidNumVec := 0.U.asTypeOf(io.fpIQValidNumVec) 152ff3fcdf1Sxiaofeibao-xjtu if (params.isIntSchd) { 15382674533Sxiaofeibao dispatch2Iq.io.intIQValidNumVec.get := io.intIQValidNumVec 15482674533Sxiaofeibao io.intIQValidNumVec := MixedVecInit(issueQueues.map(_.io.validCntDeqVec)) 155ff3fcdf1Sxiaofeibao-xjtu } 15682674533Sxiaofeibao else if (params.isFpSchd) { 15782674533Sxiaofeibao dispatch2Iq.io.fpIQValidNumVec.get := io.fpIQValidNumVec 15882674533Sxiaofeibao io.fpIQValidNumVec := MixedVecInit(issueQueues.map(_.io.validCntDeqVec)) 15982674533Sxiaofeibao } 160730cfbc0SXuan Hu 16156bcaed7SHaojin Tang // valid count 16256bcaed7SHaojin Tang dispatch2Iq.io.iqValidCnt := issueQueues.filter(_.params.StdCnt == 0).map(_.io.status.validCnt) 16356bcaed7SHaojin Tang 164730cfbc0SXuan Hu // BusyTable Modules 165730cfbc0SXuan Hu val intBusyTable = schdType match { 166bc7d6943SzhanglyGit case IntScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numIntStateRead, wrapper.numIntStateWrite, IntPhyRegs, IntWB()))) 167730cfbc0SXuan Hu case _ => None 168730cfbc0SXuan Hu } 16960f0c5aeSxiaofeibao val fpBusyTable = schdType match { 17060f0c5aeSxiaofeibao case FpScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numFpStateRead, wrapper.numFpStateWrite, FpPhyRegs, FpWB()))) 17160f0c5aeSxiaofeibao case _ => None 17260f0c5aeSxiaofeibao } 173730cfbc0SXuan Hu val vfBusyTable = schdType match { 174bc7d6943SzhanglyGit case VfScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numVfStateRead, wrapper.numVfStateWrite, VfPhyRegs, VfWB()))) 175730cfbc0SXuan Hu case _ => None 176730cfbc0SXuan Hu } 177*c720aa49Ssinsanction val v0BusyTable = schdType match { 178*c720aa49Ssinsanction case VfScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numV0StateRead, wrapper.numV0StateWrite, V0PhyRegs, V0WB()))) 179*c720aa49Ssinsanction case _ => None 180*c720aa49Ssinsanction } 181*c720aa49Ssinsanction val vlBusyTable = schdType match { 182*c720aa49Ssinsanction case VfScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numVlStateRead, wrapper.numVlStateWrite, VlPhyRegs, VlWB()))) 183*c720aa49Ssinsanction case _ => None 184*c720aa49Ssinsanction } 185730cfbc0SXuan Hu 186730cfbc0SXuan Hu dispatch2Iq.io match { case dp2iq => 187730cfbc0SXuan Hu dp2iq.redirect <> io.fromCtrlBlock.flush 188730cfbc0SXuan Hu dp2iq.in <> io.fromDispatch.uops 189730cfbc0SXuan Hu dp2iq.readIntState.foreach(_ <> intBusyTable.get.io.read) 19060f0c5aeSxiaofeibao dp2iq.readFpState.foreach(_ <> fpBusyTable.get.io.read) 191730cfbc0SXuan Hu dp2iq.readVfState.foreach(_ <> vfBusyTable.get.io.read) 192*c720aa49Ssinsanction dp2iq.readV0State.foreach(_ <> v0BusyTable.get.io.read) 193*c720aa49Ssinsanction dp2iq.readVlState.foreach(_ <> vlBusyTable.get.io.read) 194730cfbc0SXuan Hu } 195730cfbc0SXuan Hu 196730cfbc0SXuan Hu intBusyTable match { 197730cfbc0SXuan Hu case Some(bt) => 198730cfbc0SXuan Hu bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) => 199730cfbc0SXuan Hu btAllocPregs.valid := dpAllocPregs.isInt 200730cfbc0SXuan Hu btAllocPregs.bits := dpAllocPregs.preg 201730cfbc0SXuan Hu } 202730cfbc0SXuan Hu bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) => 203730cfbc0SXuan Hu wb.valid := io.intWriteBack(i).wen && io.intWriteBack(i).intWen 204730cfbc0SXuan Hu wb.bits := io.intWriteBack(i).addr 205730cfbc0SXuan Hu } 206bc7d6943SzhanglyGit bt.io.wakeUp := io.fromSchedulers.wakeupVec 207bc7d6943SzhanglyGit bt.io.cancel := io.fromDataPath.cancelToBusyTable 20813551487SzhanglyGit bt.io.ldCancel := io.ldCancel 209730cfbc0SXuan Hu case None => 210730cfbc0SXuan Hu } 211730cfbc0SXuan Hu 21260f0c5aeSxiaofeibao fpBusyTable match { 213730cfbc0SXuan Hu case Some(bt) => 214730cfbc0SXuan Hu bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) => 215730cfbc0SXuan Hu btAllocPregs.valid := dpAllocPregs.isFp 216730cfbc0SXuan Hu btAllocPregs.bits := dpAllocPregs.preg 217730cfbc0SXuan Hu } 218730cfbc0SXuan Hu bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) => 21960f0c5aeSxiaofeibao wb.valid := io.fpWriteBack(i).wen && io.fpWriteBack(i).fpWen 22060f0c5aeSxiaofeibao wb.bits := io.fpWriteBack(i).addr 22160f0c5aeSxiaofeibao } 22260f0c5aeSxiaofeibao bt.io.wakeUp := io.fromSchedulers.wakeupVec 22360f0c5aeSxiaofeibao bt.io.cancel := io.fromDataPath.cancelToBusyTable 22460f0c5aeSxiaofeibao bt.io.ldCancel := io.ldCancel 22560f0c5aeSxiaofeibao case None => 22660f0c5aeSxiaofeibao } 22760f0c5aeSxiaofeibao 22860f0c5aeSxiaofeibao vfBusyTable match { 22960f0c5aeSxiaofeibao case Some(bt) => 23060f0c5aeSxiaofeibao bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) => 23160f0c5aeSxiaofeibao btAllocPregs.valid := dpAllocPregs.isVec 23260f0c5aeSxiaofeibao btAllocPregs.bits := dpAllocPregs.preg 23360f0c5aeSxiaofeibao } 23460f0c5aeSxiaofeibao bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) => 23560f0c5aeSxiaofeibao wb.valid := io.vfWriteBack(i).wen && io.vfWriteBack(i).vecWen 236730cfbc0SXuan Hu wb.bits := io.vfWriteBack(i).addr 237730cfbc0SXuan Hu } 238bc7d6943SzhanglyGit bt.io.wakeUp := io.fromSchedulers.wakeupVec 239bc7d6943SzhanglyGit bt.io.cancel := io.fromDataPath.cancelToBusyTable 24013551487SzhanglyGit bt.io.ldCancel := io.ldCancel 241730cfbc0SXuan Hu case None => 242730cfbc0SXuan Hu } 243730cfbc0SXuan Hu 244*c720aa49Ssinsanction v0BusyTable match { 245*c720aa49Ssinsanction case Some(bt) => 246*c720aa49Ssinsanction bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) => 247*c720aa49Ssinsanction btAllocPregs.valid := dpAllocPregs.isVec 248*c720aa49Ssinsanction btAllocPregs.bits := dpAllocPregs.preg 249*c720aa49Ssinsanction } 250*c720aa49Ssinsanction bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) => 251*c720aa49Ssinsanction wb.valid := io.v0WriteBack(i).wen && io.v0WriteBack(i).v0Wen 252*c720aa49Ssinsanction wb.bits := io.v0WriteBack(i).addr 253*c720aa49Ssinsanction } 254*c720aa49Ssinsanction bt.io.wakeUp := io.fromSchedulers.wakeupVec 255*c720aa49Ssinsanction bt.io.cancel := io.fromDataPath.cancelToBusyTable 256*c720aa49Ssinsanction bt.io.ldCancel := io.ldCancel 257*c720aa49Ssinsanction case None => 258*c720aa49Ssinsanction } 259*c720aa49Ssinsanction 260*c720aa49Ssinsanction vlBusyTable match { 261*c720aa49Ssinsanction case Some(bt) => 262*c720aa49Ssinsanction bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) => 263*c720aa49Ssinsanction btAllocPregs.valid := dpAllocPregs.isVec 264*c720aa49Ssinsanction btAllocPregs.bits := dpAllocPregs.preg 265*c720aa49Ssinsanction } 266*c720aa49Ssinsanction bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) => 267*c720aa49Ssinsanction wb.valid := io.vlWriteBack(i).wen && io.vlWriteBack(i).vlWen 268*c720aa49Ssinsanction wb.bits := io.vlWriteBack(i).addr 269*c720aa49Ssinsanction } 270*c720aa49Ssinsanction bt.io.wakeUp := io.fromSchedulers.wakeupVec 271*c720aa49Ssinsanction bt.io.cancel := io.fromDataPath.cancelToBusyTable 272*c720aa49Ssinsanction bt.io.ldCancel := io.ldCancel 273*c720aa49Ssinsanction case None => 274*c720aa49Ssinsanction } 275*c720aa49Ssinsanction 276f39a61a1SzhanglyGit val wakeupFromIntWBVec = Wire(params.genIntWBWakeUpSinkValidBundle) 27760f0c5aeSxiaofeibao val wakeupFromFpWBVec = Wire(params.genFpWBWakeUpSinkValidBundle) 278f39a61a1SzhanglyGit val wakeupFromVfWBVec = Wire(params.genVfWBWakeUpSinkValidBundle) 279*c720aa49Ssinsanction val wakeupFromV0WBVec = Wire(params.genV0WBWakeUpSinkValidBundle) 280*c720aa49Ssinsanction val wakeupFromVlWBVec = Wire(params.genVlWBWakeUpSinkValidBundle) 281f39a61a1SzhanglyGit 282f39a61a1SzhanglyGit wakeupFromIntWBVec.zip(io.intWriteBack).foreach { case (sink, source) => 283f39a61a1SzhanglyGit sink.valid := source.wen 284f39a61a1SzhanglyGit sink.bits.rfWen := source.intWen 285f39a61a1SzhanglyGit sink.bits.fpWen := source.fpWen 286f39a61a1SzhanglyGit sink.bits.vecWen := source.vecWen 287*c720aa49Ssinsanction sink.bits.v0Wen := source.v0Wen 288*c720aa49Ssinsanction sink.bits.vlWen := source.vlWen 289f39a61a1SzhanglyGit sink.bits.pdest := source.addr 290730cfbc0SXuan Hu } 291f39a61a1SzhanglyGit 29260f0c5aeSxiaofeibao wakeupFromFpWBVec.zip(io.fpWriteBack).foreach { case (sink, source) => 29360f0c5aeSxiaofeibao sink.valid := source.wen 29460f0c5aeSxiaofeibao sink.bits.rfWen := source.intWen 29560f0c5aeSxiaofeibao sink.bits.fpWen := source.fpWen 29660f0c5aeSxiaofeibao sink.bits.vecWen := source.vecWen 297*c720aa49Ssinsanction sink.bits.v0Wen := source.v0Wen 298*c720aa49Ssinsanction sink.bits.vlWen := source.vlWen 29960f0c5aeSxiaofeibao sink.bits.pdest := source.addr 30060f0c5aeSxiaofeibao } 30160f0c5aeSxiaofeibao 302f39a61a1SzhanglyGit wakeupFromVfWBVec.zip(io.vfWriteBack).foreach { case (sink, source) => 303730cfbc0SXuan Hu sink.valid := source.wen 304730cfbc0SXuan Hu sink.bits.rfWen := source.intWen 305730cfbc0SXuan Hu sink.bits.fpWen := source.fpWen 306730cfbc0SXuan Hu sink.bits.vecWen := source.vecWen 307*c720aa49Ssinsanction sink.bits.v0Wen := source.v0Wen 308*c720aa49Ssinsanction sink.bits.vlWen := source.vlWen 309*c720aa49Ssinsanction sink.bits.pdest := source.addr 310*c720aa49Ssinsanction } 311*c720aa49Ssinsanction 312*c720aa49Ssinsanction wakeupFromV0WBVec.zip(io.v0WriteBack).foreach { case (sink, source) => 313*c720aa49Ssinsanction sink.valid := source.wen 314*c720aa49Ssinsanction sink.bits.rfWen := source.intWen 315*c720aa49Ssinsanction sink.bits.fpWen := source.fpWen 316*c720aa49Ssinsanction sink.bits.vecWen := source.vecWen 317*c720aa49Ssinsanction sink.bits.v0Wen := source.v0Wen 318*c720aa49Ssinsanction sink.bits.vlWen := source.vlWen 319*c720aa49Ssinsanction sink.bits.pdest := source.addr 320*c720aa49Ssinsanction } 321*c720aa49Ssinsanction 322*c720aa49Ssinsanction wakeupFromVlWBVec.zip(io.vlWriteBack).foreach { case (sink, source) => 323*c720aa49Ssinsanction sink.valid := source.wen 324*c720aa49Ssinsanction sink.bits.rfWen := source.intWen 325*c720aa49Ssinsanction sink.bits.fpWen := source.fpWen 326*c720aa49Ssinsanction sink.bits.vecWen := source.vecWen 327*c720aa49Ssinsanction sink.bits.v0Wen := source.v0Wen 328*c720aa49Ssinsanction sink.bits.vlWen := source.vlWen 329730cfbc0SXuan Hu sink.bits.pdest := source.addr 330730cfbc0SXuan Hu } 331730cfbc0SXuan Hu 332bf35baadSXuan Hu // Connect bundles having the same wakeup source 33359ef6009Sxiaofeibao-xjtu issueQueues.zipWithIndex.foreach { case(iq, i) => 334bf35baadSXuan Hu iq.io.wakeupFromIQ.foreach { wakeUp => 3350c7ebb58Sxiaofeibao-xjtu val wakeUpIn = iqWakeUpInMap(wakeUp.bits.exuIdx) 3360c7ebb58Sxiaofeibao-xjtu val exuIdx = wakeUp.bits.exuIdx 3370c7ebb58Sxiaofeibao-xjtu println(s"[Backend] Connect wakeup exuIdx ${exuIdx}") 3380c7ebb58Sxiaofeibao-xjtu connectSamePort(wakeUp,wakeUpIn) 3390c7ebb58Sxiaofeibao-xjtu backendParams.connectWakeup(exuIdx) 3400c7ebb58Sxiaofeibao-xjtu if (backendParams.isCopyPdest(exuIdx)) { 3410c7ebb58Sxiaofeibao-xjtu println(s"[Backend] exuIdx ${exuIdx} use pdestCopy ${backendParams.getCopyPdestIndex(exuIdx)}") 3420c7ebb58Sxiaofeibao-xjtu wakeUp.bits.pdest := wakeUpIn.bits.pdestCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 3434c5a0d77Sxiaofeibao-xjtu if (wakeUpIn.bits.rfWenCopy.nonEmpty) wakeUp.bits.rfWen := wakeUpIn.bits.rfWenCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 3444c5a0d77Sxiaofeibao-xjtu if (wakeUpIn.bits.fpWenCopy.nonEmpty) wakeUp.bits.fpWen := wakeUpIn.bits.fpWenCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 3454c5a0d77Sxiaofeibao-xjtu if (wakeUpIn.bits.vecWenCopy.nonEmpty) wakeUp.bits.vecWen := wakeUpIn.bits.vecWenCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 346*c720aa49Ssinsanction if (wakeUpIn.bits.v0WenCopy.nonEmpty) wakeUp.bits.v0Wen := wakeUpIn.bits.v0WenCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 347*c720aa49Ssinsanction if (wakeUpIn.bits.vlWenCopy.nonEmpty) wakeUp.bits.vlWen := wakeUpIn.bits.vlWenCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 3484c5a0d77Sxiaofeibao-xjtu if (wakeUpIn.bits.loadDependencyCopy.nonEmpty) wakeUp.bits.loadDependency := wakeUpIn.bits.loadDependencyCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 3490c7ebb58Sxiaofeibao-xjtu } 35060912d84Sxiaofeibao-xjtu if (iq.params.numIntSrc == 0) wakeUp.bits.rfWen := false.B 35160f0c5aeSxiaofeibao if (iq.params.numFpSrc == 0) wakeUp.bits.fpWen := false.B 35260912d84Sxiaofeibao-xjtu if (iq.params.numVfSrc == 0) wakeUp.bits.vecWen := false.B 353*c720aa49Ssinsanction if (iq.params.numV0Src == 0) wakeUp.bits.v0Wen := false.B 354*c720aa49Ssinsanction if (iq.params.numVlSrc == 0) wakeUp.bits.vlWen := false.B 355bf35baadSXuan Hu } 356ea46c302SXuan Hu iq.io.og0Cancel := io.fromDataPath.og0Cancel 357ea46c302SXuan Hu iq.io.og1Cancel := io.fromDataPath.og1Cancel 3580f55a0d3SHaojin Tang iq.io.ldCancel := io.ldCancel 359bf35baadSXuan Hu } 360bf35baadSXuan Hu 361b6279fc6SZiyue Zhang // connect the vl writeback informatino to the issue queues 362b6279fc6SZiyue Zhang issueQueues.zipWithIndex.foreach { case(iq, i) => 363*c720aa49Ssinsanction iq.io.vlIsVlmax := io.vlWriteBackInfo.vlIsVlmax 364*c720aa49Ssinsanction iq.io.vlIsZero := io.vlWriteBackInfo.vlIsZero 365b6279fc6SZiyue Zhang } 366b6279fc6SZiyue Zhang 367c0be7f33SXuan Hu private val iqWakeUpOutMap: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] = 368bf35baadSXuan Hu issueQueues.flatMap(_.io.wakeupToIQ) 369c0be7f33SXuan Hu .map(x => (x.bits.exuIdx, x)) 370bf35baadSXuan Hu .toMap 371bf35baadSXuan Hu 372bf35baadSXuan Hu // Connect bundles having the same wakeup source 373bf35baadSXuan Hu io.toSchedulers.wakeupVec.foreach { wakeUp => 374c0be7f33SXuan Hu wakeUp := iqWakeUpOutMap(wakeUp.bits.exuIdx) 375bf35baadSXuan Hu } 376bf35baadSXuan Hu 37759ef6009Sxiaofeibao-xjtu io.toDataPathAfterDelay.zipWithIndex.foreach { case (toDpDy, i) => 37859ef6009Sxiaofeibao-xjtu toDpDy <> issueQueues(i).io.deqDelay 37959ef6009Sxiaofeibao-xjtu } 380bf35baadSXuan Hu 381f99b81adSHaojin Tang // Response 382f99b81adSHaojin Tang issueQueues.zipWithIndex.foreach { case (iq, i) => 383f99b81adSHaojin Tang iq.io.og0Resp.zipWithIndex.foreach { case (og0Resp, j) => 384f99b81adSHaojin Tang og0Resp := io.fromDataPath(i)(j).og0resp 385f99b81adSHaojin Tang } 386f99b81adSHaojin Tang iq.io.og1Resp.zipWithIndex.foreach { case (og1Resp, j) => 387f99b81adSHaojin Tang og1Resp := io.fromDataPath(i)(j).og1resp 388f99b81adSHaojin Tang } 389f99b81adSHaojin Tang iq.io.finalIssueResp.foreach(_.zipWithIndex.foreach { case (finalIssueResp, j) => 390670870b3SXuan Hu if (io.loadFinalIssueResp(i).isDefinedAt(j)) { 391f99b81adSHaojin Tang finalIssueResp := io.loadFinalIssueResp(i)(j) 392670870b3SXuan Hu } else { 393670870b3SXuan Hu finalIssueResp := 0.U.asTypeOf(finalIssueResp) 394670870b3SXuan Hu } 395f99b81adSHaojin Tang }) 396e8800897SXuan Hu iq.io.memAddrIssueResp.foreach(_.zipWithIndex.foreach { case (memAddrIssueResp, j) => 397aa2bcc31SzhanglyGit if (io.memAddrIssueResp(i).isDefinedAt(j)) { 398e8800897SXuan Hu memAddrIssueResp := io.memAddrIssueResp(i)(j) 399aa2bcc31SzhanglyGit } else { 400aa2bcc31SzhanglyGit memAddrIssueResp := 0.U.asTypeOf(memAddrIssueResp) 401aa2bcc31SzhanglyGit } 402e8800897SXuan Hu }) 4037e471bf8SXuan Hu iq.io.vecLoadIssueResp.foreach(_.zipWithIndex.foreach { case (resp, deqIdx) => 4047e471bf8SXuan Hu resp := io.vecLoadIssueResp(i)(deqIdx) 4057e471bf8SXuan Hu }) 406c38df446SzhanglyGit if(params.isVfSchd) { 407c38df446SzhanglyGit iq.io.og2Resp.get.zipWithIndex.foreach { case (og2Resp, exuIdx) => 408c38df446SzhanglyGit og2Resp := io.fromOg2.get(i)(exuIdx) 409c38df446SzhanglyGit } 410c38df446SzhanglyGit } 411f99b81adSHaojin Tang iq.io.wbBusyTableRead := io.fromWbFuBusyTable.fuBusyTableRead(i) 412f99b81adSHaojin Tang io.wbFuBusyTable(i) := iq.io.wbBusyTableWrite 413f99b81adSHaojin Tang } 414f99b81adSHaojin Tang 415c0be7f33SXuan Hu println(s"[Scheduler] io.fromSchedulers.wakeupVec: ${io.fromSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}") 416bf35baadSXuan Hu println(s"[Scheduler] iqWakeUpInKeys: ${iqWakeUpInMap.keys}") 417bf35baadSXuan Hu 418bf35baadSXuan Hu println(s"[Scheduler] iqWakeUpOutKeys: ${iqWakeUpOutMap.keys}") 419c0be7f33SXuan Hu println(s"[Scheduler] io.toSchedulers.wakeupVec: ${io.toSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}") 420730cfbc0SXuan Hu} 421730cfbc0SXuan Hu 422730cfbc0SXuan Huclass SchedulerArithImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters) 423730cfbc0SXuan Hu extends SchedulerImpBase(wrapper) 424730cfbc0SXuan Hu with HasXSParameter 425730cfbc0SXuan Hu{ 4262e0a7dc5Sfdy// dontTouch(io.vfWbFuBusyTable) 427730cfbc0SXuan Hu println(s"[SchedulerArithImp] " + 428730cfbc0SXuan Hu s"has intBusyTable: ${intBusyTable.nonEmpty}, " + 429730cfbc0SXuan Hu s"has vfBusyTable: ${vfBusyTable.nonEmpty}") 430730cfbc0SXuan Hu 431730cfbc0SXuan Hu issueQueues.zipWithIndex.foreach { case (iq, i) => 432730cfbc0SXuan Hu iq.io.flush <> io.fromCtrlBlock.flush 433730cfbc0SXuan Hu iq.io.enq <> dispatch2Iq.io.out(i) 434f39a61a1SzhanglyGit val intWBIQ = params.schdType match { 435f39a61a1SzhanglyGit case IntScheduler() => wakeupFromIntWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1) 43660f0c5aeSxiaofeibao case FpScheduler() => wakeupFromFpWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1) 437*c720aa49Ssinsanction case VfScheduler() => (wakeupFromVfWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 438*c720aa49Ssinsanction wakeupFromV0WBVec.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 439*c720aa49Ssinsanction wakeupFromVlWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1)) 440596af5d2SHaojin Tang case _ => null 441f39a61a1SzhanglyGit } 442f39a61a1SzhanglyGit iq.io.wakeupFromWB.zip(intWBIQ).foreach{ case (sink, source) => sink := source} 443730cfbc0SXuan Hu } 444730cfbc0SXuan Hu} 445730cfbc0SXuan Hu 446f99b81adSHaojin Tang// FIXME: Vector mem instructions may not be handled properly! 447730cfbc0SXuan Huclass SchedulerMemImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters) 448730cfbc0SXuan Hu extends SchedulerImpBase(wrapper) 449730cfbc0SXuan Hu with HasXSParameter 450730cfbc0SXuan Hu{ 451730cfbc0SXuan Hu println(s"[SchedulerMemImp] " + 452730cfbc0SXuan Hu s"has intBusyTable: ${intBusyTable.nonEmpty}, " + 453730cfbc0SXuan Hu s"has vfBusyTable: ${vfBusyTable.nonEmpty}") 454730cfbc0SXuan Hu 455559c1710SHaojin Tang val memAddrIQs = issueQueues.filter(_.params.isMemAddrIQ) 456e07131b2Ssinsanction val stAddrIQs = issueQueues.filter(iq => iq.params.StaCnt > 0) // included in memAddrIQs 457e07131b2Ssinsanction val ldAddrIQs = issueQueues.filter(iq => iq.params.LduCnt > 0) 458e07131b2Ssinsanction val stDataIQs = issueQueues.filter(iq => iq.params.StdCnt > 0) 459559c1710SHaojin Tang val vecMemIQs = issueQueues.filter(_.params.isVecMemIQ) 460559c1710SHaojin Tang val (hyuIQs, hyuIQIdxs) = issueQueues.zipWithIndex.filter(_._1.params.HyuCnt > 0).unzip 461499caf4cSXuan Hu 462499caf4cSXuan Hu println(s"[SchedulerMemImp] memAddrIQs.size: ${memAddrIQs.size}, enq.size: ${memAddrIQs.map(_.io.enq.size).sum}") 463499caf4cSXuan Hu println(s"[SchedulerMemImp] stAddrIQs.size: ${stAddrIQs.size }, enq.size: ${stAddrIQs.map(_.io.enq.size).sum}") 464499caf4cSXuan Hu println(s"[SchedulerMemImp] ldAddrIQs.size: ${ldAddrIQs.size }, enq.size: ${ldAddrIQs.map(_.io.enq.size).sum}") 465499caf4cSXuan Hu println(s"[SchedulerMemImp] stDataIQs.size: ${stDataIQs.size }, enq.size: ${stDataIQs.map(_.io.enq.size).sum}") 466499caf4cSXuan Hu println(s"[SchedulerMemImp] hyuIQs.size: ${hyuIQs.size }, enq.size: ${hyuIQs.map(_.io.enq.size).sum}") 467730cfbc0SXuan Hu require(memAddrIQs.nonEmpty && stDataIQs.nonEmpty) 468730cfbc0SXuan Hu 469853cd2d8SHaojin Tang io.toMem.get.loadFastMatch := 0.U.asTypeOf(io.toMem.get.loadFastMatch) // TODO: is still needed? 470853cd2d8SHaojin Tang 471fc45ed13SXuan Hu private val loadWakeUp = issueQueues.filter(_.params.LdExuCnt > 0).map(_.asInstanceOf[IssueQueueMemAddrImp].io.memIO.get.loadWakeUp).flatten 472596af5d2SHaojin Tang require(loadWakeUp.length == io.fromMem.get.wakeup.length) 473596af5d2SHaojin Tang loadWakeUp.zip(io.fromMem.get.wakeup).foreach(x => x._1 := x._2) 474596af5d2SHaojin Tang 475730cfbc0SXuan Hu memAddrIQs.zipWithIndex.foreach { case (iq, i) => 476730cfbc0SXuan Hu iq.io.flush <> io.fromCtrlBlock.flush 477730cfbc0SXuan Hu iq.io.enq <> dispatch2Iq.io.out(i) 47860f0c5aeSxiaofeibao iq.io.wakeupFromWB.zip( 47960f0c5aeSxiaofeibao wakeupFromIntWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 48060f0c5aeSxiaofeibao wakeupFromFpWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 481*c720aa49Ssinsanction wakeupFromVfWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 482*c720aa49Ssinsanction wakeupFromV0WBVec.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 483*c720aa49Ssinsanction wakeupFromVlWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1) 48460f0c5aeSxiaofeibao ).foreach{ case (sink, source) => sink := source} 485730cfbc0SXuan Hu } 486730cfbc0SXuan Hu 487ecfc6f16SXuan Hu ldAddrIQs.zipWithIndex.foreach { 488ecfc6f16SXuan Hu case (imp: IssueQueueMemAddrImp, i) => 489ecfc6f16SXuan Hu imp.io.memIO.get.feedbackIO.head := 0.U.asTypeOf(imp.io.memIO.get.feedbackIO.head) 490c14e89f4SHaojin Tang imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr 491de784418SXuan Hu imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 4927b753bebSXuan Hu case _ => 4937b753bebSXuan Hu } 4947b753bebSXuan Hu 495ecfc6f16SXuan Hu stAddrIQs.zipWithIndex.foreach { 496ecfc6f16SXuan Hu case (imp: IssueQueueMemAddrImp, i) => 497ecfc6f16SXuan Hu imp.io.memIO.get.feedbackIO.head := io.fromMem.get.staFeedback(i) 498c14e89f4SHaojin Tang imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr 499c14e89f4SHaojin Tang imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 5007b753bebSXuan Hu case _ => 5017b753bebSXuan Hu } 502730cfbc0SXuan Hu 503559c1710SHaojin Tang hyuIQs.zip(hyuIQIdxs).foreach { 504559c1710SHaojin Tang case (imp: IssueQueueMemAddrImp, idx) => 505670870b3SXuan Hu imp.io.memIO.get.feedbackIO.head := io.fromMem.get.hyuFeedback.head 506670870b3SXuan Hu imp.io.memIO.get.feedbackIO(1) := 0.U.asTypeOf(imp.io.memIO.get.feedbackIO(1)) 5078f1fa9b1Ssfencevma imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr 5088f1fa9b1Ssfencevma imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 509559c1710SHaojin Tang // TODO: refactor ditry code 510559c1710SHaojin Tang imp.io.deqDelay(1).ready := false.B 511559c1710SHaojin Tang io.toDataPathAfterDelay(idx)(1).valid := false.B 512559c1710SHaojin Tang io.toDataPathAfterDelay(idx)(1).bits := 0.U.asTypeOf(io.toDataPathAfterDelay(idx)(1).bits) 5138f1fa9b1Ssfencevma case _ => 5148f1fa9b1Ssfencevma } 5158f1fa9b1Ssfencevma 516e62b6911SXuan Hu private val staIdxSeq = (stAddrIQs).map(iq => iq.params.idxInSchBlk) 517e62b6911SXuan Hu private val hyaIdxSeq = (hyuIQs).map(iq => iq.params.idxInSchBlk) 518e62b6911SXuan Hu 519e62b6911SXuan Hu println(s"[SchedulerMemImp] sta iq idx in memSchdBlock: $staIdxSeq") 520e62b6911SXuan Hu println(s"[SchedulerMemImp] hya iq idx in memSchdBlock: $hyaIdxSeq") 521e62b6911SXuan Hu 522e62b6911SXuan Hu private val staEnqs = stAddrIQs.map(_.io.enq).flatten 523e62b6911SXuan Hu private val stdEnqs = stDataIQs.map(_.io.enq).flatten.take(staEnqs.size) 524e62b6911SXuan Hu private val hyaEnqs = hyuIQs.map(_.io.enq).flatten 525e62b6911SXuan Hu private val hydEnqs = stDataIQs.map(_.io.enq).flatten.drop(staEnqs.size) 526e62b6911SXuan Hu 527e62b6911SXuan Hu require(staEnqs.size == stdEnqs.size, s"number of enq ports of store address IQs(${staEnqs.size}) " + 528e62b6911SXuan Hu s"should be equal to number of enq ports of store data IQs(${stdEnqs.size})") 529e62b6911SXuan Hu 530e62b6911SXuan Hu require(hyaEnqs.size == hydEnqs.size, s"number of enq ports of hybrid address IQs(${hyaEnqs.size}) " + 531e62b6911SXuan Hu s"should be equal to number of enq ports of hybrid data IQs(${hydEnqs.size})") 5329b258a00Sxgkiri 5330438e8f4SHaojin Tang val d2IqStaOut = dispatch2Iq.io.out.zipWithIndex.filter(staIdxSeq contains _._2).unzip._1.flatten 5340438e8f4SHaojin Tang d2IqStaOut.zip(staEnqs).zip(stdEnqs).foreach{ case((dp, staIQ), stdIQ) => 535730cfbc0SXuan Hu val isAllReady = staIQ.ready && stdIQ.ready 536e62b6911SXuan Hu dp.ready := isAllReady 537e62b6911SXuan Hu staIQ.valid := dp.valid && isAllReady 5380438e8f4SHaojin Tang stdIQ.valid := dp.valid && isAllReady && FuType.FuTypeOrR(dp.bits.fuType, FuType.stu, FuType.mou) 5399b258a00Sxgkiri } 540730cfbc0SXuan Hu 5410438e8f4SHaojin Tang val d2IqHyaOut = dispatch2Iq.io.out.zipWithIndex.filter(hyaIdxSeq contains _._2).unzip._1.flatten 5420438e8f4SHaojin Tang d2IqHyaOut.zip(hyaEnqs).zip(hydEnqs).foreach{ case((dp, hyaIQ), hydIQ) => 543e62b6911SXuan Hu val isAllReady = hyaIQ.ready && hydIQ.ready 544e62b6911SXuan Hu dp.ready := isAllReady 545e62b6911SXuan Hu hyaIQ.valid := dp.valid && isAllReady 54656bceacbSHaojin Tang hydIQ.valid := dp.valid && isAllReady && FuType.FuTypeOrR(dp.bits.fuType, FuType.stu, FuType.mou) 547e62b6911SXuan Hu } 548730cfbc0SXuan Hu 549e62b6911SXuan Hu stDataIQs.zipWithIndex.foreach { case (iq, i) => 550e62b6911SXuan Hu iq.io.flush <> io.fromCtrlBlock.flush 55160f0c5aeSxiaofeibao iq.io.wakeupFromWB.zip( 55260f0c5aeSxiaofeibao wakeupFromIntWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 55360f0c5aeSxiaofeibao wakeupFromFpWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 554*c720aa49Ssinsanction wakeupFromVfWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 555*c720aa49Ssinsanction wakeupFromV0WBVec.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 556*c720aa49Ssinsanction wakeupFromVlWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq 55760f0c5aeSxiaofeibao ).foreach{ case (sink, source) => sink := source} 558e62b6911SXuan Hu } 559e62b6911SXuan Hu 560e62b6911SXuan Hu (stdEnqs ++ hydEnqs).zip(staEnqs ++ hyaEnqs).zipWithIndex.foreach { case ((stdIQEnq, staIQEnq), i) => 561730cfbc0SXuan Hu stdIQEnq.bits := staIQEnq.bits 562730cfbc0SXuan Hu // Store data reuses store addr src(1) in dispatch2iq 563e62b6911SXuan Hu // [dispatch2iq] --src*------src*(0)--> [staIQ|hyaIQ] 564730cfbc0SXuan Hu // \ 565730cfbc0SXuan Hu // ---src*(1)--> [stdIQ] 566730cfbc0SXuan Hu // Since the src(1) of sta is easier to get, stdIQEnq.bits.src*(0) is assigned to staIQEnq.bits.src*(1) 567730cfbc0SXuan Hu // instead of dispatch2Iq.io.out(x).bits.src*(1) 56897b279b9SXuan Hu val stdIdx = 1 5692d270511Ssinsanction stdIQEnq.bits.srcState(0) := staIQEnq.bits.srcState(stdIdx) 57013551487SzhanglyGit stdIQEnq.bits.srcLoadDependency(0) := staIQEnq.bits.srcLoadDependency(1) 5712d270511Ssinsanction stdIQEnq.bits.srcType(0) := staIQEnq.bits.srcType(stdIdx) 5722d270511Ssinsanction stdIQEnq.bits.psrc(0) := staIQEnq.bits.psrc(stdIdx) 573730cfbc0SXuan Hu stdIQEnq.bits.sqIdx := staIQEnq.bits.sqIdx 574730cfbc0SXuan Hu } 575730cfbc0SXuan Hu 5762d270511Ssinsanction vecMemIQs.foreach { 5772d270511Ssinsanction case imp: IssueQueueVecMemImp => 5782d270511Ssinsanction imp.io.memIO.get.sqDeqPtr.foreach(_ := io.fromMem.get.sqDeqPtr) 5792d270511Ssinsanction imp.io.memIO.get.lqDeqPtr.foreach(_ := io.fromMem.get.lqDeqPtr) 5801f3d1b4dSXuan Hu // not used 581b7c799beSzhanglyGit //imp.io.memIO.get.feedbackIO.head := io.fromMem.get.vstuFeedback.head // only vector store replay 5821f3d1b4dSXuan Hu // maybe not used 5831f3d1b4dSXuan Hu imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr 5841f3d1b4dSXuan Hu imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 58560f0c5aeSxiaofeibao imp.io.wakeupFromWB.zip( 58660f0c5aeSxiaofeibao wakeupFromIntWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 58760f0c5aeSxiaofeibao wakeupFromFpWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 588*c720aa49Ssinsanction wakeupFromVfWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 589*c720aa49Ssinsanction wakeupFromV0WBVec.zipWithIndex.filter(x => imp.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 590*c720aa49Ssinsanction wakeupFromVlWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq 59160f0c5aeSxiaofeibao ).foreach{ case (sink, source) => sink := source} 592f39a61a1SzhanglyGit 5932d270511Ssinsanction case _ => 5942d270511Ssinsanction } 595b7c799beSzhanglyGit val vecMemFeedbackIO: Seq[MemRSFeedbackIO] = vecMemIQs.map { 596b7c799beSzhanglyGit case imp: IssueQueueVecMemImp => 597b7c799beSzhanglyGit imp.io.memIO.get.feedbackIO 598b7c799beSzhanglyGit }.flatten 599b7c799beSzhanglyGit assert(vecMemFeedbackIO.size == io.fromMem.get.vstuFeedback.size, "vecMemFeedback size dont match!") 600b7c799beSzhanglyGit vecMemFeedbackIO.zip(io.fromMem.get.vstuFeedback).foreach{ 601b7c799beSzhanglyGit case (sink, source) => 602b7c799beSzhanglyGit sink := source 603b7c799beSzhanglyGit } 6042d270511Ssinsanction 605730cfbc0SXuan Hu val lsqEnqCtrl = Module(new LsqEnqCtrl) 606730cfbc0SXuan Hu 607730cfbc0SXuan Hu lsqEnqCtrl.io.redirect <> io.fromCtrlBlock.flush 608730cfbc0SXuan Hu lsqEnqCtrl.io.enq <> dispatch2Iq.io.enqLsqIO.get 609730cfbc0SXuan Hu lsqEnqCtrl.io.lcommit := io.fromMem.get.lcommit 610730cfbc0SXuan Hu lsqEnqCtrl.io.scommit := io.fromMem.get.scommit 611730cfbc0SXuan Hu lsqEnqCtrl.io.lqCancelCnt := io.fromMem.get.lqCancelCnt 612730cfbc0SXuan Hu lsqEnqCtrl.io.sqCancelCnt := io.fromMem.get.sqCancelCnt 613f3a9fb05SAnzo dispatch2Iq.io.lqFreeCount.get := lsqEnqCtrl.io.lqFreeCount 614f3a9fb05SAnzo dispatch2Iq.io.sqFreeCount.get := lsqEnqCtrl.io.sqFreeCount 615730cfbc0SXuan Hu io.memIO.get.lsqEnqIO <> lsqEnqCtrl.io.enqLsq 6167e471bf8SXuan Hu 6177e471bf8SXuan Hu dontTouch(io.vecLoadIssueResp) 618730cfbc0SXuan Hu} 619