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} 744f2941bSJiru Sunimport utility.HasPerfEvents 844f2941bSJiru Sunimport utils.OptionWrapper 9730cfbc0SXuan Huimport xiangshan._ 1010fe9778SXuan Huimport xiangshan.backend.Bundles._ 11c720aa49Ssinsanctionimport xiangshan.backend.datapath.DataConfig._ 12c720aa49Ssinsanctionimport xiangshan.backend.datapath.WbConfig._ 13e62b6911SXuan Huimport xiangshan.backend.fu.FuType 14730cfbc0SXuan Huimport xiangshan.backend.regfile.RfWritePortWithConfig 15730cfbc0SXuan Huimport xiangshan.backend.rename.BusyTable 162d270511Ssinsanctionimport xiangshan.mem.{LsqEnqCtrl, LsqEnqIO, MemWaitUpdateReq, SqPtr, LqPtr} 17c720aa49Ssinsanctionimport xiangshan.backend.datapath.WbConfig.V0WB 18c720aa49Ssinsanctionimport xiangshan.backend.regfile.VlPregParams 19955b4beaSsinsanctionimport xiangshan.backend.regcache.RegCacheTagTable 20730cfbc0SXuan Hu 21730cfbc0SXuan Husealed trait SchedulerType 22730cfbc0SXuan Hu 23730cfbc0SXuan Hucase class IntScheduler() extends SchedulerType 2460f0c5aeSxiaofeibaocase class FpScheduler() extends SchedulerType 25730cfbc0SXuan Hucase class MemScheduler() extends SchedulerType 26730cfbc0SXuan Hucase class VfScheduler() extends SchedulerType 27730cfbc0SXuan Hucase class NoScheduler() extends SchedulerType 28730cfbc0SXuan Hu 29730cfbc0SXuan Huclass Scheduler(val params: SchdBlockParams)(implicit p: Parameters) extends LazyModule with HasXSParameter { 301ca4a39dSXuan Hu override def shouldBeInlined: Boolean = false 311ca4a39dSXuan Hu 3239c59369SXuan Hu val numIntStateWrite = backendParams.numPregWb(IntData()) 3360f0c5aeSxiaofeibao val numFpStateWrite = backendParams.numPregWb(FpData()) 3439c59369SXuan Hu val numVfStateWrite = backendParams.numPregWb(VecData()) 3507b5cc60Sxiaofeibao val numV0StateWrite = backendParams.numPregWb(V0Data()) 3607b5cc60Sxiaofeibao val numVlStateWrite = backendParams.numPregWb(VlData()) 37730cfbc0SXuan Hu 38730cfbc0SXuan Hu val dispatch2Iq = LazyModule(new Dispatch2Iq(params)) 39730cfbc0SXuan Hu val issueQueue = params.issueBlockParams.map(x => LazyModule(new IssueQueue(x).suggestName(x.getIQName))) 40730cfbc0SXuan Hu 4183ba63b3SXuan Hu lazy val module: SchedulerImpBase = params.schdType match { 42730cfbc0SXuan Hu case IntScheduler() => new SchedulerArithImp(this)(params, p) 4360f0c5aeSxiaofeibao case FpScheduler() => new SchedulerArithImp(this)(params, p) 44730cfbc0SXuan Hu case MemScheduler() => new SchedulerMemImp(this)(params, p) 45730cfbc0SXuan Hu case VfScheduler() => new SchedulerArithImp(this)(params, p) 46730cfbc0SXuan Hu case _ => null 47730cfbc0SXuan Hu } 48730cfbc0SXuan Hu} 49730cfbc0SXuan Hu 507f8233d5SHaojin Tangclass SchedulerIO()(implicit params: SchdBlockParams, p: Parameters) extends XSBundle { 5168d13085SXuan Hu // params alias 527f8233d5SHaojin Tang private val LoadQueueSize = VirtualLoadQueueSize 5368d13085SXuan Hu 54730cfbc0SXuan Hu val fromTop = new Bundle { 55730cfbc0SXuan Hu val hartId = Input(UInt(8.W)) 56730cfbc0SXuan Hu } 572e0a7dc5Sfdy val fromWbFuBusyTable = new Bundle{ 582e0a7dc5Sfdy val fuBusyTableRead = MixedVec(params.issueBlockParams.map(x => Input(x.genWbFuBusyTableReadBundle))) 592e0a7dc5Sfdy } 60dd970561SzhanglyGit val wbFuBusyTable = MixedVec(params.issueBlockParams.map(x => Output(x.genWbFuBusyTableWriteBundle))) 6182674533Sxiaofeibao val intIQValidNumVec = Output(MixedVec(backendParams.genIntIQValidNumBundle)) 6282674533Sxiaofeibao val fpIQValidNumVec = Output(MixedVec(backendParams.genFpIQValidNumBundle)) 63dd970561SzhanglyGit 64730cfbc0SXuan Hu val fromCtrlBlock = new Bundle { 65730cfbc0SXuan Hu val flush = Flipped(ValidIO(new Redirect)) 66730cfbc0SXuan Hu } 67730cfbc0SXuan Hu val fromDispatch = new Bundle { 68730cfbc0SXuan Hu val allocPregs = Vec(RenameWidth, Input(new ResetPregStateReq)) 69730cfbc0SXuan Hu val uops = Vec(params.numUopIn, Flipped(DecoupledIO(new DynInst))) 70730cfbc0SXuan Hu } 7139c59369SXuan Hu val intWriteBack = MixedVec(Vec(backendParams.numPregWb(IntData()), 72730cfbc0SXuan Hu new RfWritePortWithConfig(backendParams.intPregParams.dataCfg, backendParams.intPregParams.addrWidth))) 7360f0c5aeSxiaofeibao val fpWriteBack = MixedVec(Vec(backendParams.numPregWb(FpData()), 7460f0c5aeSxiaofeibao new RfWritePortWithConfig(backendParams.fpPregParams.dataCfg, backendParams.fpPregParams.addrWidth))) 7539c59369SXuan Hu val vfWriteBack = MixedVec(Vec(backendParams.numPregWb(VecData()), 76730cfbc0SXuan Hu new RfWritePortWithConfig(backendParams.vfPregParams.dataCfg, backendParams.vfPregParams.addrWidth))) 7707b5cc60Sxiaofeibao val v0WriteBack = MixedVec(Vec(backendParams.numPregWb(V0Data()), 78c720aa49Ssinsanction new RfWritePortWithConfig(backendParams.v0PregParams.dataCfg, backendParams.v0PregParams.addrWidth))) 7907b5cc60Sxiaofeibao val vlWriteBack = MixedVec(Vec(backendParams.numPregWb(VlData()), 80c720aa49Ssinsanction new RfWritePortWithConfig(backendParams.vlPregParams.dataCfg, backendParams.vlPregParams.addrWidth))) 8159ef6009Sxiaofeibao-xjtu val toDataPathAfterDelay: MixedVec[MixedVec[DecoupledIO[IssueQueueIssueBundle]]] = MixedVec(params.issueBlockParams.map(_.genIssueDecoupledBundle)) 82730cfbc0SXuan Hu 83c720aa49Ssinsanction val vlWriteBackInfo = new Bundle { 84*d88d4328SZiyue Zhang val vlFromIntIsZero = Input(Bool()) 85*d88d4328SZiyue Zhang val vlFromIntIsVlmax = Input(Bool()) 86*d88d4328SZiyue Zhang val vlFromVfIsZero = Input(Bool()) 87*d88d4328SZiyue Zhang val vlFromVfIsVlmax = Input(Bool()) 88b6279fc6SZiyue Zhang } 89b6279fc6SZiyue Zhang 90bf35baadSXuan Hu val fromSchedulers = new Bundle { 91c0be7f33SXuan Hu val wakeupVec: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpInValidBundle) 92bf35baadSXuan Hu } 93bf35baadSXuan Hu 94bf35baadSXuan Hu val toSchedulers = new Bundle { 95c0be7f33SXuan Hu val wakeupVec: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = params.genIQWakeUpOutValidBundle 96bf35baadSXuan Hu } 97bf35baadSXuan Hu 98c0be7f33SXuan Hu val fromDataPath = new Bundle { 9910fe9778SXuan Hu val resp: MixedVec[MixedVec[OGRespBundle]] = MixedVec(params.issueBlockParams.map(x => Flipped(x.genOGRespBundle))) 100be9ff987Ssinsanction val og0Cancel = Input(ExuVec()) 101ea46c302SXuan Hu // Todo: remove this after no cancel signal from og1 102be9ff987Ssinsanction val og1Cancel = Input(ExuVec()) 103f8b278aaSsinsanction // replace RCIdx to Wakeup Queue 104f8b278aaSsinsanction val replaceRCIdx = OptionWrapper(params.needWriteRegCache, Vec(params.numWriteRegCache, Input(UInt(RegCacheIdxWidth.W)))) 105c0be7f33SXuan Hu // just be compatible to old code 106c0be7f33SXuan Hu def apply(i: Int)(j: Int) = resp(i)(j) 107c0be7f33SXuan Hu } 108c0be7f33SXuan Hu 1098a66c02cSXuan Hu val loadFinalIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.LdExuCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x))))))) 1108a66c02cSXuan Hu val memAddrIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.LdExuCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x))))))) 1117e471bf8SXuan Hu val vecLoadIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.VlduCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x))))))) 1120f55a0d3SHaojin Tang 1136810d1e8Ssfencevma val ldCancel = Vec(backendParams.LduCnt + backendParams.HyuCnt, Flipped(new LoadCancelIO)) 114c0be7f33SXuan Hu 115730cfbc0SXuan Hu val memIO = if (params.isMemSchd) Some(new Bundle { 116730cfbc0SXuan Hu val lsqEnqIO = Flipped(new LsqEnqIO) 117730cfbc0SXuan Hu }) else None 118730cfbc0SXuan Hu val fromMem = if (params.isMemSchd) Some(new Bundle { 1197b753bebSXuan Hu val ldaFeedback = Flipped(Vec(params.LduCnt, new MemRSFeedbackIO)) 1207b753bebSXuan Hu val staFeedback = Flipped(Vec(params.StaCnt, new MemRSFeedbackIO)) 1218f1fa9b1Ssfencevma val hyuFeedback = Flipped(Vec(params.HyuCnt, new MemRSFeedbackIO)) 122fd490615Sweiding liu val vstuFeedback = Flipped(Vec(params.VstuCnt, new MemRSFeedbackIO(isVector = true))) 123fd490615Sweiding liu val vlduFeedback = Flipped(Vec(params.VlduCnt, new MemRSFeedbackIO(isVector = true))) 124730cfbc0SXuan Hu val stIssuePtr = Input(new SqPtr()) 125730cfbc0SXuan Hu val lcommit = Input(UInt(log2Up(CommitWidth + 1).W)) 126730cfbc0SXuan Hu val scommit = Input(UInt(log2Ceil(EnsbufferWidth + 1).W)) // connected to `memBlock.io.sqDeq` instead of ROB 127fc45ed13SXuan Hu val wakeup = Vec(params.LdExuCnt, Flipped(Valid(new DynInst))) 1282d270511Ssinsanction val lqDeqPtr = Input(new LqPtr) 1292d270511Ssinsanction val sqDeqPtr = Input(new SqPtr) 130730cfbc0SXuan Hu // from lsq 131730cfbc0SXuan Hu val lqCancelCnt = Input(UInt(log2Up(LoadQueueSize + 1).W)) 132730cfbc0SXuan Hu val sqCancelCnt = Input(UInt(log2Up(StoreQueueSize + 1).W)) 133730cfbc0SXuan Hu val memWaitUpdateReq = Flipped(new MemWaitUpdateReq) 134730cfbc0SXuan Hu }) else None 135730cfbc0SXuan Hu val toMem = if (params.isMemSchd) Some(new Bundle { 136730cfbc0SXuan Hu val loadFastMatch = Output(Vec(params.LduCnt, new IssueQueueLoadBundle)) 137730cfbc0SXuan Hu }) else None 13842b6cdf9Ssinsanction val fromOg2Resp = if(params.needOg2Resp) Some(MixedVec(params.issueBlockParams.filter(_.needOg2Resp).map(x => Flipped(x.genOG2RespBundle)))) else None 139730cfbc0SXuan Hu} 140730cfbc0SXuan Hu 141730cfbc0SXuan Huabstract class SchedulerImpBase(wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters) 142730cfbc0SXuan Hu extends LazyModuleImp(wrapper) 143730cfbc0SXuan Hu with HasXSParameter 144730cfbc0SXuan Hu{ 145730cfbc0SXuan Hu val io = IO(new SchedulerIO()) 146730cfbc0SXuan Hu 147730cfbc0SXuan Hu // alias 148c0be7f33SXuan Hu private val iqWakeUpInMap: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] = 149c0be7f33SXuan Hu io.fromSchedulers.wakeupVec.map(x => (x.bits.exuIdx, x)).toMap 150730cfbc0SXuan Hu private val schdType = params.schdType 151730cfbc0SXuan Hu 152730cfbc0SXuan Hu // Modules 153730cfbc0SXuan Hu val dispatch2Iq: Dispatch2IqImp = wrapper.dispatch2Iq.module 154730cfbc0SXuan Hu val issueQueues: Seq[IssueQueueImp] = wrapper.issueQueue.map(_.module) 15582674533Sxiaofeibao io.intIQValidNumVec := 0.U.asTypeOf(io.intIQValidNumVec) 15682674533Sxiaofeibao io.fpIQValidNumVec := 0.U.asTypeOf(io.fpIQValidNumVec) 157ff3fcdf1Sxiaofeibao-xjtu if (params.isIntSchd) { 15882674533Sxiaofeibao dispatch2Iq.io.intIQValidNumVec.get := io.intIQValidNumVec 15982674533Sxiaofeibao io.intIQValidNumVec := MixedVecInit(issueQueues.map(_.io.validCntDeqVec)) 160ff3fcdf1Sxiaofeibao-xjtu } 16182674533Sxiaofeibao else if (params.isFpSchd) { 16282674533Sxiaofeibao dispatch2Iq.io.fpIQValidNumVec.get := io.fpIQValidNumVec 16382674533Sxiaofeibao io.fpIQValidNumVec := MixedVecInit(issueQueues.map(_.io.validCntDeqVec)) 16482674533Sxiaofeibao } 165730cfbc0SXuan Hu 16656bcaed7SHaojin Tang // valid count 16756bcaed7SHaojin Tang dispatch2Iq.io.iqValidCnt := issueQueues.filter(_.params.StdCnt == 0).map(_.io.status.validCnt) 16856bcaed7SHaojin Tang 169730cfbc0SXuan Hu // BusyTable Modules 170730cfbc0SXuan Hu val intBusyTable = schdType match { 171bc7d6943SzhanglyGit case IntScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numIntStateRead, wrapper.numIntStateWrite, IntPhyRegs, IntWB()))) 172730cfbc0SXuan Hu case _ => None 173730cfbc0SXuan Hu } 17460f0c5aeSxiaofeibao val fpBusyTable = schdType match { 17560f0c5aeSxiaofeibao case FpScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numFpStateRead, wrapper.numFpStateWrite, FpPhyRegs, FpWB()))) 17660f0c5aeSxiaofeibao case _ => None 17760f0c5aeSxiaofeibao } 178730cfbc0SXuan Hu val vfBusyTable = schdType match { 179bc7d6943SzhanglyGit case VfScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numVfStateRead, wrapper.numVfStateWrite, VfPhyRegs, VfWB()))) 180730cfbc0SXuan Hu case _ => None 181730cfbc0SXuan Hu } 182c720aa49Ssinsanction val v0BusyTable = schdType match { 183c720aa49Ssinsanction case VfScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numV0StateRead, wrapper.numV0StateWrite, V0PhyRegs, V0WB()))) 184c720aa49Ssinsanction case _ => None 185c720aa49Ssinsanction } 186c720aa49Ssinsanction val vlBusyTable = schdType match { 187c720aa49Ssinsanction case VfScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numVlStateRead, wrapper.numVlStateWrite, VlPhyRegs, VlWB()))) 188c720aa49Ssinsanction case _ => None 189c720aa49Ssinsanction } 190730cfbc0SXuan Hu 191955b4beaSsinsanction // RegCacheTagTable Module 192955b4beaSsinsanction val rcTagTable = schdType match { 193955b4beaSsinsanction case IntScheduler() | MemScheduler() => Some(Module(new RegCacheTagTable(dispatch2Iq.numRCTagTableStateRead))) 194955b4beaSsinsanction case _ => None 195955b4beaSsinsanction } 196955b4beaSsinsanction 197730cfbc0SXuan Hu dispatch2Iq.io match { case dp2iq => 198730cfbc0SXuan Hu dp2iq.redirect <> io.fromCtrlBlock.flush 199730cfbc0SXuan Hu dp2iq.in <> io.fromDispatch.uops 200730cfbc0SXuan Hu dp2iq.readIntState.foreach(_ <> intBusyTable.get.io.read) 20160f0c5aeSxiaofeibao dp2iq.readFpState.foreach(_ <> fpBusyTable.get.io.read) 202730cfbc0SXuan Hu dp2iq.readVfState.foreach(_ <> vfBusyTable.get.io.read) 203c720aa49Ssinsanction dp2iq.readV0State.foreach(_ <> v0BusyTable.get.io.read) 204c720aa49Ssinsanction dp2iq.readVlState.foreach(_ <> vlBusyTable.get.io.read) 205955b4beaSsinsanction dp2iq.readRCTagTableState.foreach(_ <> rcTagTable.get.io.readPorts) 206730cfbc0SXuan Hu } 207730cfbc0SXuan Hu 208730cfbc0SXuan Hu intBusyTable match { 209730cfbc0SXuan Hu case Some(bt) => 210730cfbc0SXuan Hu bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) => 211730cfbc0SXuan Hu btAllocPregs.valid := dpAllocPregs.isInt 212730cfbc0SXuan Hu btAllocPregs.bits := dpAllocPregs.preg 213730cfbc0SXuan Hu } 214730cfbc0SXuan Hu bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) => 215730cfbc0SXuan Hu wb.valid := io.intWriteBack(i).wen && io.intWriteBack(i).intWen 216730cfbc0SXuan Hu wb.bits := io.intWriteBack(i).addr 217730cfbc0SXuan Hu } 218bc7d6943SzhanglyGit bt.io.wakeUp := io.fromSchedulers.wakeupVec 21937080bd8Ssinsanction bt.io.og0Cancel := io.fromDataPath.og0Cancel 22013551487SzhanglyGit bt.io.ldCancel := io.ldCancel 221730cfbc0SXuan Hu case None => 222730cfbc0SXuan Hu } 223730cfbc0SXuan Hu 22460f0c5aeSxiaofeibao fpBusyTable match { 225730cfbc0SXuan Hu case Some(bt) => 226730cfbc0SXuan Hu bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) => 227730cfbc0SXuan Hu btAllocPregs.valid := dpAllocPregs.isFp 228730cfbc0SXuan Hu btAllocPregs.bits := dpAllocPregs.preg 229730cfbc0SXuan Hu } 230730cfbc0SXuan Hu bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) => 23160f0c5aeSxiaofeibao wb.valid := io.fpWriteBack(i).wen && io.fpWriteBack(i).fpWen 23260f0c5aeSxiaofeibao wb.bits := io.fpWriteBack(i).addr 23360f0c5aeSxiaofeibao } 23460f0c5aeSxiaofeibao bt.io.wakeUp := io.fromSchedulers.wakeupVec 23537080bd8Ssinsanction bt.io.og0Cancel := io.fromDataPath.og0Cancel 23660f0c5aeSxiaofeibao bt.io.ldCancel := io.ldCancel 23760f0c5aeSxiaofeibao case None => 23860f0c5aeSxiaofeibao } 23960f0c5aeSxiaofeibao 24060f0c5aeSxiaofeibao vfBusyTable match { 24160f0c5aeSxiaofeibao case Some(bt) => 24260f0c5aeSxiaofeibao bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) => 24360f0c5aeSxiaofeibao btAllocPregs.valid := dpAllocPregs.isVec 24460f0c5aeSxiaofeibao btAllocPregs.bits := dpAllocPregs.preg 24560f0c5aeSxiaofeibao } 24660f0c5aeSxiaofeibao bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) => 24760f0c5aeSxiaofeibao wb.valid := io.vfWriteBack(i).wen && io.vfWriteBack(i).vecWen 248730cfbc0SXuan Hu wb.bits := io.vfWriteBack(i).addr 249730cfbc0SXuan Hu } 250bc7d6943SzhanglyGit bt.io.wakeUp := io.fromSchedulers.wakeupVec 25137080bd8Ssinsanction bt.io.og0Cancel := io.fromDataPath.og0Cancel 25213551487SzhanglyGit bt.io.ldCancel := io.ldCancel 253730cfbc0SXuan Hu case None => 254730cfbc0SXuan Hu } 255730cfbc0SXuan Hu 256c720aa49Ssinsanction v0BusyTable match { 257c720aa49Ssinsanction case Some(bt) => 258c720aa49Ssinsanction bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) => 25929aa55c1Sxiaofeibao btAllocPregs.valid := dpAllocPregs.isV0 260c720aa49Ssinsanction btAllocPregs.bits := dpAllocPregs.preg 261c720aa49Ssinsanction } 262c720aa49Ssinsanction bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) => 263c720aa49Ssinsanction wb.valid := io.v0WriteBack(i).wen && io.v0WriteBack(i).v0Wen 264c720aa49Ssinsanction wb.bits := io.v0WriteBack(i).addr 265c720aa49Ssinsanction } 266c720aa49Ssinsanction bt.io.wakeUp := io.fromSchedulers.wakeupVec 26737080bd8Ssinsanction bt.io.og0Cancel := io.fromDataPath.og0Cancel 268c720aa49Ssinsanction bt.io.ldCancel := io.ldCancel 269c720aa49Ssinsanction case None => 270c720aa49Ssinsanction } 271c720aa49Ssinsanction 272c720aa49Ssinsanction vlBusyTable match { 273c720aa49Ssinsanction case Some(bt) => 274c720aa49Ssinsanction bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) => 27529aa55c1Sxiaofeibao btAllocPregs.valid := dpAllocPregs.isVl 276c720aa49Ssinsanction btAllocPregs.bits := dpAllocPregs.preg 277c720aa49Ssinsanction } 278c720aa49Ssinsanction bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) => 279c720aa49Ssinsanction wb.valid := io.vlWriteBack(i).wen && io.vlWriteBack(i).vlWen 280c720aa49Ssinsanction wb.bits := io.vlWriteBack(i).addr 281c720aa49Ssinsanction } 282c720aa49Ssinsanction bt.io.wakeUp := io.fromSchedulers.wakeupVec 28337080bd8Ssinsanction bt.io.og0Cancel := io.fromDataPath.og0Cancel 284c720aa49Ssinsanction bt.io.ldCancel := io.ldCancel 285c720aa49Ssinsanction case None => 286c720aa49Ssinsanction } 287c720aa49Ssinsanction 288955b4beaSsinsanction rcTagTable match { 289955b4beaSsinsanction case Some(rct) => 290955b4beaSsinsanction rct.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) => 291955b4beaSsinsanction btAllocPregs.valid := dpAllocPregs.isInt 292955b4beaSsinsanction btAllocPregs.bits := dpAllocPregs.preg 293955b4beaSsinsanction } 294955b4beaSsinsanction rct.io.wakeupFromIQ := io.fromSchedulers.wakeupVec 295955b4beaSsinsanction rct.io.og0Cancel := io.fromDataPath.og0Cancel 296955b4beaSsinsanction rct.io.ldCancel := io.ldCancel 297955b4beaSsinsanction case None => 298955b4beaSsinsanction } 299955b4beaSsinsanction 300f39a61a1SzhanglyGit val wakeupFromIntWBVec = Wire(params.genIntWBWakeUpSinkValidBundle) 30160f0c5aeSxiaofeibao val wakeupFromFpWBVec = Wire(params.genFpWBWakeUpSinkValidBundle) 302f39a61a1SzhanglyGit val wakeupFromVfWBVec = Wire(params.genVfWBWakeUpSinkValidBundle) 303c720aa49Ssinsanction val wakeupFromV0WBVec = Wire(params.genV0WBWakeUpSinkValidBundle) 304c720aa49Ssinsanction val wakeupFromVlWBVec = Wire(params.genVlWBWakeUpSinkValidBundle) 305f39a61a1SzhanglyGit 306f39a61a1SzhanglyGit wakeupFromIntWBVec.zip(io.intWriteBack).foreach { case (sink, source) => 307f39a61a1SzhanglyGit sink.valid := source.wen 308f39a61a1SzhanglyGit sink.bits.rfWen := source.intWen 309f39a61a1SzhanglyGit sink.bits.fpWen := source.fpWen 310f39a61a1SzhanglyGit sink.bits.vecWen := source.vecWen 311c720aa49Ssinsanction sink.bits.v0Wen := source.v0Wen 312c720aa49Ssinsanction sink.bits.vlWen := source.vlWen 313f39a61a1SzhanglyGit sink.bits.pdest := source.addr 314730cfbc0SXuan Hu } 315f39a61a1SzhanglyGit 31660f0c5aeSxiaofeibao wakeupFromFpWBVec.zip(io.fpWriteBack).foreach { case (sink, source) => 31760f0c5aeSxiaofeibao sink.valid := source.wen 31860f0c5aeSxiaofeibao sink.bits.rfWen := source.intWen 31960f0c5aeSxiaofeibao sink.bits.fpWen := source.fpWen 32060f0c5aeSxiaofeibao sink.bits.vecWen := source.vecWen 321c720aa49Ssinsanction sink.bits.v0Wen := source.v0Wen 322c720aa49Ssinsanction sink.bits.vlWen := source.vlWen 32360f0c5aeSxiaofeibao sink.bits.pdest := source.addr 32460f0c5aeSxiaofeibao } 32560f0c5aeSxiaofeibao 326f39a61a1SzhanglyGit wakeupFromVfWBVec.zip(io.vfWriteBack).foreach { case (sink, source) => 327730cfbc0SXuan Hu sink.valid := source.wen 328730cfbc0SXuan Hu sink.bits.rfWen := source.intWen 329730cfbc0SXuan Hu sink.bits.fpWen := source.fpWen 330730cfbc0SXuan Hu sink.bits.vecWen := source.vecWen 331c720aa49Ssinsanction sink.bits.v0Wen := source.v0Wen 332c720aa49Ssinsanction sink.bits.vlWen := source.vlWen 333c720aa49Ssinsanction sink.bits.pdest := source.addr 334c720aa49Ssinsanction } 335c720aa49Ssinsanction 336c720aa49Ssinsanction wakeupFromV0WBVec.zip(io.v0WriteBack).foreach { case (sink, source) => 337c720aa49Ssinsanction sink.valid := source.wen 338c720aa49Ssinsanction sink.bits.rfWen := source.intWen 339c720aa49Ssinsanction sink.bits.fpWen := source.fpWen 340c720aa49Ssinsanction sink.bits.vecWen := source.vecWen 341c720aa49Ssinsanction sink.bits.v0Wen := source.v0Wen 342c720aa49Ssinsanction sink.bits.vlWen := source.vlWen 343c720aa49Ssinsanction sink.bits.pdest := source.addr 344c720aa49Ssinsanction } 345c720aa49Ssinsanction 346c720aa49Ssinsanction wakeupFromVlWBVec.zip(io.vlWriteBack).foreach { case (sink, source) => 347c720aa49Ssinsanction sink.valid := source.wen 348c720aa49Ssinsanction sink.bits.rfWen := source.intWen 349c720aa49Ssinsanction sink.bits.fpWen := source.fpWen 350c720aa49Ssinsanction sink.bits.vecWen := source.vecWen 351c720aa49Ssinsanction sink.bits.v0Wen := source.v0Wen 352c720aa49Ssinsanction sink.bits.vlWen := source.vlWen 353730cfbc0SXuan Hu sink.bits.pdest := source.addr 354730cfbc0SXuan Hu } 355730cfbc0SXuan Hu 356bf35baadSXuan Hu // Connect bundles having the same wakeup source 35759ef6009Sxiaofeibao-xjtu issueQueues.zipWithIndex.foreach { case(iq, i) => 358bf35baadSXuan Hu iq.io.wakeupFromIQ.foreach { wakeUp => 3590c7ebb58Sxiaofeibao-xjtu val wakeUpIn = iqWakeUpInMap(wakeUp.bits.exuIdx) 3600c7ebb58Sxiaofeibao-xjtu val exuIdx = wakeUp.bits.exuIdx 3610c7ebb58Sxiaofeibao-xjtu println(s"[Backend] Connect wakeup exuIdx ${exuIdx}") 3620c7ebb58Sxiaofeibao-xjtu connectSamePort(wakeUp,wakeUpIn) 3630c7ebb58Sxiaofeibao-xjtu backendParams.connectWakeup(exuIdx) 3640c7ebb58Sxiaofeibao-xjtu if (backendParams.isCopyPdest(exuIdx)) { 3650c7ebb58Sxiaofeibao-xjtu println(s"[Backend] exuIdx ${exuIdx} use pdestCopy ${backendParams.getCopyPdestIndex(exuIdx)}") 3660c7ebb58Sxiaofeibao-xjtu wakeUp.bits.pdest := wakeUpIn.bits.pdestCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 3674c5a0d77Sxiaofeibao-xjtu if (wakeUpIn.bits.rfWenCopy.nonEmpty) wakeUp.bits.rfWen := wakeUpIn.bits.rfWenCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 3684c5a0d77Sxiaofeibao-xjtu if (wakeUpIn.bits.fpWenCopy.nonEmpty) wakeUp.bits.fpWen := wakeUpIn.bits.fpWenCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 3694c5a0d77Sxiaofeibao-xjtu if (wakeUpIn.bits.vecWenCopy.nonEmpty) wakeUp.bits.vecWen := wakeUpIn.bits.vecWenCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 370c720aa49Ssinsanction if (wakeUpIn.bits.v0WenCopy.nonEmpty) wakeUp.bits.v0Wen := wakeUpIn.bits.v0WenCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 371c720aa49Ssinsanction if (wakeUpIn.bits.vlWenCopy.nonEmpty) wakeUp.bits.vlWen := wakeUpIn.bits.vlWenCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 3724c5a0d77Sxiaofeibao-xjtu if (wakeUpIn.bits.loadDependencyCopy.nonEmpty) wakeUp.bits.loadDependency := wakeUpIn.bits.loadDependencyCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 3730c7ebb58Sxiaofeibao-xjtu } 37460912d84Sxiaofeibao-xjtu if (iq.params.numIntSrc == 0) wakeUp.bits.rfWen := false.B 37560f0c5aeSxiaofeibao if (iq.params.numFpSrc == 0) wakeUp.bits.fpWen := false.B 37660912d84Sxiaofeibao-xjtu if (iq.params.numVfSrc == 0) wakeUp.bits.vecWen := false.B 377c720aa49Ssinsanction if (iq.params.numV0Src == 0) wakeUp.bits.v0Wen := false.B 378c720aa49Ssinsanction if (iq.params.numVlSrc == 0) wakeUp.bits.vlWen := false.B 379bf35baadSXuan Hu } 380ea46c302SXuan Hu iq.io.og0Cancel := io.fromDataPath.og0Cancel 381ea46c302SXuan Hu iq.io.og1Cancel := io.fromDataPath.og1Cancel 382e600b1ddSxiaofeibao-xjtu if (iq.params.needLoadDependency) 3830f55a0d3SHaojin Tang iq.io.ldCancel := io.ldCancel 384e600b1ddSxiaofeibao-xjtu else 385e600b1ddSxiaofeibao-xjtu iq.io.ldCancel := 0.U.asTypeOf(io.ldCancel) 386bf35baadSXuan Hu } 387bf35baadSXuan Hu 388b6279fc6SZiyue Zhang // connect the vl writeback informatino to the issue queues 389b6279fc6SZiyue Zhang issueQueues.zipWithIndex.foreach { case(iq, i) => 390*d88d4328SZiyue Zhang iq.io.vlFromIntIsVlmax := io.vlWriteBackInfo.vlFromIntIsVlmax 391*d88d4328SZiyue Zhang iq.io.vlFromIntIsZero := io.vlWriteBackInfo.vlFromIntIsZero 392*d88d4328SZiyue Zhang iq.io.vlFromVfIsVlmax := io.vlWriteBackInfo.vlFromVfIsVlmax 393*d88d4328SZiyue Zhang iq.io.vlFromVfIsZero := io.vlWriteBackInfo.vlFromVfIsZero 394b6279fc6SZiyue Zhang } 395b6279fc6SZiyue Zhang 396c0be7f33SXuan Hu private val iqWakeUpOutMap: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] = 397bf35baadSXuan Hu issueQueues.flatMap(_.io.wakeupToIQ) 398c0be7f33SXuan Hu .map(x => (x.bits.exuIdx, x)) 399bf35baadSXuan Hu .toMap 400bf35baadSXuan Hu 401bf35baadSXuan Hu // Connect bundles having the same wakeup source 402bf35baadSXuan Hu io.toSchedulers.wakeupVec.foreach { wakeUp => 403c0be7f33SXuan Hu wakeUp := iqWakeUpOutMap(wakeUp.bits.exuIdx) 404bf35baadSXuan Hu } 405bf35baadSXuan Hu 40659ef6009Sxiaofeibao-xjtu io.toDataPathAfterDelay.zipWithIndex.foreach { case (toDpDy, i) => 40759ef6009Sxiaofeibao-xjtu toDpDy <> issueQueues(i).io.deqDelay 40859ef6009Sxiaofeibao-xjtu } 409bf35baadSXuan Hu 410f99b81adSHaojin Tang // Response 411f99b81adSHaojin Tang issueQueues.zipWithIndex.foreach { case (iq, i) => 412f99b81adSHaojin Tang iq.io.og0Resp.zipWithIndex.foreach { case (og0Resp, j) => 413f99b81adSHaojin Tang og0Resp := io.fromDataPath(i)(j).og0resp 414f99b81adSHaojin Tang } 415f99b81adSHaojin Tang iq.io.og1Resp.zipWithIndex.foreach { case (og1Resp, j) => 416f99b81adSHaojin Tang og1Resp := io.fromDataPath(i)(j).og1resp 417f99b81adSHaojin Tang } 418f99b81adSHaojin Tang iq.io.finalIssueResp.foreach(_.zipWithIndex.foreach { case (finalIssueResp, j) => 419670870b3SXuan Hu if (io.loadFinalIssueResp(i).isDefinedAt(j)) { 420f99b81adSHaojin Tang finalIssueResp := io.loadFinalIssueResp(i)(j) 421670870b3SXuan Hu } else { 422670870b3SXuan Hu finalIssueResp := 0.U.asTypeOf(finalIssueResp) 423670870b3SXuan Hu } 424f99b81adSHaojin Tang }) 425e8800897SXuan Hu iq.io.memAddrIssueResp.foreach(_.zipWithIndex.foreach { case (memAddrIssueResp, j) => 426aa2bcc31SzhanglyGit if (io.memAddrIssueResp(i).isDefinedAt(j)) { 427e8800897SXuan Hu memAddrIssueResp := io.memAddrIssueResp(i)(j) 428aa2bcc31SzhanglyGit } else { 429aa2bcc31SzhanglyGit memAddrIssueResp := 0.U.asTypeOf(memAddrIssueResp) 430aa2bcc31SzhanglyGit } 431e8800897SXuan Hu }) 4327e471bf8SXuan Hu iq.io.vecLoadIssueResp.foreach(_.zipWithIndex.foreach { case (resp, deqIdx) => 4337e471bf8SXuan Hu resp := io.vecLoadIssueResp(i)(deqIdx) 4347e471bf8SXuan Hu }) 435f99b81adSHaojin Tang iq.io.wbBusyTableRead := io.fromWbFuBusyTable.fuBusyTableRead(i) 436f99b81adSHaojin Tang io.wbFuBusyTable(i) := iq.io.wbBusyTableWrite 437f8b278aaSsinsanction iq.io.replaceRCIdx.foreach(x => x := 0.U.asTypeOf(x)) 438f8b278aaSsinsanction } 43942b6cdf9Ssinsanction if (params.needOg2Resp) { 44042b6cdf9Ssinsanction issueQueues.filter(_.params.needOg2Resp).zip(io.fromOg2Resp.get).foreach{ case (iq, og2RespVec) => 44142b6cdf9Ssinsanction iq.io.og2Resp.get.zip(og2RespVec).foreach{ case (iqOg2Resp, og2Resp) => 44242b6cdf9Ssinsanction iqOg2Resp := og2Resp 44342b6cdf9Ssinsanction } 44442b6cdf9Ssinsanction } 44542b6cdf9Ssinsanction } 446f8b278aaSsinsanction 447f8b278aaSsinsanction // Connect each replace RCIdx to IQ 448f8b278aaSsinsanction if (params.needWriteRegCache) { 449f8b278aaSsinsanction val iqReplaceRCIdxVec = issueQueues.filter(_.params.needWriteRegCache).flatMap{ iq => 450f8b278aaSsinsanction iq.params.allExuParams.zip(iq.io.replaceRCIdx.get).filter(_._1.needWriteRegCache).map(_._2) 451f8b278aaSsinsanction } 452f8b278aaSsinsanction iqReplaceRCIdxVec.zip(io.fromDataPath.replaceRCIdx.get).foreach{ case (iq, in) => 453f8b278aaSsinsanction iq := in 454f8b278aaSsinsanction } 455f8b278aaSsinsanction 456f8b278aaSsinsanction println(s"[Scheduler] numWriteRegCache: ${params.numWriteRegCache}") 457f8b278aaSsinsanction println(s"[Scheduler] iqReplaceRCIdxVec: ${iqReplaceRCIdxVec.size}") 458f99b81adSHaojin Tang } 459f99b81adSHaojin Tang 460e1a85e9fSchengguanghui // perfEvent 461e1a85e9fSchengguanghui val lastCycleDp2IqOutFireVec = RegNext(VecInit(dispatch2Iq.io.out.flatten.map(_.fire))) 462e1a85e9fSchengguanghui val lastCycleIqEnqFireVec = RegNext(VecInit(issueQueues.map(_.io.enq.map(_.fire)).flatten)) 463e1a85e9fSchengguanghui val lastCycleIqFullVec = RegNext(VecInit(issueQueues.map(_.io.enq.head.ready))) 464e1a85e9fSchengguanghui 465e1a85e9fSchengguanghui val issueQueueFullVecPerf = issueQueues.zip(lastCycleIqFullVec)map{ case (iq, full) => (iq.params.getIQName + s"_full", full) } 466e1a85e9fSchengguanghui val basePerfEvents = Seq( 467e1a85e9fSchengguanghui ("dispatch2Iq_out_fire_cnt", PopCount(lastCycleDp2IqOutFireVec) ), 468e1a85e9fSchengguanghui ("issueQueue_enq_fire_cnt", PopCount(lastCycleIqEnqFireVec) ) 469e1a85e9fSchengguanghui ) ++ issueQueueFullVecPerf 470e1a85e9fSchengguanghui 471c0be7f33SXuan Hu println(s"[Scheduler] io.fromSchedulers.wakeupVec: ${io.fromSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}") 472bf35baadSXuan Hu println(s"[Scheduler] iqWakeUpInKeys: ${iqWakeUpInMap.keys}") 473bf35baadSXuan Hu 474bf35baadSXuan Hu println(s"[Scheduler] iqWakeUpOutKeys: ${iqWakeUpOutMap.keys}") 475c0be7f33SXuan Hu println(s"[Scheduler] io.toSchedulers.wakeupVec: ${io.toSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}") 476730cfbc0SXuan Hu} 477730cfbc0SXuan Hu 478730cfbc0SXuan Huclass SchedulerArithImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters) 479730cfbc0SXuan Hu extends SchedulerImpBase(wrapper) 480730cfbc0SXuan Hu with HasXSParameter 481e1a85e9fSchengguanghui with HasPerfEvents 482730cfbc0SXuan Hu{ 4832e0a7dc5Sfdy// dontTouch(io.vfWbFuBusyTable) 484730cfbc0SXuan Hu println(s"[SchedulerArithImp] " + 485730cfbc0SXuan Hu s"has intBusyTable: ${intBusyTable.nonEmpty}, " + 486730cfbc0SXuan Hu s"has vfBusyTable: ${vfBusyTable.nonEmpty}") 487730cfbc0SXuan Hu 488730cfbc0SXuan Hu issueQueues.zipWithIndex.foreach { case (iq, i) => 489730cfbc0SXuan Hu iq.io.flush <> io.fromCtrlBlock.flush 490730cfbc0SXuan Hu iq.io.enq <> dispatch2Iq.io.out(i) 491e600b1ddSxiaofeibao-xjtu if (!iq.params.needLoadDependency) { 492e600b1ddSxiaofeibao-xjtu iq.io.enq.map(x => x.bits.srcLoadDependency := 0.U.asTypeOf(x.bits.srcLoadDependency)) 493e600b1ddSxiaofeibao-xjtu } 494f39a61a1SzhanglyGit val intWBIQ = params.schdType match { 495f39a61a1SzhanglyGit case IntScheduler() => wakeupFromIntWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1) 49660f0c5aeSxiaofeibao case FpScheduler() => wakeupFromFpWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1) 497c720aa49Ssinsanction case VfScheduler() => (wakeupFromVfWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 498c720aa49Ssinsanction wakeupFromV0WBVec.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 499c720aa49Ssinsanction wakeupFromVlWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1)) 500596af5d2SHaojin Tang case _ => null 501f39a61a1SzhanglyGit } 502f39a61a1SzhanglyGit iq.io.wakeupFromWB.zip(intWBIQ).foreach{ case (sink, source) => sink := source} 503730cfbc0SXuan Hu } 504e1a85e9fSchengguanghui 505e1a85e9fSchengguanghui val perfEvents = basePerfEvents 506e1a85e9fSchengguanghui generatePerfEvent() 507730cfbc0SXuan Hu} 508730cfbc0SXuan Hu 509f99b81adSHaojin Tang// FIXME: Vector mem instructions may not be handled properly! 510730cfbc0SXuan Huclass SchedulerMemImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters) 511730cfbc0SXuan Hu extends SchedulerImpBase(wrapper) 512730cfbc0SXuan Hu with HasXSParameter 513e1a85e9fSchengguanghui with HasPerfEvents 514730cfbc0SXuan Hu{ 515730cfbc0SXuan Hu println(s"[SchedulerMemImp] " + 516730cfbc0SXuan Hu s"has intBusyTable: ${intBusyTable.nonEmpty}, " + 517730cfbc0SXuan Hu s"has vfBusyTable: ${vfBusyTable.nonEmpty}") 518730cfbc0SXuan Hu 519559c1710SHaojin Tang val memAddrIQs = issueQueues.filter(_.params.isMemAddrIQ) 520e07131b2Ssinsanction val stAddrIQs = issueQueues.filter(iq => iq.params.StaCnt > 0) // included in memAddrIQs 521e07131b2Ssinsanction val ldAddrIQs = issueQueues.filter(iq => iq.params.LduCnt > 0) 522e07131b2Ssinsanction val stDataIQs = issueQueues.filter(iq => iq.params.StdCnt > 0) 523559c1710SHaojin Tang val vecMemIQs = issueQueues.filter(_.params.isVecMemIQ) 524559c1710SHaojin Tang val (hyuIQs, hyuIQIdxs) = issueQueues.zipWithIndex.filter(_._1.params.HyuCnt > 0).unzip 525499caf4cSXuan Hu 526499caf4cSXuan Hu println(s"[SchedulerMemImp] memAddrIQs.size: ${memAddrIQs.size}, enq.size: ${memAddrIQs.map(_.io.enq.size).sum}") 527499caf4cSXuan Hu println(s"[SchedulerMemImp] stAddrIQs.size: ${stAddrIQs.size }, enq.size: ${stAddrIQs.map(_.io.enq.size).sum}") 528499caf4cSXuan Hu println(s"[SchedulerMemImp] ldAddrIQs.size: ${ldAddrIQs.size }, enq.size: ${ldAddrIQs.map(_.io.enq.size).sum}") 529499caf4cSXuan Hu println(s"[SchedulerMemImp] stDataIQs.size: ${stDataIQs.size }, enq.size: ${stDataIQs.map(_.io.enq.size).sum}") 530499caf4cSXuan Hu println(s"[SchedulerMemImp] hyuIQs.size: ${hyuIQs.size }, enq.size: ${hyuIQs.map(_.io.enq.size).sum}") 531730cfbc0SXuan Hu require(memAddrIQs.nonEmpty && stDataIQs.nonEmpty) 532730cfbc0SXuan Hu 533853cd2d8SHaojin Tang io.toMem.get.loadFastMatch := 0.U.asTypeOf(io.toMem.get.loadFastMatch) // TODO: is still needed? 534853cd2d8SHaojin Tang 535fc45ed13SXuan Hu private val loadWakeUp = issueQueues.filter(_.params.LdExuCnt > 0).map(_.asInstanceOf[IssueQueueMemAddrImp].io.memIO.get.loadWakeUp).flatten 536596af5d2SHaojin Tang require(loadWakeUp.length == io.fromMem.get.wakeup.length) 537596af5d2SHaojin Tang loadWakeUp.zip(io.fromMem.get.wakeup).foreach(x => x._1 := x._2) 538596af5d2SHaojin Tang 539730cfbc0SXuan Hu memAddrIQs.zipWithIndex.foreach { case (iq, i) => 540730cfbc0SXuan Hu iq.io.flush <> io.fromCtrlBlock.flush 541730cfbc0SXuan Hu iq.io.enq <> dispatch2Iq.io.out(i) 542e600b1ddSxiaofeibao-xjtu if (!iq.params.needLoadDependency) { 543e600b1ddSxiaofeibao-xjtu iq.io.enq.map(x => x.bits.srcLoadDependency := 0.U.asTypeOf(x.bits.srcLoadDependency)) 544e600b1ddSxiaofeibao-xjtu } 54560f0c5aeSxiaofeibao iq.io.wakeupFromWB.zip( 54660f0c5aeSxiaofeibao wakeupFromIntWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 54760f0c5aeSxiaofeibao wakeupFromFpWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 548c720aa49Ssinsanction wakeupFromVfWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 549c720aa49Ssinsanction wakeupFromV0WBVec.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 550c720aa49Ssinsanction wakeupFromVlWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1) 55160f0c5aeSxiaofeibao ).foreach{ case (sink, source) => sink := source} 552730cfbc0SXuan Hu } 553730cfbc0SXuan Hu 554ecfc6f16SXuan Hu ldAddrIQs.zipWithIndex.foreach { 555ecfc6f16SXuan Hu case (imp: IssueQueueMemAddrImp, i) => 556ecfc6f16SXuan Hu imp.io.memIO.get.feedbackIO.head := 0.U.asTypeOf(imp.io.memIO.get.feedbackIO.head) 557c14e89f4SHaojin Tang imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr 558de784418SXuan Hu imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 5597b753bebSXuan Hu case _ => 5607b753bebSXuan Hu } 5617b753bebSXuan Hu 562ecfc6f16SXuan Hu stAddrIQs.zipWithIndex.foreach { 563ecfc6f16SXuan Hu case (imp: IssueQueueMemAddrImp, i) => 564ecfc6f16SXuan Hu imp.io.memIO.get.feedbackIO.head := io.fromMem.get.staFeedback(i) 565c14e89f4SHaojin Tang imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr 566c14e89f4SHaojin Tang imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 5677b753bebSXuan Hu case _ => 5687b753bebSXuan Hu } 569730cfbc0SXuan Hu 570559c1710SHaojin Tang hyuIQs.zip(hyuIQIdxs).foreach { 571559c1710SHaojin Tang case (imp: IssueQueueMemAddrImp, idx) => 572670870b3SXuan Hu imp.io.memIO.get.feedbackIO.head := io.fromMem.get.hyuFeedback.head 573670870b3SXuan Hu imp.io.memIO.get.feedbackIO(1) := 0.U.asTypeOf(imp.io.memIO.get.feedbackIO(1)) 5748f1fa9b1Ssfencevma imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr 5758f1fa9b1Ssfencevma imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 576559c1710SHaojin Tang // TODO: refactor ditry code 577559c1710SHaojin Tang imp.io.deqDelay(1).ready := false.B 578559c1710SHaojin Tang io.toDataPathAfterDelay(idx)(1).valid := false.B 579559c1710SHaojin Tang io.toDataPathAfterDelay(idx)(1).bits := 0.U.asTypeOf(io.toDataPathAfterDelay(idx)(1).bits) 5808f1fa9b1Ssfencevma case _ => 5818f1fa9b1Ssfencevma } 5828f1fa9b1Ssfencevma 583e62b6911SXuan Hu private val staIdxSeq = (stAddrIQs).map(iq => iq.params.idxInSchBlk) 584e62b6911SXuan Hu private val hyaIdxSeq = (hyuIQs).map(iq => iq.params.idxInSchBlk) 585e62b6911SXuan Hu 586e62b6911SXuan Hu println(s"[SchedulerMemImp] sta iq idx in memSchdBlock: $staIdxSeq") 587e62b6911SXuan Hu println(s"[SchedulerMemImp] hya iq idx in memSchdBlock: $hyaIdxSeq") 588e62b6911SXuan Hu 589e62b6911SXuan Hu private val staEnqs = stAddrIQs.map(_.io.enq).flatten 590e62b6911SXuan Hu private val stdEnqs = stDataIQs.map(_.io.enq).flatten.take(staEnqs.size) 591e62b6911SXuan Hu private val hyaEnqs = hyuIQs.map(_.io.enq).flatten 592e62b6911SXuan Hu private val hydEnqs = stDataIQs.map(_.io.enq).flatten.drop(staEnqs.size) 593e62b6911SXuan Hu 594e62b6911SXuan Hu require(staEnqs.size == stdEnqs.size, s"number of enq ports of store address IQs(${staEnqs.size}) " + 595e62b6911SXuan Hu s"should be equal to number of enq ports of store data IQs(${stdEnqs.size})") 596e62b6911SXuan Hu 597e62b6911SXuan Hu require(hyaEnqs.size == hydEnqs.size, s"number of enq ports of hybrid address IQs(${hyaEnqs.size}) " + 598e62b6911SXuan Hu s"should be equal to number of enq ports of hybrid data IQs(${hydEnqs.size})") 5999b258a00Sxgkiri 6000438e8f4SHaojin Tang val d2IqStaOut = dispatch2Iq.io.out.zipWithIndex.filter(staIdxSeq contains _._2).unzip._1.flatten 6010438e8f4SHaojin Tang d2IqStaOut.zip(staEnqs).zip(stdEnqs).foreach{ case((dp, staIQ), stdIQ) => 602730cfbc0SXuan Hu val isAllReady = staIQ.ready && stdIQ.ready 603e62b6911SXuan Hu dp.ready := isAllReady 604e62b6911SXuan Hu staIQ.valid := dp.valid && isAllReady 6050438e8f4SHaojin Tang stdIQ.valid := dp.valid && isAllReady && FuType.FuTypeOrR(dp.bits.fuType, FuType.stu, FuType.mou) 6069b258a00Sxgkiri } 607730cfbc0SXuan Hu 6080438e8f4SHaojin Tang val d2IqHyaOut = dispatch2Iq.io.out.zipWithIndex.filter(hyaIdxSeq contains _._2).unzip._1.flatten 6090438e8f4SHaojin Tang d2IqHyaOut.zip(hyaEnqs).zip(hydEnqs).foreach{ case((dp, hyaIQ), hydIQ) => 610e62b6911SXuan Hu val isAllReady = hyaIQ.ready && hydIQ.ready 611e62b6911SXuan Hu dp.ready := isAllReady 612e62b6911SXuan Hu hyaIQ.valid := dp.valid && isAllReady 61356bceacbSHaojin Tang hydIQ.valid := dp.valid && isAllReady && FuType.FuTypeOrR(dp.bits.fuType, FuType.stu, FuType.mou) 614e62b6911SXuan Hu } 615730cfbc0SXuan Hu 616e62b6911SXuan Hu stDataIQs.zipWithIndex.foreach { case (iq, i) => 617e62b6911SXuan Hu iq.io.flush <> io.fromCtrlBlock.flush 61860f0c5aeSxiaofeibao iq.io.wakeupFromWB.zip( 61960f0c5aeSxiaofeibao wakeupFromIntWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 62060f0c5aeSxiaofeibao wakeupFromFpWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 621c720aa49Ssinsanction wakeupFromVfWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 622c720aa49Ssinsanction wakeupFromV0WBVec.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 623c720aa49Ssinsanction wakeupFromVlWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq 62460f0c5aeSxiaofeibao ).foreach{ case (sink, source) => sink := source} 625e62b6911SXuan Hu } 626e62b6911SXuan Hu 627e62b6911SXuan Hu (stdEnqs ++ hydEnqs).zip(staEnqs ++ hyaEnqs).zipWithIndex.foreach { case ((stdIQEnq, staIQEnq), i) => 628730cfbc0SXuan Hu stdIQEnq.bits := staIQEnq.bits 629730cfbc0SXuan Hu // Store data reuses store addr src(1) in dispatch2iq 630e62b6911SXuan Hu // [dispatch2iq] --src*------src*(0)--> [staIQ|hyaIQ] 631730cfbc0SXuan Hu // \ 632730cfbc0SXuan Hu // ---src*(1)--> [stdIQ] 633730cfbc0SXuan Hu // Since the src(1) of sta is easier to get, stdIQEnq.bits.src*(0) is assigned to staIQEnq.bits.src*(1) 634730cfbc0SXuan Hu // instead of dispatch2Iq.io.out(x).bits.src*(1) 63597b279b9SXuan Hu val stdIdx = 1 6362d270511Ssinsanction stdIQEnq.bits.srcState(0) := staIQEnq.bits.srcState(stdIdx) 637955b4beaSsinsanction stdIQEnq.bits.srcLoadDependency(0) := staIQEnq.bits.srcLoadDependency(stdIdx) 6382d270511Ssinsanction stdIQEnq.bits.srcType(0) := staIQEnq.bits.srcType(stdIdx) 6392d270511Ssinsanction stdIQEnq.bits.psrc(0) := staIQEnq.bits.psrc(stdIdx) 640730cfbc0SXuan Hu stdIQEnq.bits.sqIdx := staIQEnq.bits.sqIdx 641955b4beaSsinsanction stdIQEnq.bits.useRegCache(0) := staIQEnq.bits.useRegCache(stdIdx) 642955b4beaSsinsanction stdIQEnq.bits.regCacheIdx(0) := staIQEnq.bits.regCacheIdx(stdIdx) 643730cfbc0SXuan Hu } 644730cfbc0SXuan Hu 6452d270511Ssinsanction vecMemIQs.foreach { 6462d270511Ssinsanction case imp: IssueQueueVecMemImp => 6472d270511Ssinsanction imp.io.memIO.get.sqDeqPtr.foreach(_ := io.fromMem.get.sqDeqPtr) 6482d270511Ssinsanction imp.io.memIO.get.lqDeqPtr.foreach(_ := io.fromMem.get.lqDeqPtr) 6491f3d1b4dSXuan Hu // not used 650b7c799beSzhanglyGit //imp.io.memIO.get.feedbackIO.head := io.fromMem.get.vstuFeedback.head // only vector store replay 6511f3d1b4dSXuan Hu // maybe not used 6521f3d1b4dSXuan Hu imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr 6531f3d1b4dSXuan Hu imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 65460f0c5aeSxiaofeibao imp.io.wakeupFromWB.zip( 65560f0c5aeSxiaofeibao wakeupFromIntWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 65660f0c5aeSxiaofeibao wakeupFromFpWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 657c720aa49Ssinsanction wakeupFromVfWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 658c720aa49Ssinsanction wakeupFromV0WBVec.zipWithIndex.filter(x => imp.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 659c720aa49Ssinsanction wakeupFromVlWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq 66060f0c5aeSxiaofeibao ).foreach{ case (sink, source) => sink := source} 661f39a61a1SzhanglyGit 6622d270511Ssinsanction case _ => 6632d270511Ssinsanction } 664b7c799beSzhanglyGit val vecMemFeedbackIO: Seq[MemRSFeedbackIO] = vecMemIQs.map { 665b7c799beSzhanglyGit case imp: IssueQueueVecMemImp => 666b7c799beSzhanglyGit imp.io.memIO.get.feedbackIO 667b7c799beSzhanglyGit }.flatten 668b7c799beSzhanglyGit assert(vecMemFeedbackIO.size == io.fromMem.get.vstuFeedback.size, "vecMemFeedback size dont match!") 669b7c799beSzhanglyGit vecMemFeedbackIO.zip(io.fromMem.get.vstuFeedback).foreach{ 670b7c799beSzhanglyGit case (sink, source) => 671b7c799beSzhanglyGit sink := source 672b7c799beSzhanglyGit } 6732d270511Ssinsanction 674730cfbc0SXuan Hu val lsqEnqCtrl = Module(new LsqEnqCtrl) 675730cfbc0SXuan Hu 676730cfbc0SXuan Hu lsqEnqCtrl.io.redirect <> io.fromCtrlBlock.flush 677730cfbc0SXuan Hu lsqEnqCtrl.io.enq <> dispatch2Iq.io.enqLsqIO.get 678730cfbc0SXuan Hu lsqEnqCtrl.io.lcommit := io.fromMem.get.lcommit 679730cfbc0SXuan Hu lsqEnqCtrl.io.scommit := io.fromMem.get.scommit 680730cfbc0SXuan Hu lsqEnqCtrl.io.lqCancelCnt := io.fromMem.get.lqCancelCnt 681730cfbc0SXuan Hu lsqEnqCtrl.io.sqCancelCnt := io.fromMem.get.sqCancelCnt 682f3a9fb05SAnzo dispatch2Iq.io.lqFreeCount.get := lsqEnqCtrl.io.lqFreeCount 683f3a9fb05SAnzo dispatch2Iq.io.sqFreeCount.get := lsqEnqCtrl.io.sqFreeCount 684730cfbc0SXuan Hu io.memIO.get.lsqEnqIO <> lsqEnqCtrl.io.enqLsq 6857e471bf8SXuan Hu 6867e471bf8SXuan Hu dontTouch(io.vecLoadIssueResp) 687e1a85e9fSchengguanghui 688e1a85e9fSchengguanghui val intBusyTablePerf = intBusyTable.get 689e1a85e9fSchengguanghui val fpBusyTablePerf = fpBusyTable.get 690e1a85e9fSchengguanghui val vecBusyTablePerf = vfBusyTable.get 691e1a85e9fSchengguanghui val v0BusyTablePerf = v0BusyTable.get 692e1a85e9fSchengguanghui val vlBusyTablePerf = vlBusyTable.get 693e1a85e9fSchengguanghui 694e1a85e9fSchengguanghui val perfEvents = basePerfEvents ++ Seq(intBusyTablePerf, fpBusyTablePerf, vecBusyTablePerf, v0BusyTablePerf, vlBusyTablePerf).flatten(_.getPerfEvents) 695e1a85e9fSchengguanghui generatePerfEvent() 696730cfbc0SXuan Hu} 697