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} 7e1a85e9fSchengguanghuiimport utils.{HasPerfEvents, OptionWrapper} 8730cfbc0SXuan Huimport xiangshan._ 910fe9778SXuan Huimport xiangshan.backend.Bundles._ 10c720aa49Ssinsanctionimport xiangshan.backend.datapath.DataConfig._ 11c720aa49Ssinsanctionimport 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} 16c720aa49Ssinsanctionimport xiangshan.backend.datapath.WbConfig.V0WB 17c720aa49Ssinsanctionimport xiangshan.backend.regfile.VlPregParams 18955b4beaSsinsanctionimport xiangshan.backend.regcache.RegCacheTagTable 19730cfbc0SXuan Hu 20730cfbc0SXuan Husealed trait SchedulerType 21730cfbc0SXuan Hu 22730cfbc0SXuan Hucase class IntScheduler() extends SchedulerType 2360f0c5aeSxiaofeibaocase class FpScheduler() extends SchedulerType 24730cfbc0SXuan Hucase class MemScheduler() extends SchedulerType 25730cfbc0SXuan Hucase class VfScheduler() extends SchedulerType 26730cfbc0SXuan Hucase class NoScheduler() extends SchedulerType 27730cfbc0SXuan Hu 28730cfbc0SXuan Huclass Scheduler(val params: SchdBlockParams)(implicit p: Parameters) extends LazyModule with HasXSParameter { 291ca4a39dSXuan Hu override def shouldBeInlined: Boolean = false 301ca4a39dSXuan Hu 3139c59369SXuan Hu val numIntStateWrite = backendParams.numPregWb(IntData()) 3260f0c5aeSxiaofeibao val numFpStateWrite = backendParams.numPregWb(FpData()) 3339c59369SXuan Hu val numVfStateWrite = backendParams.numPregWb(VecData()) 3407b5cc60Sxiaofeibao val numV0StateWrite = backendParams.numPregWb(V0Data()) 3507b5cc60Sxiaofeibao val numVlStateWrite = backendParams.numPregWb(VlData()) 36730cfbc0SXuan Hu 37730cfbc0SXuan Hu val dispatch2Iq = LazyModule(new Dispatch2Iq(params)) 38730cfbc0SXuan Hu val issueQueue = params.issueBlockParams.map(x => LazyModule(new IssueQueue(x).suggestName(x.getIQName))) 39730cfbc0SXuan Hu 4083ba63b3SXuan Hu lazy val module: SchedulerImpBase = params.schdType match { 41730cfbc0SXuan Hu case IntScheduler() => new SchedulerArithImp(this)(params, p) 4260f0c5aeSxiaofeibao case FpScheduler() => new SchedulerArithImp(this)(params, p) 43730cfbc0SXuan Hu case MemScheduler() => new SchedulerMemImp(this)(params, p) 44730cfbc0SXuan Hu case VfScheduler() => new SchedulerArithImp(this)(params, p) 45730cfbc0SXuan Hu case _ => null 46730cfbc0SXuan Hu } 47730cfbc0SXuan Hu} 48730cfbc0SXuan Hu 497f8233d5SHaojin Tangclass SchedulerIO()(implicit params: SchdBlockParams, p: Parameters) extends XSBundle { 5068d13085SXuan Hu // params alias 517f8233d5SHaojin Tang private val LoadQueueSize = VirtualLoadQueueSize 5268d13085SXuan Hu 53730cfbc0SXuan Hu val fromTop = new Bundle { 54730cfbc0SXuan Hu val hartId = Input(UInt(8.W)) 55730cfbc0SXuan Hu } 562e0a7dc5Sfdy val fromWbFuBusyTable = new Bundle{ 572e0a7dc5Sfdy val fuBusyTableRead = MixedVec(params.issueBlockParams.map(x => Input(x.genWbFuBusyTableReadBundle))) 582e0a7dc5Sfdy } 59dd970561SzhanglyGit val wbFuBusyTable = MixedVec(params.issueBlockParams.map(x => Output(x.genWbFuBusyTableWriteBundle))) 6082674533Sxiaofeibao val intIQValidNumVec = Output(MixedVec(backendParams.genIntIQValidNumBundle)) 6182674533Sxiaofeibao val fpIQValidNumVec = Output(MixedVec(backendParams.genFpIQValidNumBundle)) 62dd970561SzhanglyGit 63730cfbc0SXuan Hu val fromCtrlBlock = new Bundle { 64730cfbc0SXuan Hu val flush = Flipped(ValidIO(new Redirect)) 65730cfbc0SXuan Hu } 66730cfbc0SXuan Hu val fromDispatch = new Bundle { 67730cfbc0SXuan Hu val allocPregs = Vec(RenameWidth, Input(new ResetPregStateReq)) 68730cfbc0SXuan Hu val uops = Vec(params.numUopIn, Flipped(DecoupledIO(new DynInst))) 69730cfbc0SXuan Hu } 7039c59369SXuan Hu val intWriteBack = MixedVec(Vec(backendParams.numPregWb(IntData()), 71730cfbc0SXuan Hu new RfWritePortWithConfig(backendParams.intPregParams.dataCfg, backendParams.intPregParams.addrWidth))) 7260f0c5aeSxiaofeibao val fpWriteBack = MixedVec(Vec(backendParams.numPregWb(FpData()), 7360f0c5aeSxiaofeibao new RfWritePortWithConfig(backendParams.fpPregParams.dataCfg, backendParams.fpPregParams.addrWidth))) 7439c59369SXuan Hu val vfWriteBack = MixedVec(Vec(backendParams.numPregWb(VecData()), 75730cfbc0SXuan Hu new RfWritePortWithConfig(backendParams.vfPregParams.dataCfg, backendParams.vfPregParams.addrWidth))) 7607b5cc60Sxiaofeibao val v0WriteBack = MixedVec(Vec(backendParams.numPregWb(V0Data()), 77c720aa49Ssinsanction new RfWritePortWithConfig(backendParams.v0PregParams.dataCfg, backendParams.v0PregParams.addrWidth))) 7807b5cc60Sxiaofeibao val vlWriteBack = MixedVec(Vec(backendParams.numPregWb(VlData()), 79c720aa49Ssinsanction new RfWritePortWithConfig(backendParams.vlPregParams.dataCfg, backendParams.vlPregParams.addrWidth))) 8059ef6009Sxiaofeibao-xjtu val toDataPathAfterDelay: MixedVec[MixedVec[DecoupledIO[IssueQueueIssueBundle]]] = MixedVec(params.issueBlockParams.map(_.genIssueDecoupledBundle)) 81730cfbc0SXuan Hu 82c720aa49Ssinsanction val vlWriteBackInfo = new Bundle { 83b6279fc6SZiyue Zhang val vlIsZero = Input(Bool()) 84b6279fc6SZiyue Zhang val vlIsVlmax = Input(Bool()) 85b6279fc6SZiyue Zhang } 86b6279fc6SZiyue Zhang 87bf35baadSXuan Hu val fromSchedulers = new Bundle { 88c0be7f33SXuan Hu val wakeupVec: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpInValidBundle) 89bf35baadSXuan Hu } 90bf35baadSXuan Hu 91bf35baadSXuan Hu val toSchedulers = new Bundle { 92c0be7f33SXuan Hu val wakeupVec: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = params.genIQWakeUpOutValidBundle 93bf35baadSXuan Hu } 94bf35baadSXuan Hu 95c0be7f33SXuan Hu val fromDataPath = new Bundle { 9610fe9778SXuan Hu val resp: MixedVec[MixedVec[OGRespBundle]] = MixedVec(params.issueBlockParams.map(x => Flipped(x.genOGRespBundle))) 97be9ff987Ssinsanction val og0Cancel = Input(ExuVec()) 98ea46c302SXuan Hu // Todo: remove this after no cancel signal from og1 99be9ff987Ssinsanction val og1Cancel = Input(ExuVec()) 100f8b278aaSsinsanction // replace RCIdx to Wakeup Queue 101f8b278aaSsinsanction val replaceRCIdx = OptionWrapper(params.needWriteRegCache, Vec(params.numWriteRegCache, Input(UInt(RegCacheIdxWidth.W)))) 102c0be7f33SXuan Hu // just be compatible to old code 103c0be7f33SXuan Hu def apply(i: Int)(j: Int) = resp(i)(j) 104c0be7f33SXuan Hu } 105c0be7f33SXuan Hu 1068a66c02cSXuan Hu val loadFinalIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.LdExuCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x))))))) 1078a66c02cSXuan Hu val memAddrIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.LdExuCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x))))))) 1087e471bf8SXuan Hu val vecLoadIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.VlduCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x))))))) 1090f55a0d3SHaojin Tang 1106810d1e8Ssfencevma val ldCancel = Vec(backendParams.LduCnt + backendParams.HyuCnt, Flipped(new LoadCancelIO)) 111c0be7f33SXuan Hu 112730cfbc0SXuan Hu val memIO = if (params.isMemSchd) Some(new Bundle { 113730cfbc0SXuan Hu val lsqEnqIO = Flipped(new LsqEnqIO) 114730cfbc0SXuan Hu }) else None 115730cfbc0SXuan Hu val fromMem = if (params.isMemSchd) Some(new Bundle { 1167b753bebSXuan Hu val ldaFeedback = Flipped(Vec(params.LduCnt, new MemRSFeedbackIO)) 1177b753bebSXuan Hu val staFeedback = Flipped(Vec(params.StaCnt, new MemRSFeedbackIO)) 1188f1fa9b1Ssfencevma val hyuFeedback = Flipped(Vec(params.HyuCnt, new MemRSFeedbackIO)) 119fd490615Sweiding liu val vstuFeedback = Flipped(Vec(params.VstuCnt, new MemRSFeedbackIO(isVector = true))) 120fd490615Sweiding liu val vlduFeedback = Flipped(Vec(params.VlduCnt, new MemRSFeedbackIO(isVector = true))) 121730cfbc0SXuan Hu val stIssuePtr = Input(new SqPtr()) 122730cfbc0SXuan Hu val lcommit = Input(UInt(log2Up(CommitWidth + 1).W)) 123730cfbc0SXuan Hu val scommit = Input(UInt(log2Ceil(EnsbufferWidth + 1).W)) // connected to `memBlock.io.sqDeq` instead of ROB 124fc45ed13SXuan Hu val wakeup = Vec(params.LdExuCnt, Flipped(Valid(new DynInst))) 1252d270511Ssinsanction val lqDeqPtr = Input(new LqPtr) 1262d270511Ssinsanction val sqDeqPtr = Input(new SqPtr) 127730cfbc0SXuan Hu // from lsq 128730cfbc0SXuan Hu val lqCancelCnt = Input(UInt(log2Up(LoadQueueSize + 1).W)) 129730cfbc0SXuan Hu val sqCancelCnt = Input(UInt(log2Up(StoreQueueSize + 1).W)) 130730cfbc0SXuan Hu val memWaitUpdateReq = Flipped(new MemWaitUpdateReq) 131730cfbc0SXuan Hu }) else None 132730cfbc0SXuan Hu val toMem = if (params.isMemSchd) Some(new Bundle { 133730cfbc0SXuan Hu val loadFastMatch = Output(Vec(params.LduCnt, new IssueQueueLoadBundle)) 134730cfbc0SXuan Hu }) else None 135*42b6cdf9Ssinsanction val fromOg2Resp = if(params.needOg2Resp) Some(MixedVec(params.issueBlockParams.filter(_.needOg2Resp).map(x => Flipped(x.genOG2RespBundle)))) else None 136730cfbc0SXuan Hu} 137730cfbc0SXuan Hu 138730cfbc0SXuan Huabstract class SchedulerImpBase(wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters) 139730cfbc0SXuan Hu extends LazyModuleImp(wrapper) 140730cfbc0SXuan Hu with HasXSParameter 141730cfbc0SXuan Hu{ 142730cfbc0SXuan Hu val io = IO(new SchedulerIO()) 143730cfbc0SXuan Hu 144730cfbc0SXuan Hu // alias 145c0be7f33SXuan Hu private val iqWakeUpInMap: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] = 146c0be7f33SXuan Hu io.fromSchedulers.wakeupVec.map(x => (x.bits.exuIdx, x)).toMap 147730cfbc0SXuan Hu private val schdType = params.schdType 148730cfbc0SXuan Hu 149730cfbc0SXuan Hu // Modules 150730cfbc0SXuan Hu val dispatch2Iq: Dispatch2IqImp = wrapper.dispatch2Iq.module 151730cfbc0SXuan Hu val issueQueues: Seq[IssueQueueImp] = wrapper.issueQueue.map(_.module) 15282674533Sxiaofeibao io.intIQValidNumVec := 0.U.asTypeOf(io.intIQValidNumVec) 15382674533Sxiaofeibao io.fpIQValidNumVec := 0.U.asTypeOf(io.fpIQValidNumVec) 154ff3fcdf1Sxiaofeibao-xjtu if (params.isIntSchd) { 15582674533Sxiaofeibao dispatch2Iq.io.intIQValidNumVec.get := io.intIQValidNumVec 15682674533Sxiaofeibao io.intIQValidNumVec := MixedVecInit(issueQueues.map(_.io.validCntDeqVec)) 157ff3fcdf1Sxiaofeibao-xjtu } 15882674533Sxiaofeibao else if (params.isFpSchd) { 15982674533Sxiaofeibao dispatch2Iq.io.fpIQValidNumVec.get := io.fpIQValidNumVec 16082674533Sxiaofeibao io.fpIQValidNumVec := MixedVecInit(issueQueues.map(_.io.validCntDeqVec)) 16182674533Sxiaofeibao } 162730cfbc0SXuan Hu 16356bcaed7SHaojin Tang // valid count 16456bcaed7SHaojin Tang dispatch2Iq.io.iqValidCnt := issueQueues.filter(_.params.StdCnt == 0).map(_.io.status.validCnt) 16556bcaed7SHaojin Tang 166730cfbc0SXuan Hu // BusyTable Modules 167730cfbc0SXuan Hu val intBusyTable = schdType match { 168bc7d6943SzhanglyGit case IntScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numIntStateRead, wrapper.numIntStateWrite, IntPhyRegs, IntWB()))) 169730cfbc0SXuan Hu case _ => None 170730cfbc0SXuan Hu } 17160f0c5aeSxiaofeibao val fpBusyTable = schdType match { 17260f0c5aeSxiaofeibao case FpScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numFpStateRead, wrapper.numFpStateWrite, FpPhyRegs, FpWB()))) 17360f0c5aeSxiaofeibao case _ => None 17460f0c5aeSxiaofeibao } 175730cfbc0SXuan Hu val vfBusyTable = schdType match { 176bc7d6943SzhanglyGit case VfScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numVfStateRead, wrapper.numVfStateWrite, VfPhyRegs, VfWB()))) 177730cfbc0SXuan Hu case _ => None 178730cfbc0SXuan Hu } 179c720aa49Ssinsanction val v0BusyTable = schdType match { 180c720aa49Ssinsanction case VfScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numV0StateRead, wrapper.numV0StateWrite, V0PhyRegs, V0WB()))) 181c720aa49Ssinsanction case _ => None 182c720aa49Ssinsanction } 183c720aa49Ssinsanction val vlBusyTable = schdType match { 184c720aa49Ssinsanction case VfScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numVlStateRead, wrapper.numVlStateWrite, VlPhyRegs, VlWB()))) 185c720aa49Ssinsanction case _ => None 186c720aa49Ssinsanction } 187730cfbc0SXuan Hu 188955b4beaSsinsanction // RegCacheTagTable Module 189955b4beaSsinsanction val rcTagTable = schdType match { 190955b4beaSsinsanction case IntScheduler() | MemScheduler() => Some(Module(new RegCacheTagTable(dispatch2Iq.numRCTagTableStateRead))) 191955b4beaSsinsanction case _ => None 192955b4beaSsinsanction } 193955b4beaSsinsanction 194730cfbc0SXuan Hu dispatch2Iq.io match { case dp2iq => 195730cfbc0SXuan Hu dp2iq.redirect <> io.fromCtrlBlock.flush 196730cfbc0SXuan Hu dp2iq.in <> io.fromDispatch.uops 197730cfbc0SXuan Hu dp2iq.readIntState.foreach(_ <> intBusyTable.get.io.read) 19860f0c5aeSxiaofeibao dp2iq.readFpState.foreach(_ <> fpBusyTable.get.io.read) 199730cfbc0SXuan Hu dp2iq.readVfState.foreach(_ <> vfBusyTable.get.io.read) 200c720aa49Ssinsanction dp2iq.readV0State.foreach(_ <> v0BusyTable.get.io.read) 201c720aa49Ssinsanction dp2iq.readVlState.foreach(_ <> vlBusyTable.get.io.read) 202955b4beaSsinsanction dp2iq.readRCTagTableState.foreach(_ <> rcTagTable.get.io.readPorts) 203730cfbc0SXuan Hu } 204730cfbc0SXuan Hu 205730cfbc0SXuan Hu intBusyTable match { 206730cfbc0SXuan Hu case Some(bt) => 207730cfbc0SXuan Hu bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) => 208730cfbc0SXuan Hu btAllocPregs.valid := dpAllocPregs.isInt 209730cfbc0SXuan Hu btAllocPregs.bits := dpAllocPregs.preg 210730cfbc0SXuan Hu } 211730cfbc0SXuan Hu bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) => 212730cfbc0SXuan Hu wb.valid := io.intWriteBack(i).wen && io.intWriteBack(i).intWen 213730cfbc0SXuan Hu wb.bits := io.intWriteBack(i).addr 214730cfbc0SXuan Hu } 215bc7d6943SzhanglyGit bt.io.wakeUp := io.fromSchedulers.wakeupVec 21637080bd8Ssinsanction bt.io.og0Cancel := io.fromDataPath.og0Cancel 21713551487SzhanglyGit bt.io.ldCancel := io.ldCancel 218730cfbc0SXuan Hu case None => 219730cfbc0SXuan Hu } 220730cfbc0SXuan Hu 22160f0c5aeSxiaofeibao fpBusyTable match { 222730cfbc0SXuan Hu case Some(bt) => 223730cfbc0SXuan Hu bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) => 224730cfbc0SXuan Hu btAllocPregs.valid := dpAllocPregs.isFp 225730cfbc0SXuan Hu btAllocPregs.bits := dpAllocPregs.preg 226730cfbc0SXuan Hu } 227730cfbc0SXuan Hu bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) => 22860f0c5aeSxiaofeibao wb.valid := io.fpWriteBack(i).wen && io.fpWriteBack(i).fpWen 22960f0c5aeSxiaofeibao wb.bits := io.fpWriteBack(i).addr 23060f0c5aeSxiaofeibao } 23160f0c5aeSxiaofeibao bt.io.wakeUp := io.fromSchedulers.wakeupVec 23237080bd8Ssinsanction bt.io.og0Cancel := io.fromDataPath.og0Cancel 23360f0c5aeSxiaofeibao bt.io.ldCancel := io.ldCancel 23460f0c5aeSxiaofeibao case None => 23560f0c5aeSxiaofeibao } 23660f0c5aeSxiaofeibao 23760f0c5aeSxiaofeibao vfBusyTable match { 23860f0c5aeSxiaofeibao case Some(bt) => 23960f0c5aeSxiaofeibao bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) => 24060f0c5aeSxiaofeibao btAllocPregs.valid := dpAllocPregs.isVec 24160f0c5aeSxiaofeibao btAllocPregs.bits := dpAllocPregs.preg 24260f0c5aeSxiaofeibao } 24360f0c5aeSxiaofeibao bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) => 24460f0c5aeSxiaofeibao wb.valid := io.vfWriteBack(i).wen && io.vfWriteBack(i).vecWen 245730cfbc0SXuan Hu wb.bits := io.vfWriteBack(i).addr 246730cfbc0SXuan Hu } 247bc7d6943SzhanglyGit bt.io.wakeUp := io.fromSchedulers.wakeupVec 24837080bd8Ssinsanction bt.io.og0Cancel := io.fromDataPath.og0Cancel 24913551487SzhanglyGit bt.io.ldCancel := io.ldCancel 250730cfbc0SXuan Hu case None => 251730cfbc0SXuan Hu } 252730cfbc0SXuan Hu 253c720aa49Ssinsanction v0BusyTable match { 254c720aa49Ssinsanction case Some(bt) => 255c720aa49Ssinsanction bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) => 25629aa55c1Sxiaofeibao btAllocPregs.valid := dpAllocPregs.isV0 257c720aa49Ssinsanction btAllocPregs.bits := dpAllocPregs.preg 258c720aa49Ssinsanction } 259c720aa49Ssinsanction bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) => 260c720aa49Ssinsanction wb.valid := io.v0WriteBack(i).wen && io.v0WriteBack(i).v0Wen 261c720aa49Ssinsanction wb.bits := io.v0WriteBack(i).addr 262c720aa49Ssinsanction } 263c720aa49Ssinsanction bt.io.wakeUp := io.fromSchedulers.wakeupVec 26437080bd8Ssinsanction bt.io.og0Cancel := io.fromDataPath.og0Cancel 265c720aa49Ssinsanction bt.io.ldCancel := io.ldCancel 266c720aa49Ssinsanction case None => 267c720aa49Ssinsanction } 268c720aa49Ssinsanction 269c720aa49Ssinsanction vlBusyTable match { 270c720aa49Ssinsanction case Some(bt) => 271c720aa49Ssinsanction bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) => 27229aa55c1Sxiaofeibao btAllocPregs.valid := dpAllocPregs.isVl 273c720aa49Ssinsanction btAllocPregs.bits := dpAllocPregs.preg 274c720aa49Ssinsanction } 275c720aa49Ssinsanction bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) => 276c720aa49Ssinsanction wb.valid := io.vlWriteBack(i).wen && io.vlWriteBack(i).vlWen 277c720aa49Ssinsanction wb.bits := io.vlWriteBack(i).addr 278c720aa49Ssinsanction } 279c720aa49Ssinsanction bt.io.wakeUp := io.fromSchedulers.wakeupVec 28037080bd8Ssinsanction bt.io.og0Cancel := io.fromDataPath.og0Cancel 281c720aa49Ssinsanction bt.io.ldCancel := io.ldCancel 282c720aa49Ssinsanction case None => 283c720aa49Ssinsanction } 284c720aa49Ssinsanction 285955b4beaSsinsanction rcTagTable match { 286955b4beaSsinsanction case Some(rct) => 287955b4beaSsinsanction rct.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) => 288955b4beaSsinsanction btAllocPregs.valid := dpAllocPregs.isInt 289955b4beaSsinsanction btAllocPregs.bits := dpAllocPregs.preg 290955b4beaSsinsanction } 291955b4beaSsinsanction rct.io.wakeupFromIQ := io.fromSchedulers.wakeupVec 292955b4beaSsinsanction rct.io.og0Cancel := io.fromDataPath.og0Cancel 293955b4beaSsinsanction rct.io.ldCancel := io.ldCancel 294955b4beaSsinsanction case None => 295955b4beaSsinsanction } 296955b4beaSsinsanction 297f39a61a1SzhanglyGit val wakeupFromIntWBVec = Wire(params.genIntWBWakeUpSinkValidBundle) 29860f0c5aeSxiaofeibao val wakeupFromFpWBVec = Wire(params.genFpWBWakeUpSinkValidBundle) 299f39a61a1SzhanglyGit val wakeupFromVfWBVec = Wire(params.genVfWBWakeUpSinkValidBundle) 300c720aa49Ssinsanction val wakeupFromV0WBVec = Wire(params.genV0WBWakeUpSinkValidBundle) 301c720aa49Ssinsanction val wakeupFromVlWBVec = Wire(params.genVlWBWakeUpSinkValidBundle) 302f39a61a1SzhanglyGit 303f39a61a1SzhanglyGit wakeupFromIntWBVec.zip(io.intWriteBack).foreach { case (sink, source) => 304f39a61a1SzhanglyGit sink.valid := source.wen 305f39a61a1SzhanglyGit sink.bits.rfWen := source.intWen 306f39a61a1SzhanglyGit sink.bits.fpWen := source.fpWen 307f39a61a1SzhanglyGit sink.bits.vecWen := source.vecWen 308c720aa49Ssinsanction sink.bits.v0Wen := source.v0Wen 309c720aa49Ssinsanction sink.bits.vlWen := source.vlWen 310f39a61a1SzhanglyGit sink.bits.pdest := source.addr 311730cfbc0SXuan Hu } 312f39a61a1SzhanglyGit 31360f0c5aeSxiaofeibao wakeupFromFpWBVec.zip(io.fpWriteBack).foreach { case (sink, source) => 31460f0c5aeSxiaofeibao sink.valid := source.wen 31560f0c5aeSxiaofeibao sink.bits.rfWen := source.intWen 31660f0c5aeSxiaofeibao sink.bits.fpWen := source.fpWen 31760f0c5aeSxiaofeibao sink.bits.vecWen := source.vecWen 318c720aa49Ssinsanction sink.bits.v0Wen := source.v0Wen 319c720aa49Ssinsanction sink.bits.vlWen := source.vlWen 32060f0c5aeSxiaofeibao sink.bits.pdest := source.addr 32160f0c5aeSxiaofeibao } 32260f0c5aeSxiaofeibao 323f39a61a1SzhanglyGit wakeupFromVfWBVec.zip(io.vfWriteBack).foreach { case (sink, source) => 324730cfbc0SXuan Hu sink.valid := source.wen 325730cfbc0SXuan Hu sink.bits.rfWen := source.intWen 326730cfbc0SXuan Hu sink.bits.fpWen := source.fpWen 327730cfbc0SXuan Hu sink.bits.vecWen := source.vecWen 328c720aa49Ssinsanction sink.bits.v0Wen := source.v0Wen 329c720aa49Ssinsanction sink.bits.vlWen := source.vlWen 330c720aa49Ssinsanction sink.bits.pdest := source.addr 331c720aa49Ssinsanction } 332c720aa49Ssinsanction 333c720aa49Ssinsanction wakeupFromV0WBVec.zip(io.v0WriteBack).foreach { case (sink, source) => 334c720aa49Ssinsanction sink.valid := source.wen 335c720aa49Ssinsanction sink.bits.rfWen := source.intWen 336c720aa49Ssinsanction sink.bits.fpWen := source.fpWen 337c720aa49Ssinsanction sink.bits.vecWen := source.vecWen 338c720aa49Ssinsanction sink.bits.v0Wen := source.v0Wen 339c720aa49Ssinsanction sink.bits.vlWen := source.vlWen 340c720aa49Ssinsanction sink.bits.pdest := source.addr 341c720aa49Ssinsanction } 342c720aa49Ssinsanction 343c720aa49Ssinsanction wakeupFromVlWBVec.zip(io.vlWriteBack).foreach { case (sink, source) => 344c720aa49Ssinsanction sink.valid := source.wen 345c720aa49Ssinsanction sink.bits.rfWen := source.intWen 346c720aa49Ssinsanction sink.bits.fpWen := source.fpWen 347c720aa49Ssinsanction sink.bits.vecWen := source.vecWen 348c720aa49Ssinsanction sink.bits.v0Wen := source.v0Wen 349c720aa49Ssinsanction sink.bits.vlWen := source.vlWen 350730cfbc0SXuan Hu sink.bits.pdest := source.addr 351730cfbc0SXuan Hu } 352730cfbc0SXuan Hu 353bf35baadSXuan Hu // Connect bundles having the same wakeup source 35459ef6009Sxiaofeibao-xjtu issueQueues.zipWithIndex.foreach { case(iq, i) => 355bf35baadSXuan Hu iq.io.wakeupFromIQ.foreach { wakeUp => 3560c7ebb58Sxiaofeibao-xjtu val wakeUpIn = iqWakeUpInMap(wakeUp.bits.exuIdx) 3570c7ebb58Sxiaofeibao-xjtu val exuIdx = wakeUp.bits.exuIdx 3580c7ebb58Sxiaofeibao-xjtu println(s"[Backend] Connect wakeup exuIdx ${exuIdx}") 3590c7ebb58Sxiaofeibao-xjtu connectSamePort(wakeUp,wakeUpIn) 3600c7ebb58Sxiaofeibao-xjtu backendParams.connectWakeup(exuIdx) 3610c7ebb58Sxiaofeibao-xjtu if (backendParams.isCopyPdest(exuIdx)) { 3620c7ebb58Sxiaofeibao-xjtu println(s"[Backend] exuIdx ${exuIdx} use pdestCopy ${backendParams.getCopyPdestIndex(exuIdx)}") 3630c7ebb58Sxiaofeibao-xjtu wakeUp.bits.pdest := wakeUpIn.bits.pdestCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 3644c5a0d77Sxiaofeibao-xjtu if (wakeUpIn.bits.rfWenCopy.nonEmpty) wakeUp.bits.rfWen := wakeUpIn.bits.rfWenCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 3654c5a0d77Sxiaofeibao-xjtu if (wakeUpIn.bits.fpWenCopy.nonEmpty) wakeUp.bits.fpWen := wakeUpIn.bits.fpWenCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 3664c5a0d77Sxiaofeibao-xjtu if (wakeUpIn.bits.vecWenCopy.nonEmpty) wakeUp.bits.vecWen := wakeUpIn.bits.vecWenCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 367c720aa49Ssinsanction if (wakeUpIn.bits.v0WenCopy.nonEmpty) wakeUp.bits.v0Wen := wakeUpIn.bits.v0WenCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 368c720aa49Ssinsanction if (wakeUpIn.bits.vlWenCopy.nonEmpty) wakeUp.bits.vlWen := wakeUpIn.bits.vlWenCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 3694c5a0d77Sxiaofeibao-xjtu if (wakeUpIn.bits.loadDependencyCopy.nonEmpty) wakeUp.bits.loadDependency := wakeUpIn.bits.loadDependencyCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 3700c7ebb58Sxiaofeibao-xjtu } 37160912d84Sxiaofeibao-xjtu if (iq.params.numIntSrc == 0) wakeUp.bits.rfWen := false.B 37260f0c5aeSxiaofeibao if (iq.params.numFpSrc == 0) wakeUp.bits.fpWen := false.B 37360912d84Sxiaofeibao-xjtu if (iq.params.numVfSrc == 0) wakeUp.bits.vecWen := false.B 374c720aa49Ssinsanction if (iq.params.numV0Src == 0) wakeUp.bits.v0Wen := false.B 375c720aa49Ssinsanction if (iq.params.numVlSrc == 0) wakeUp.bits.vlWen := false.B 376bf35baadSXuan Hu } 377ea46c302SXuan Hu iq.io.og0Cancel := io.fromDataPath.og0Cancel 378ea46c302SXuan Hu iq.io.og1Cancel := io.fromDataPath.og1Cancel 379e600b1ddSxiaofeibao-xjtu if (iq.params.needLoadDependency) 3800f55a0d3SHaojin Tang iq.io.ldCancel := io.ldCancel 381e600b1ddSxiaofeibao-xjtu else 382e600b1ddSxiaofeibao-xjtu iq.io.ldCancel := 0.U.asTypeOf(io.ldCancel) 383bf35baadSXuan Hu } 384bf35baadSXuan Hu 385b6279fc6SZiyue Zhang // connect the vl writeback informatino to the issue queues 386b6279fc6SZiyue Zhang issueQueues.zipWithIndex.foreach { case(iq, i) => 387c720aa49Ssinsanction iq.io.vlIsVlmax := io.vlWriteBackInfo.vlIsVlmax 388c720aa49Ssinsanction iq.io.vlIsZero := io.vlWriteBackInfo.vlIsZero 389b6279fc6SZiyue Zhang } 390b6279fc6SZiyue Zhang 391c0be7f33SXuan Hu private val iqWakeUpOutMap: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] = 392bf35baadSXuan Hu issueQueues.flatMap(_.io.wakeupToIQ) 393c0be7f33SXuan Hu .map(x => (x.bits.exuIdx, x)) 394bf35baadSXuan Hu .toMap 395bf35baadSXuan Hu 396bf35baadSXuan Hu // Connect bundles having the same wakeup source 397bf35baadSXuan Hu io.toSchedulers.wakeupVec.foreach { wakeUp => 398c0be7f33SXuan Hu wakeUp := iqWakeUpOutMap(wakeUp.bits.exuIdx) 399bf35baadSXuan Hu } 400bf35baadSXuan Hu 40159ef6009Sxiaofeibao-xjtu io.toDataPathAfterDelay.zipWithIndex.foreach { case (toDpDy, i) => 40259ef6009Sxiaofeibao-xjtu toDpDy <> issueQueues(i).io.deqDelay 40359ef6009Sxiaofeibao-xjtu } 404bf35baadSXuan Hu 405f99b81adSHaojin Tang // Response 406f99b81adSHaojin Tang issueQueues.zipWithIndex.foreach { case (iq, i) => 407f99b81adSHaojin Tang iq.io.og0Resp.zipWithIndex.foreach { case (og0Resp, j) => 408f99b81adSHaojin Tang og0Resp := io.fromDataPath(i)(j).og0resp 409f99b81adSHaojin Tang } 410f99b81adSHaojin Tang iq.io.og1Resp.zipWithIndex.foreach { case (og1Resp, j) => 411f99b81adSHaojin Tang og1Resp := io.fromDataPath(i)(j).og1resp 412f99b81adSHaojin Tang } 413f99b81adSHaojin Tang iq.io.finalIssueResp.foreach(_.zipWithIndex.foreach { case (finalIssueResp, j) => 414670870b3SXuan Hu if (io.loadFinalIssueResp(i).isDefinedAt(j)) { 415f99b81adSHaojin Tang finalIssueResp := io.loadFinalIssueResp(i)(j) 416670870b3SXuan Hu } else { 417670870b3SXuan Hu finalIssueResp := 0.U.asTypeOf(finalIssueResp) 418670870b3SXuan Hu } 419f99b81adSHaojin Tang }) 420e8800897SXuan Hu iq.io.memAddrIssueResp.foreach(_.zipWithIndex.foreach { case (memAddrIssueResp, j) => 421aa2bcc31SzhanglyGit if (io.memAddrIssueResp(i).isDefinedAt(j)) { 422e8800897SXuan Hu memAddrIssueResp := io.memAddrIssueResp(i)(j) 423aa2bcc31SzhanglyGit } else { 424aa2bcc31SzhanglyGit memAddrIssueResp := 0.U.asTypeOf(memAddrIssueResp) 425aa2bcc31SzhanglyGit } 426e8800897SXuan Hu }) 4277e471bf8SXuan Hu iq.io.vecLoadIssueResp.foreach(_.zipWithIndex.foreach { case (resp, deqIdx) => 4287e471bf8SXuan Hu resp := io.vecLoadIssueResp(i)(deqIdx) 4297e471bf8SXuan Hu }) 430f99b81adSHaojin Tang iq.io.wbBusyTableRead := io.fromWbFuBusyTable.fuBusyTableRead(i) 431f99b81adSHaojin Tang io.wbFuBusyTable(i) := iq.io.wbBusyTableWrite 432f8b278aaSsinsanction iq.io.replaceRCIdx.foreach(x => x := 0.U.asTypeOf(x)) 433f8b278aaSsinsanction } 434*42b6cdf9Ssinsanction if (params.needOg2Resp) { 435*42b6cdf9Ssinsanction issueQueues.filter(_.params.needOg2Resp).zip(io.fromOg2Resp.get).foreach{ case (iq, og2RespVec) => 436*42b6cdf9Ssinsanction iq.io.og2Resp.get.zip(og2RespVec).foreach{ case (iqOg2Resp, og2Resp) => 437*42b6cdf9Ssinsanction iqOg2Resp := og2Resp 438*42b6cdf9Ssinsanction } 439*42b6cdf9Ssinsanction } 440*42b6cdf9Ssinsanction } 441f8b278aaSsinsanction 442f8b278aaSsinsanction // Connect each replace RCIdx to IQ 443f8b278aaSsinsanction if (params.needWriteRegCache) { 444f8b278aaSsinsanction val iqReplaceRCIdxVec = issueQueues.filter(_.params.needWriteRegCache).flatMap{ iq => 445f8b278aaSsinsanction iq.params.allExuParams.zip(iq.io.replaceRCIdx.get).filter(_._1.needWriteRegCache).map(_._2) 446f8b278aaSsinsanction } 447f8b278aaSsinsanction iqReplaceRCIdxVec.zip(io.fromDataPath.replaceRCIdx.get).foreach{ case (iq, in) => 448f8b278aaSsinsanction iq := in 449f8b278aaSsinsanction } 450f8b278aaSsinsanction 451f8b278aaSsinsanction println(s"[Scheduler] numWriteRegCache: ${params.numWriteRegCache}") 452f8b278aaSsinsanction println(s"[Scheduler] iqReplaceRCIdxVec: ${iqReplaceRCIdxVec.size}") 453f99b81adSHaojin Tang } 454f99b81adSHaojin Tang 455e1a85e9fSchengguanghui // perfEvent 456e1a85e9fSchengguanghui val lastCycleDp2IqOutFireVec = RegNext(VecInit(dispatch2Iq.io.out.flatten.map(_.fire))) 457e1a85e9fSchengguanghui val lastCycleIqEnqFireVec = RegNext(VecInit(issueQueues.map(_.io.enq.map(_.fire)).flatten)) 458e1a85e9fSchengguanghui val lastCycleIqFullVec = RegNext(VecInit(issueQueues.map(_.io.enq.head.ready))) 459e1a85e9fSchengguanghui 460e1a85e9fSchengguanghui val issueQueueFullVecPerf = issueQueues.zip(lastCycleIqFullVec)map{ case (iq, full) => (iq.params.getIQName + s"_full", full) } 461e1a85e9fSchengguanghui val basePerfEvents = Seq( 462e1a85e9fSchengguanghui ("dispatch2Iq_out_fire_cnt", PopCount(lastCycleDp2IqOutFireVec) ), 463e1a85e9fSchengguanghui ("issueQueue_enq_fire_cnt", PopCount(lastCycleIqEnqFireVec) ) 464e1a85e9fSchengguanghui ) ++ issueQueueFullVecPerf 465e1a85e9fSchengguanghui 466c0be7f33SXuan Hu println(s"[Scheduler] io.fromSchedulers.wakeupVec: ${io.fromSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}") 467bf35baadSXuan Hu println(s"[Scheduler] iqWakeUpInKeys: ${iqWakeUpInMap.keys}") 468bf35baadSXuan Hu 469bf35baadSXuan Hu println(s"[Scheduler] iqWakeUpOutKeys: ${iqWakeUpOutMap.keys}") 470c0be7f33SXuan Hu println(s"[Scheduler] io.toSchedulers.wakeupVec: ${io.toSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}") 471730cfbc0SXuan Hu} 472730cfbc0SXuan Hu 473730cfbc0SXuan Huclass SchedulerArithImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters) 474730cfbc0SXuan Hu extends SchedulerImpBase(wrapper) 475730cfbc0SXuan Hu with HasXSParameter 476e1a85e9fSchengguanghui with HasPerfEvents 477730cfbc0SXuan Hu{ 4782e0a7dc5Sfdy// dontTouch(io.vfWbFuBusyTable) 479730cfbc0SXuan Hu println(s"[SchedulerArithImp] " + 480730cfbc0SXuan Hu s"has intBusyTable: ${intBusyTable.nonEmpty}, " + 481730cfbc0SXuan Hu s"has vfBusyTable: ${vfBusyTable.nonEmpty}") 482730cfbc0SXuan Hu 483730cfbc0SXuan Hu issueQueues.zipWithIndex.foreach { case (iq, i) => 484730cfbc0SXuan Hu iq.io.flush <> io.fromCtrlBlock.flush 485730cfbc0SXuan Hu iq.io.enq <> dispatch2Iq.io.out(i) 486e600b1ddSxiaofeibao-xjtu if (!iq.params.needLoadDependency) { 487e600b1ddSxiaofeibao-xjtu iq.io.enq.map(x => x.bits.srcLoadDependency := 0.U.asTypeOf(x.bits.srcLoadDependency)) 488e600b1ddSxiaofeibao-xjtu } 489f39a61a1SzhanglyGit val intWBIQ = params.schdType match { 490f39a61a1SzhanglyGit case IntScheduler() => wakeupFromIntWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1) 49160f0c5aeSxiaofeibao case FpScheduler() => wakeupFromFpWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1) 492c720aa49Ssinsanction case VfScheduler() => (wakeupFromVfWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 493c720aa49Ssinsanction wakeupFromV0WBVec.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 494c720aa49Ssinsanction wakeupFromVlWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1)) 495596af5d2SHaojin Tang case _ => null 496f39a61a1SzhanglyGit } 497f39a61a1SzhanglyGit iq.io.wakeupFromWB.zip(intWBIQ).foreach{ case (sink, source) => sink := source} 498730cfbc0SXuan Hu } 499e1a85e9fSchengguanghui 500e1a85e9fSchengguanghui val perfEvents = basePerfEvents 501e1a85e9fSchengguanghui generatePerfEvent() 502730cfbc0SXuan Hu} 503730cfbc0SXuan Hu 504f99b81adSHaojin Tang// FIXME: Vector mem instructions may not be handled properly! 505730cfbc0SXuan Huclass SchedulerMemImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters) 506730cfbc0SXuan Hu extends SchedulerImpBase(wrapper) 507730cfbc0SXuan Hu with HasXSParameter 508e1a85e9fSchengguanghui with HasPerfEvents 509730cfbc0SXuan Hu{ 510730cfbc0SXuan Hu println(s"[SchedulerMemImp] " + 511730cfbc0SXuan Hu s"has intBusyTable: ${intBusyTable.nonEmpty}, " + 512730cfbc0SXuan Hu s"has vfBusyTable: ${vfBusyTable.nonEmpty}") 513730cfbc0SXuan Hu 514559c1710SHaojin Tang val memAddrIQs = issueQueues.filter(_.params.isMemAddrIQ) 515e07131b2Ssinsanction val stAddrIQs = issueQueues.filter(iq => iq.params.StaCnt > 0) // included in memAddrIQs 516e07131b2Ssinsanction val ldAddrIQs = issueQueues.filter(iq => iq.params.LduCnt > 0) 517e07131b2Ssinsanction val stDataIQs = issueQueues.filter(iq => iq.params.StdCnt > 0) 518559c1710SHaojin Tang val vecMemIQs = issueQueues.filter(_.params.isVecMemIQ) 519559c1710SHaojin Tang val (hyuIQs, hyuIQIdxs) = issueQueues.zipWithIndex.filter(_._1.params.HyuCnt > 0).unzip 520499caf4cSXuan Hu 521499caf4cSXuan Hu println(s"[SchedulerMemImp] memAddrIQs.size: ${memAddrIQs.size}, enq.size: ${memAddrIQs.map(_.io.enq.size).sum}") 522499caf4cSXuan Hu println(s"[SchedulerMemImp] stAddrIQs.size: ${stAddrIQs.size }, enq.size: ${stAddrIQs.map(_.io.enq.size).sum}") 523499caf4cSXuan Hu println(s"[SchedulerMemImp] ldAddrIQs.size: ${ldAddrIQs.size }, enq.size: ${ldAddrIQs.map(_.io.enq.size).sum}") 524499caf4cSXuan Hu println(s"[SchedulerMemImp] stDataIQs.size: ${stDataIQs.size }, enq.size: ${stDataIQs.map(_.io.enq.size).sum}") 525499caf4cSXuan Hu println(s"[SchedulerMemImp] hyuIQs.size: ${hyuIQs.size }, enq.size: ${hyuIQs.map(_.io.enq.size).sum}") 526730cfbc0SXuan Hu require(memAddrIQs.nonEmpty && stDataIQs.nonEmpty) 527730cfbc0SXuan Hu 528853cd2d8SHaojin Tang io.toMem.get.loadFastMatch := 0.U.asTypeOf(io.toMem.get.loadFastMatch) // TODO: is still needed? 529853cd2d8SHaojin Tang 530fc45ed13SXuan Hu private val loadWakeUp = issueQueues.filter(_.params.LdExuCnt > 0).map(_.asInstanceOf[IssueQueueMemAddrImp].io.memIO.get.loadWakeUp).flatten 531596af5d2SHaojin Tang require(loadWakeUp.length == io.fromMem.get.wakeup.length) 532596af5d2SHaojin Tang loadWakeUp.zip(io.fromMem.get.wakeup).foreach(x => x._1 := x._2) 533596af5d2SHaojin Tang 534730cfbc0SXuan Hu memAddrIQs.zipWithIndex.foreach { case (iq, i) => 535730cfbc0SXuan Hu iq.io.flush <> io.fromCtrlBlock.flush 536730cfbc0SXuan Hu iq.io.enq <> dispatch2Iq.io.out(i) 537e600b1ddSxiaofeibao-xjtu if (!iq.params.needLoadDependency) { 538e600b1ddSxiaofeibao-xjtu iq.io.enq.map(x => x.bits.srcLoadDependency := 0.U.asTypeOf(x.bits.srcLoadDependency)) 539e600b1ddSxiaofeibao-xjtu } 54060f0c5aeSxiaofeibao iq.io.wakeupFromWB.zip( 54160f0c5aeSxiaofeibao wakeupFromIntWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 54260f0c5aeSxiaofeibao wakeupFromFpWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 543c720aa49Ssinsanction wakeupFromVfWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 544c720aa49Ssinsanction wakeupFromV0WBVec.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 545c720aa49Ssinsanction wakeupFromVlWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1) 54660f0c5aeSxiaofeibao ).foreach{ case (sink, source) => sink := source} 547730cfbc0SXuan Hu } 548730cfbc0SXuan Hu 549ecfc6f16SXuan Hu ldAddrIQs.zipWithIndex.foreach { 550ecfc6f16SXuan Hu case (imp: IssueQueueMemAddrImp, i) => 551ecfc6f16SXuan Hu imp.io.memIO.get.feedbackIO.head := 0.U.asTypeOf(imp.io.memIO.get.feedbackIO.head) 552c14e89f4SHaojin Tang imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr 553de784418SXuan Hu imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 5547b753bebSXuan Hu case _ => 5557b753bebSXuan Hu } 5567b753bebSXuan Hu 557ecfc6f16SXuan Hu stAddrIQs.zipWithIndex.foreach { 558ecfc6f16SXuan Hu case (imp: IssueQueueMemAddrImp, i) => 559ecfc6f16SXuan Hu imp.io.memIO.get.feedbackIO.head := io.fromMem.get.staFeedback(i) 560c14e89f4SHaojin Tang imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr 561c14e89f4SHaojin Tang imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 5627b753bebSXuan Hu case _ => 5637b753bebSXuan Hu } 564730cfbc0SXuan Hu 565559c1710SHaojin Tang hyuIQs.zip(hyuIQIdxs).foreach { 566559c1710SHaojin Tang case (imp: IssueQueueMemAddrImp, idx) => 567670870b3SXuan Hu imp.io.memIO.get.feedbackIO.head := io.fromMem.get.hyuFeedback.head 568670870b3SXuan Hu imp.io.memIO.get.feedbackIO(1) := 0.U.asTypeOf(imp.io.memIO.get.feedbackIO(1)) 5698f1fa9b1Ssfencevma imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr 5708f1fa9b1Ssfencevma imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 571559c1710SHaojin Tang // TODO: refactor ditry code 572559c1710SHaojin Tang imp.io.deqDelay(1).ready := false.B 573559c1710SHaojin Tang io.toDataPathAfterDelay(idx)(1).valid := false.B 574559c1710SHaojin Tang io.toDataPathAfterDelay(idx)(1).bits := 0.U.asTypeOf(io.toDataPathAfterDelay(idx)(1).bits) 5758f1fa9b1Ssfencevma case _ => 5768f1fa9b1Ssfencevma } 5778f1fa9b1Ssfencevma 578e62b6911SXuan Hu private val staIdxSeq = (stAddrIQs).map(iq => iq.params.idxInSchBlk) 579e62b6911SXuan Hu private val hyaIdxSeq = (hyuIQs).map(iq => iq.params.idxInSchBlk) 580e62b6911SXuan Hu 581e62b6911SXuan Hu println(s"[SchedulerMemImp] sta iq idx in memSchdBlock: $staIdxSeq") 582e62b6911SXuan Hu println(s"[SchedulerMemImp] hya iq idx in memSchdBlock: $hyaIdxSeq") 583e62b6911SXuan Hu 584e62b6911SXuan Hu private val staEnqs = stAddrIQs.map(_.io.enq).flatten 585e62b6911SXuan Hu private val stdEnqs = stDataIQs.map(_.io.enq).flatten.take(staEnqs.size) 586e62b6911SXuan Hu private val hyaEnqs = hyuIQs.map(_.io.enq).flatten 587e62b6911SXuan Hu private val hydEnqs = stDataIQs.map(_.io.enq).flatten.drop(staEnqs.size) 588e62b6911SXuan Hu 589e62b6911SXuan Hu require(staEnqs.size == stdEnqs.size, s"number of enq ports of store address IQs(${staEnqs.size}) " + 590e62b6911SXuan Hu s"should be equal to number of enq ports of store data IQs(${stdEnqs.size})") 591e62b6911SXuan Hu 592e62b6911SXuan Hu require(hyaEnqs.size == hydEnqs.size, s"number of enq ports of hybrid address IQs(${hyaEnqs.size}) " + 593e62b6911SXuan Hu s"should be equal to number of enq ports of hybrid data IQs(${hydEnqs.size})") 5949b258a00Sxgkiri 5950438e8f4SHaojin Tang val d2IqStaOut = dispatch2Iq.io.out.zipWithIndex.filter(staIdxSeq contains _._2).unzip._1.flatten 5960438e8f4SHaojin Tang d2IqStaOut.zip(staEnqs).zip(stdEnqs).foreach{ case((dp, staIQ), stdIQ) => 597730cfbc0SXuan Hu val isAllReady = staIQ.ready && stdIQ.ready 598e62b6911SXuan Hu dp.ready := isAllReady 599e62b6911SXuan Hu staIQ.valid := dp.valid && isAllReady 6000438e8f4SHaojin Tang stdIQ.valid := dp.valid && isAllReady && FuType.FuTypeOrR(dp.bits.fuType, FuType.stu, FuType.mou) 6019b258a00Sxgkiri } 602730cfbc0SXuan Hu 6030438e8f4SHaojin Tang val d2IqHyaOut = dispatch2Iq.io.out.zipWithIndex.filter(hyaIdxSeq contains _._2).unzip._1.flatten 6040438e8f4SHaojin Tang d2IqHyaOut.zip(hyaEnqs).zip(hydEnqs).foreach{ case((dp, hyaIQ), hydIQ) => 605e62b6911SXuan Hu val isAllReady = hyaIQ.ready && hydIQ.ready 606e62b6911SXuan Hu dp.ready := isAllReady 607e62b6911SXuan Hu hyaIQ.valid := dp.valid && isAllReady 60856bceacbSHaojin Tang hydIQ.valid := dp.valid && isAllReady && FuType.FuTypeOrR(dp.bits.fuType, FuType.stu, FuType.mou) 609e62b6911SXuan Hu } 610730cfbc0SXuan Hu 611e62b6911SXuan Hu stDataIQs.zipWithIndex.foreach { case (iq, i) => 612e62b6911SXuan Hu iq.io.flush <> io.fromCtrlBlock.flush 61360f0c5aeSxiaofeibao iq.io.wakeupFromWB.zip( 61460f0c5aeSxiaofeibao wakeupFromIntWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 61560f0c5aeSxiaofeibao wakeupFromFpWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 616c720aa49Ssinsanction wakeupFromVfWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 617c720aa49Ssinsanction wakeupFromV0WBVec.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 618c720aa49Ssinsanction wakeupFromVlWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq 61960f0c5aeSxiaofeibao ).foreach{ case (sink, source) => sink := source} 620e62b6911SXuan Hu } 621e62b6911SXuan Hu 622e62b6911SXuan Hu (stdEnqs ++ hydEnqs).zip(staEnqs ++ hyaEnqs).zipWithIndex.foreach { case ((stdIQEnq, staIQEnq), i) => 623730cfbc0SXuan Hu stdIQEnq.bits := staIQEnq.bits 624730cfbc0SXuan Hu // Store data reuses store addr src(1) in dispatch2iq 625e62b6911SXuan Hu // [dispatch2iq] --src*------src*(0)--> [staIQ|hyaIQ] 626730cfbc0SXuan Hu // \ 627730cfbc0SXuan Hu // ---src*(1)--> [stdIQ] 628730cfbc0SXuan Hu // Since the src(1) of sta is easier to get, stdIQEnq.bits.src*(0) is assigned to staIQEnq.bits.src*(1) 629730cfbc0SXuan Hu // instead of dispatch2Iq.io.out(x).bits.src*(1) 63097b279b9SXuan Hu val stdIdx = 1 6312d270511Ssinsanction stdIQEnq.bits.srcState(0) := staIQEnq.bits.srcState(stdIdx) 632955b4beaSsinsanction stdIQEnq.bits.srcLoadDependency(0) := staIQEnq.bits.srcLoadDependency(stdIdx) 6332d270511Ssinsanction stdIQEnq.bits.srcType(0) := staIQEnq.bits.srcType(stdIdx) 6342d270511Ssinsanction stdIQEnq.bits.psrc(0) := staIQEnq.bits.psrc(stdIdx) 635730cfbc0SXuan Hu stdIQEnq.bits.sqIdx := staIQEnq.bits.sqIdx 636955b4beaSsinsanction stdIQEnq.bits.useRegCache(0) := staIQEnq.bits.useRegCache(stdIdx) 637955b4beaSsinsanction stdIQEnq.bits.regCacheIdx(0) := staIQEnq.bits.regCacheIdx(stdIdx) 638730cfbc0SXuan Hu } 639730cfbc0SXuan Hu 6402d270511Ssinsanction vecMemIQs.foreach { 6412d270511Ssinsanction case imp: IssueQueueVecMemImp => 6422d270511Ssinsanction imp.io.memIO.get.sqDeqPtr.foreach(_ := io.fromMem.get.sqDeqPtr) 6432d270511Ssinsanction imp.io.memIO.get.lqDeqPtr.foreach(_ := io.fromMem.get.lqDeqPtr) 6441f3d1b4dSXuan Hu // not used 645b7c799beSzhanglyGit //imp.io.memIO.get.feedbackIO.head := io.fromMem.get.vstuFeedback.head // only vector store replay 6461f3d1b4dSXuan Hu // maybe not used 6471f3d1b4dSXuan Hu imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr 6481f3d1b4dSXuan Hu imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 64960f0c5aeSxiaofeibao imp.io.wakeupFromWB.zip( 65060f0c5aeSxiaofeibao wakeupFromIntWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 65160f0c5aeSxiaofeibao wakeupFromFpWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 652c720aa49Ssinsanction wakeupFromVfWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 653c720aa49Ssinsanction wakeupFromV0WBVec.zipWithIndex.filter(x => imp.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 654c720aa49Ssinsanction wakeupFromVlWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq 65560f0c5aeSxiaofeibao ).foreach{ case (sink, source) => sink := source} 656f39a61a1SzhanglyGit 6572d270511Ssinsanction case _ => 6582d270511Ssinsanction } 659b7c799beSzhanglyGit val vecMemFeedbackIO: Seq[MemRSFeedbackIO] = vecMemIQs.map { 660b7c799beSzhanglyGit case imp: IssueQueueVecMemImp => 661b7c799beSzhanglyGit imp.io.memIO.get.feedbackIO 662b7c799beSzhanglyGit }.flatten 663b7c799beSzhanglyGit assert(vecMemFeedbackIO.size == io.fromMem.get.vstuFeedback.size, "vecMemFeedback size dont match!") 664b7c799beSzhanglyGit vecMemFeedbackIO.zip(io.fromMem.get.vstuFeedback).foreach{ 665b7c799beSzhanglyGit case (sink, source) => 666b7c799beSzhanglyGit sink := source 667b7c799beSzhanglyGit } 6682d270511Ssinsanction 669730cfbc0SXuan Hu val lsqEnqCtrl = Module(new LsqEnqCtrl) 670730cfbc0SXuan Hu 671730cfbc0SXuan Hu lsqEnqCtrl.io.redirect <> io.fromCtrlBlock.flush 672730cfbc0SXuan Hu lsqEnqCtrl.io.enq <> dispatch2Iq.io.enqLsqIO.get 673730cfbc0SXuan Hu lsqEnqCtrl.io.lcommit := io.fromMem.get.lcommit 674730cfbc0SXuan Hu lsqEnqCtrl.io.scommit := io.fromMem.get.scommit 675730cfbc0SXuan Hu lsqEnqCtrl.io.lqCancelCnt := io.fromMem.get.lqCancelCnt 676730cfbc0SXuan Hu lsqEnqCtrl.io.sqCancelCnt := io.fromMem.get.sqCancelCnt 677f3a9fb05SAnzo dispatch2Iq.io.lqFreeCount.get := lsqEnqCtrl.io.lqFreeCount 678f3a9fb05SAnzo dispatch2Iq.io.sqFreeCount.get := lsqEnqCtrl.io.sqFreeCount 679730cfbc0SXuan Hu io.memIO.get.lsqEnqIO <> lsqEnqCtrl.io.enqLsq 6807e471bf8SXuan Hu 6817e471bf8SXuan Hu dontTouch(io.vecLoadIssueResp) 682e1a85e9fSchengguanghui 683e1a85e9fSchengguanghui val intBusyTablePerf = intBusyTable.get 684e1a85e9fSchengguanghui val fpBusyTablePerf = fpBusyTable.get 685e1a85e9fSchengguanghui val vecBusyTablePerf = vfBusyTable.get 686e1a85e9fSchengguanghui val v0BusyTablePerf = v0BusyTable.get 687e1a85e9fSchengguanghui val vlBusyTablePerf = vlBusyTable.get 688e1a85e9fSchengguanghui 689e1a85e9fSchengguanghui val perfEvents = basePerfEvents ++ Seq(intBusyTablePerf, fpBusyTablePerf, vecBusyTablePerf, v0BusyTablePerf, vlBusyTablePerf).flatten(_.getPerfEvents) 690e1a85e9fSchengguanghui generatePerfEvent() 691730cfbc0SXuan Hu} 692