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} 7*44f2941bSJiru Sunimport utility.HasPerfEvents 8*44f2941bSJiru 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 { 84b6279fc6SZiyue Zhang val vlIsZero = Input(Bool()) 85b6279fc6SZiyue Zhang val vlIsVlmax = Input(Bool()) 86b6279fc6SZiyue Zhang } 87b6279fc6SZiyue Zhang 88bf35baadSXuan Hu val fromSchedulers = new Bundle { 89c0be7f33SXuan Hu val wakeupVec: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpInValidBundle) 90bf35baadSXuan Hu } 91bf35baadSXuan Hu 92bf35baadSXuan Hu val toSchedulers = new Bundle { 93c0be7f33SXuan Hu val wakeupVec: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = params.genIQWakeUpOutValidBundle 94bf35baadSXuan Hu } 95bf35baadSXuan Hu 96c0be7f33SXuan Hu val fromDataPath = new Bundle { 9710fe9778SXuan Hu val resp: MixedVec[MixedVec[OGRespBundle]] = MixedVec(params.issueBlockParams.map(x => Flipped(x.genOGRespBundle))) 98be9ff987Ssinsanction val og0Cancel = Input(ExuVec()) 99ea46c302SXuan Hu // Todo: remove this after no cancel signal from og1 100be9ff987Ssinsanction val og1Cancel = Input(ExuVec()) 101f8b278aaSsinsanction // replace RCIdx to Wakeup Queue 102f8b278aaSsinsanction val replaceRCIdx = OptionWrapper(params.needWriteRegCache, Vec(params.numWriteRegCache, Input(UInt(RegCacheIdxWidth.W)))) 103c0be7f33SXuan Hu // just be compatible to old code 104c0be7f33SXuan Hu def apply(i: Int)(j: Int) = resp(i)(j) 105c0be7f33SXuan Hu } 106c0be7f33SXuan Hu 1078a66c02cSXuan Hu val loadFinalIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.LdExuCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x))))))) 1088a66c02cSXuan Hu val memAddrIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.LdExuCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x))))))) 1097e471bf8SXuan Hu val vecLoadIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.VlduCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x))))))) 1100f55a0d3SHaojin Tang 1116810d1e8Ssfencevma val ldCancel = Vec(backendParams.LduCnt + backendParams.HyuCnt, Flipped(new LoadCancelIO)) 112c0be7f33SXuan Hu 113730cfbc0SXuan Hu val memIO = if (params.isMemSchd) Some(new Bundle { 114730cfbc0SXuan Hu val lsqEnqIO = Flipped(new LsqEnqIO) 115730cfbc0SXuan Hu }) else None 116730cfbc0SXuan Hu val fromMem = if (params.isMemSchd) Some(new Bundle { 1177b753bebSXuan Hu val ldaFeedback = Flipped(Vec(params.LduCnt, new MemRSFeedbackIO)) 1187b753bebSXuan Hu val staFeedback = Flipped(Vec(params.StaCnt, new MemRSFeedbackIO)) 1198f1fa9b1Ssfencevma val hyuFeedback = Flipped(Vec(params.HyuCnt, new MemRSFeedbackIO)) 120fd490615Sweiding liu val vstuFeedback = Flipped(Vec(params.VstuCnt, new MemRSFeedbackIO(isVector = true))) 121fd490615Sweiding liu val vlduFeedback = Flipped(Vec(params.VlduCnt, new MemRSFeedbackIO(isVector = true))) 122730cfbc0SXuan Hu val stIssuePtr = Input(new SqPtr()) 123730cfbc0SXuan Hu val lcommit = Input(UInt(log2Up(CommitWidth + 1).W)) 124730cfbc0SXuan Hu val scommit = Input(UInt(log2Ceil(EnsbufferWidth + 1).W)) // connected to `memBlock.io.sqDeq` instead of ROB 125fc45ed13SXuan Hu val wakeup = Vec(params.LdExuCnt, Flipped(Valid(new DynInst))) 1262d270511Ssinsanction val lqDeqPtr = Input(new LqPtr) 1272d270511Ssinsanction val sqDeqPtr = Input(new SqPtr) 128730cfbc0SXuan Hu // from lsq 129730cfbc0SXuan Hu val lqCancelCnt = Input(UInt(log2Up(LoadQueueSize + 1).W)) 130730cfbc0SXuan Hu val sqCancelCnt = Input(UInt(log2Up(StoreQueueSize + 1).W)) 131730cfbc0SXuan Hu val memWaitUpdateReq = Flipped(new MemWaitUpdateReq) 132730cfbc0SXuan Hu }) else None 133730cfbc0SXuan Hu val toMem = if (params.isMemSchd) Some(new Bundle { 134730cfbc0SXuan Hu val loadFastMatch = Output(Vec(params.LduCnt, new IssueQueueLoadBundle)) 135730cfbc0SXuan Hu }) else None 13642b6cdf9Ssinsanction val fromOg2Resp = if(params.needOg2Resp) Some(MixedVec(params.issueBlockParams.filter(_.needOg2Resp).map(x => Flipped(x.genOG2RespBundle)))) else None 137730cfbc0SXuan Hu} 138730cfbc0SXuan Hu 139730cfbc0SXuan Huabstract class SchedulerImpBase(wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters) 140730cfbc0SXuan Hu extends LazyModuleImp(wrapper) 141730cfbc0SXuan Hu with HasXSParameter 142730cfbc0SXuan Hu{ 143730cfbc0SXuan Hu val io = IO(new SchedulerIO()) 144730cfbc0SXuan Hu 145730cfbc0SXuan Hu // alias 146c0be7f33SXuan Hu private val iqWakeUpInMap: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] = 147c0be7f33SXuan Hu io.fromSchedulers.wakeupVec.map(x => (x.bits.exuIdx, x)).toMap 148730cfbc0SXuan Hu private val schdType = params.schdType 149730cfbc0SXuan Hu 150730cfbc0SXuan Hu // Modules 151730cfbc0SXuan Hu val dispatch2Iq: Dispatch2IqImp = wrapper.dispatch2Iq.module 152730cfbc0SXuan Hu val issueQueues: Seq[IssueQueueImp] = wrapper.issueQueue.map(_.module) 15382674533Sxiaofeibao io.intIQValidNumVec := 0.U.asTypeOf(io.intIQValidNumVec) 15482674533Sxiaofeibao io.fpIQValidNumVec := 0.U.asTypeOf(io.fpIQValidNumVec) 155ff3fcdf1Sxiaofeibao-xjtu if (params.isIntSchd) { 15682674533Sxiaofeibao dispatch2Iq.io.intIQValidNumVec.get := io.intIQValidNumVec 15782674533Sxiaofeibao io.intIQValidNumVec := MixedVecInit(issueQueues.map(_.io.validCntDeqVec)) 158ff3fcdf1Sxiaofeibao-xjtu } 15982674533Sxiaofeibao else if (params.isFpSchd) { 16082674533Sxiaofeibao dispatch2Iq.io.fpIQValidNumVec.get := io.fpIQValidNumVec 16182674533Sxiaofeibao io.fpIQValidNumVec := MixedVecInit(issueQueues.map(_.io.validCntDeqVec)) 16282674533Sxiaofeibao } 163730cfbc0SXuan Hu 16456bcaed7SHaojin Tang // valid count 16556bcaed7SHaojin Tang dispatch2Iq.io.iqValidCnt := issueQueues.filter(_.params.StdCnt == 0).map(_.io.status.validCnt) 16656bcaed7SHaojin Tang 167730cfbc0SXuan Hu // BusyTable Modules 168730cfbc0SXuan Hu val intBusyTable = schdType match { 169bc7d6943SzhanglyGit case IntScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numIntStateRead, wrapper.numIntStateWrite, IntPhyRegs, IntWB()))) 170730cfbc0SXuan Hu case _ => None 171730cfbc0SXuan Hu } 17260f0c5aeSxiaofeibao val fpBusyTable = schdType match { 17360f0c5aeSxiaofeibao case FpScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numFpStateRead, wrapper.numFpStateWrite, FpPhyRegs, FpWB()))) 17460f0c5aeSxiaofeibao case _ => None 17560f0c5aeSxiaofeibao } 176730cfbc0SXuan Hu val vfBusyTable = schdType match { 177bc7d6943SzhanglyGit case VfScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numVfStateRead, wrapper.numVfStateWrite, VfPhyRegs, VfWB()))) 178730cfbc0SXuan Hu case _ => None 179730cfbc0SXuan Hu } 180c720aa49Ssinsanction val v0BusyTable = schdType match { 181c720aa49Ssinsanction case VfScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numV0StateRead, wrapper.numV0StateWrite, V0PhyRegs, V0WB()))) 182c720aa49Ssinsanction case _ => None 183c720aa49Ssinsanction } 184c720aa49Ssinsanction val vlBusyTable = schdType match { 185c720aa49Ssinsanction case VfScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numVlStateRead, wrapper.numVlStateWrite, VlPhyRegs, VlWB()))) 186c720aa49Ssinsanction case _ => None 187c720aa49Ssinsanction } 188730cfbc0SXuan Hu 189955b4beaSsinsanction // RegCacheTagTable Module 190955b4beaSsinsanction val rcTagTable = schdType match { 191955b4beaSsinsanction case IntScheduler() | MemScheduler() => Some(Module(new RegCacheTagTable(dispatch2Iq.numRCTagTableStateRead))) 192955b4beaSsinsanction case _ => None 193955b4beaSsinsanction } 194955b4beaSsinsanction 195730cfbc0SXuan Hu dispatch2Iq.io match { case dp2iq => 196730cfbc0SXuan Hu dp2iq.redirect <> io.fromCtrlBlock.flush 197730cfbc0SXuan Hu dp2iq.in <> io.fromDispatch.uops 198730cfbc0SXuan Hu dp2iq.readIntState.foreach(_ <> intBusyTable.get.io.read) 19960f0c5aeSxiaofeibao dp2iq.readFpState.foreach(_ <> fpBusyTable.get.io.read) 200730cfbc0SXuan Hu dp2iq.readVfState.foreach(_ <> vfBusyTable.get.io.read) 201c720aa49Ssinsanction dp2iq.readV0State.foreach(_ <> v0BusyTable.get.io.read) 202c720aa49Ssinsanction dp2iq.readVlState.foreach(_ <> vlBusyTable.get.io.read) 203955b4beaSsinsanction dp2iq.readRCTagTableState.foreach(_ <> rcTagTable.get.io.readPorts) 204730cfbc0SXuan Hu } 205730cfbc0SXuan Hu 206730cfbc0SXuan Hu intBusyTable match { 207730cfbc0SXuan Hu case Some(bt) => 208730cfbc0SXuan Hu bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) => 209730cfbc0SXuan Hu btAllocPregs.valid := dpAllocPregs.isInt 210730cfbc0SXuan Hu btAllocPregs.bits := dpAllocPregs.preg 211730cfbc0SXuan Hu } 212730cfbc0SXuan Hu bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) => 213730cfbc0SXuan Hu wb.valid := io.intWriteBack(i).wen && io.intWriteBack(i).intWen 214730cfbc0SXuan Hu wb.bits := io.intWriteBack(i).addr 215730cfbc0SXuan Hu } 216bc7d6943SzhanglyGit bt.io.wakeUp := io.fromSchedulers.wakeupVec 21737080bd8Ssinsanction bt.io.og0Cancel := io.fromDataPath.og0Cancel 21813551487SzhanglyGit bt.io.ldCancel := io.ldCancel 219730cfbc0SXuan Hu case None => 220730cfbc0SXuan Hu } 221730cfbc0SXuan Hu 22260f0c5aeSxiaofeibao fpBusyTable match { 223730cfbc0SXuan Hu case Some(bt) => 224730cfbc0SXuan Hu bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) => 225730cfbc0SXuan Hu btAllocPregs.valid := dpAllocPregs.isFp 226730cfbc0SXuan Hu btAllocPregs.bits := dpAllocPregs.preg 227730cfbc0SXuan Hu } 228730cfbc0SXuan Hu bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) => 22960f0c5aeSxiaofeibao wb.valid := io.fpWriteBack(i).wen && io.fpWriteBack(i).fpWen 23060f0c5aeSxiaofeibao wb.bits := io.fpWriteBack(i).addr 23160f0c5aeSxiaofeibao } 23260f0c5aeSxiaofeibao bt.io.wakeUp := io.fromSchedulers.wakeupVec 23337080bd8Ssinsanction bt.io.og0Cancel := io.fromDataPath.og0Cancel 23460f0c5aeSxiaofeibao bt.io.ldCancel := io.ldCancel 23560f0c5aeSxiaofeibao case None => 23660f0c5aeSxiaofeibao } 23760f0c5aeSxiaofeibao 23860f0c5aeSxiaofeibao vfBusyTable match { 23960f0c5aeSxiaofeibao case Some(bt) => 24060f0c5aeSxiaofeibao bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) => 24160f0c5aeSxiaofeibao btAllocPregs.valid := dpAllocPregs.isVec 24260f0c5aeSxiaofeibao btAllocPregs.bits := dpAllocPregs.preg 24360f0c5aeSxiaofeibao } 24460f0c5aeSxiaofeibao bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) => 24560f0c5aeSxiaofeibao wb.valid := io.vfWriteBack(i).wen && io.vfWriteBack(i).vecWen 246730cfbc0SXuan Hu wb.bits := io.vfWriteBack(i).addr 247730cfbc0SXuan Hu } 248bc7d6943SzhanglyGit bt.io.wakeUp := io.fromSchedulers.wakeupVec 24937080bd8Ssinsanction bt.io.og0Cancel := io.fromDataPath.og0Cancel 25013551487SzhanglyGit bt.io.ldCancel := io.ldCancel 251730cfbc0SXuan Hu case None => 252730cfbc0SXuan Hu } 253730cfbc0SXuan Hu 254c720aa49Ssinsanction v0BusyTable match { 255c720aa49Ssinsanction case Some(bt) => 256c720aa49Ssinsanction bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) => 25729aa55c1Sxiaofeibao btAllocPregs.valid := dpAllocPregs.isV0 258c720aa49Ssinsanction btAllocPregs.bits := dpAllocPregs.preg 259c720aa49Ssinsanction } 260c720aa49Ssinsanction bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) => 261c720aa49Ssinsanction wb.valid := io.v0WriteBack(i).wen && io.v0WriteBack(i).v0Wen 262c720aa49Ssinsanction wb.bits := io.v0WriteBack(i).addr 263c720aa49Ssinsanction } 264c720aa49Ssinsanction bt.io.wakeUp := io.fromSchedulers.wakeupVec 26537080bd8Ssinsanction bt.io.og0Cancel := io.fromDataPath.og0Cancel 266c720aa49Ssinsanction bt.io.ldCancel := io.ldCancel 267c720aa49Ssinsanction case None => 268c720aa49Ssinsanction } 269c720aa49Ssinsanction 270c720aa49Ssinsanction vlBusyTable match { 271c720aa49Ssinsanction case Some(bt) => 272c720aa49Ssinsanction bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) => 27329aa55c1Sxiaofeibao btAllocPregs.valid := dpAllocPregs.isVl 274c720aa49Ssinsanction btAllocPregs.bits := dpAllocPregs.preg 275c720aa49Ssinsanction } 276c720aa49Ssinsanction bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) => 277c720aa49Ssinsanction wb.valid := io.vlWriteBack(i).wen && io.vlWriteBack(i).vlWen 278c720aa49Ssinsanction wb.bits := io.vlWriteBack(i).addr 279c720aa49Ssinsanction } 280c720aa49Ssinsanction bt.io.wakeUp := io.fromSchedulers.wakeupVec 28137080bd8Ssinsanction bt.io.og0Cancel := io.fromDataPath.og0Cancel 282c720aa49Ssinsanction bt.io.ldCancel := io.ldCancel 283c720aa49Ssinsanction case None => 284c720aa49Ssinsanction } 285c720aa49Ssinsanction 286955b4beaSsinsanction rcTagTable match { 287955b4beaSsinsanction case Some(rct) => 288955b4beaSsinsanction rct.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) => 289955b4beaSsinsanction btAllocPregs.valid := dpAllocPregs.isInt 290955b4beaSsinsanction btAllocPregs.bits := dpAllocPregs.preg 291955b4beaSsinsanction } 292955b4beaSsinsanction rct.io.wakeupFromIQ := io.fromSchedulers.wakeupVec 293955b4beaSsinsanction rct.io.og0Cancel := io.fromDataPath.og0Cancel 294955b4beaSsinsanction rct.io.ldCancel := io.ldCancel 295955b4beaSsinsanction case None => 296955b4beaSsinsanction } 297955b4beaSsinsanction 298f39a61a1SzhanglyGit val wakeupFromIntWBVec = Wire(params.genIntWBWakeUpSinkValidBundle) 29960f0c5aeSxiaofeibao val wakeupFromFpWBVec = Wire(params.genFpWBWakeUpSinkValidBundle) 300f39a61a1SzhanglyGit val wakeupFromVfWBVec = Wire(params.genVfWBWakeUpSinkValidBundle) 301c720aa49Ssinsanction val wakeupFromV0WBVec = Wire(params.genV0WBWakeUpSinkValidBundle) 302c720aa49Ssinsanction val wakeupFromVlWBVec = Wire(params.genVlWBWakeUpSinkValidBundle) 303f39a61a1SzhanglyGit 304f39a61a1SzhanglyGit wakeupFromIntWBVec.zip(io.intWriteBack).foreach { case (sink, source) => 305f39a61a1SzhanglyGit sink.valid := source.wen 306f39a61a1SzhanglyGit sink.bits.rfWen := source.intWen 307f39a61a1SzhanglyGit sink.bits.fpWen := source.fpWen 308f39a61a1SzhanglyGit sink.bits.vecWen := source.vecWen 309c720aa49Ssinsanction sink.bits.v0Wen := source.v0Wen 310c720aa49Ssinsanction sink.bits.vlWen := source.vlWen 311f39a61a1SzhanglyGit sink.bits.pdest := source.addr 312730cfbc0SXuan Hu } 313f39a61a1SzhanglyGit 31460f0c5aeSxiaofeibao wakeupFromFpWBVec.zip(io.fpWriteBack).foreach { case (sink, source) => 31560f0c5aeSxiaofeibao sink.valid := source.wen 31660f0c5aeSxiaofeibao sink.bits.rfWen := source.intWen 31760f0c5aeSxiaofeibao sink.bits.fpWen := source.fpWen 31860f0c5aeSxiaofeibao sink.bits.vecWen := source.vecWen 319c720aa49Ssinsanction sink.bits.v0Wen := source.v0Wen 320c720aa49Ssinsanction sink.bits.vlWen := source.vlWen 32160f0c5aeSxiaofeibao sink.bits.pdest := source.addr 32260f0c5aeSxiaofeibao } 32360f0c5aeSxiaofeibao 324f39a61a1SzhanglyGit wakeupFromVfWBVec.zip(io.vfWriteBack).foreach { case (sink, source) => 325730cfbc0SXuan Hu sink.valid := source.wen 326730cfbc0SXuan Hu sink.bits.rfWen := source.intWen 327730cfbc0SXuan Hu sink.bits.fpWen := source.fpWen 328730cfbc0SXuan Hu sink.bits.vecWen := source.vecWen 329c720aa49Ssinsanction sink.bits.v0Wen := source.v0Wen 330c720aa49Ssinsanction sink.bits.vlWen := source.vlWen 331c720aa49Ssinsanction sink.bits.pdest := source.addr 332c720aa49Ssinsanction } 333c720aa49Ssinsanction 334c720aa49Ssinsanction wakeupFromV0WBVec.zip(io.v0WriteBack).foreach { case (sink, source) => 335c720aa49Ssinsanction sink.valid := source.wen 336c720aa49Ssinsanction sink.bits.rfWen := source.intWen 337c720aa49Ssinsanction sink.bits.fpWen := source.fpWen 338c720aa49Ssinsanction sink.bits.vecWen := source.vecWen 339c720aa49Ssinsanction sink.bits.v0Wen := source.v0Wen 340c720aa49Ssinsanction sink.bits.vlWen := source.vlWen 341c720aa49Ssinsanction sink.bits.pdest := source.addr 342c720aa49Ssinsanction } 343c720aa49Ssinsanction 344c720aa49Ssinsanction wakeupFromVlWBVec.zip(io.vlWriteBack).foreach { case (sink, source) => 345c720aa49Ssinsanction sink.valid := source.wen 346c720aa49Ssinsanction sink.bits.rfWen := source.intWen 347c720aa49Ssinsanction sink.bits.fpWen := source.fpWen 348c720aa49Ssinsanction sink.bits.vecWen := source.vecWen 349c720aa49Ssinsanction sink.bits.v0Wen := source.v0Wen 350c720aa49Ssinsanction sink.bits.vlWen := source.vlWen 351730cfbc0SXuan Hu sink.bits.pdest := source.addr 352730cfbc0SXuan Hu } 353730cfbc0SXuan Hu 354bf35baadSXuan Hu // Connect bundles having the same wakeup source 35559ef6009Sxiaofeibao-xjtu issueQueues.zipWithIndex.foreach { case(iq, i) => 356bf35baadSXuan Hu iq.io.wakeupFromIQ.foreach { wakeUp => 3570c7ebb58Sxiaofeibao-xjtu val wakeUpIn = iqWakeUpInMap(wakeUp.bits.exuIdx) 3580c7ebb58Sxiaofeibao-xjtu val exuIdx = wakeUp.bits.exuIdx 3590c7ebb58Sxiaofeibao-xjtu println(s"[Backend] Connect wakeup exuIdx ${exuIdx}") 3600c7ebb58Sxiaofeibao-xjtu connectSamePort(wakeUp,wakeUpIn) 3610c7ebb58Sxiaofeibao-xjtu backendParams.connectWakeup(exuIdx) 3620c7ebb58Sxiaofeibao-xjtu if (backendParams.isCopyPdest(exuIdx)) { 3630c7ebb58Sxiaofeibao-xjtu println(s"[Backend] exuIdx ${exuIdx} use pdestCopy ${backendParams.getCopyPdestIndex(exuIdx)}") 3640c7ebb58Sxiaofeibao-xjtu wakeUp.bits.pdest := wakeUpIn.bits.pdestCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 3654c5a0d77Sxiaofeibao-xjtu if (wakeUpIn.bits.rfWenCopy.nonEmpty) wakeUp.bits.rfWen := wakeUpIn.bits.rfWenCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 3664c5a0d77Sxiaofeibao-xjtu if (wakeUpIn.bits.fpWenCopy.nonEmpty) wakeUp.bits.fpWen := wakeUpIn.bits.fpWenCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 3674c5a0d77Sxiaofeibao-xjtu if (wakeUpIn.bits.vecWenCopy.nonEmpty) wakeUp.bits.vecWen := wakeUpIn.bits.vecWenCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 368c720aa49Ssinsanction if (wakeUpIn.bits.v0WenCopy.nonEmpty) wakeUp.bits.v0Wen := wakeUpIn.bits.v0WenCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 369c720aa49Ssinsanction if (wakeUpIn.bits.vlWenCopy.nonEmpty) wakeUp.bits.vlWen := wakeUpIn.bits.vlWenCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 3704c5a0d77Sxiaofeibao-xjtu if (wakeUpIn.bits.loadDependencyCopy.nonEmpty) wakeUp.bits.loadDependency := wakeUpIn.bits.loadDependencyCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 3710c7ebb58Sxiaofeibao-xjtu } 37260912d84Sxiaofeibao-xjtu if (iq.params.numIntSrc == 0) wakeUp.bits.rfWen := false.B 37360f0c5aeSxiaofeibao if (iq.params.numFpSrc == 0) wakeUp.bits.fpWen := false.B 37460912d84Sxiaofeibao-xjtu if (iq.params.numVfSrc == 0) wakeUp.bits.vecWen := false.B 375c720aa49Ssinsanction if (iq.params.numV0Src == 0) wakeUp.bits.v0Wen := false.B 376c720aa49Ssinsanction if (iq.params.numVlSrc == 0) wakeUp.bits.vlWen := false.B 377bf35baadSXuan Hu } 378ea46c302SXuan Hu iq.io.og0Cancel := io.fromDataPath.og0Cancel 379ea46c302SXuan Hu iq.io.og1Cancel := io.fromDataPath.og1Cancel 380e600b1ddSxiaofeibao-xjtu if (iq.params.needLoadDependency) 3810f55a0d3SHaojin Tang iq.io.ldCancel := io.ldCancel 382e600b1ddSxiaofeibao-xjtu else 383e600b1ddSxiaofeibao-xjtu iq.io.ldCancel := 0.U.asTypeOf(io.ldCancel) 384bf35baadSXuan Hu } 385bf35baadSXuan Hu 386b6279fc6SZiyue Zhang // connect the vl writeback informatino to the issue queues 387b6279fc6SZiyue Zhang issueQueues.zipWithIndex.foreach { case(iq, i) => 388c720aa49Ssinsanction iq.io.vlIsVlmax := io.vlWriteBackInfo.vlIsVlmax 389c720aa49Ssinsanction iq.io.vlIsZero := io.vlWriteBackInfo.vlIsZero 390b6279fc6SZiyue Zhang } 391b6279fc6SZiyue Zhang 392c0be7f33SXuan Hu private val iqWakeUpOutMap: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] = 393bf35baadSXuan Hu issueQueues.flatMap(_.io.wakeupToIQ) 394c0be7f33SXuan Hu .map(x => (x.bits.exuIdx, x)) 395bf35baadSXuan Hu .toMap 396bf35baadSXuan Hu 397bf35baadSXuan Hu // Connect bundles having the same wakeup source 398bf35baadSXuan Hu io.toSchedulers.wakeupVec.foreach { wakeUp => 399c0be7f33SXuan Hu wakeUp := iqWakeUpOutMap(wakeUp.bits.exuIdx) 400bf35baadSXuan Hu } 401bf35baadSXuan Hu 40259ef6009Sxiaofeibao-xjtu io.toDataPathAfterDelay.zipWithIndex.foreach { case (toDpDy, i) => 40359ef6009Sxiaofeibao-xjtu toDpDy <> issueQueues(i).io.deqDelay 40459ef6009Sxiaofeibao-xjtu } 405bf35baadSXuan Hu 406f99b81adSHaojin Tang // Response 407f99b81adSHaojin Tang issueQueues.zipWithIndex.foreach { case (iq, i) => 408f99b81adSHaojin Tang iq.io.og0Resp.zipWithIndex.foreach { case (og0Resp, j) => 409f99b81adSHaojin Tang og0Resp := io.fromDataPath(i)(j).og0resp 410f99b81adSHaojin Tang } 411f99b81adSHaojin Tang iq.io.og1Resp.zipWithIndex.foreach { case (og1Resp, j) => 412f99b81adSHaojin Tang og1Resp := io.fromDataPath(i)(j).og1resp 413f99b81adSHaojin Tang } 414f99b81adSHaojin Tang iq.io.finalIssueResp.foreach(_.zipWithIndex.foreach { case (finalIssueResp, j) => 415670870b3SXuan Hu if (io.loadFinalIssueResp(i).isDefinedAt(j)) { 416f99b81adSHaojin Tang finalIssueResp := io.loadFinalIssueResp(i)(j) 417670870b3SXuan Hu } else { 418670870b3SXuan Hu finalIssueResp := 0.U.asTypeOf(finalIssueResp) 419670870b3SXuan Hu } 420f99b81adSHaojin Tang }) 421e8800897SXuan Hu iq.io.memAddrIssueResp.foreach(_.zipWithIndex.foreach { case (memAddrIssueResp, j) => 422aa2bcc31SzhanglyGit if (io.memAddrIssueResp(i).isDefinedAt(j)) { 423e8800897SXuan Hu memAddrIssueResp := io.memAddrIssueResp(i)(j) 424aa2bcc31SzhanglyGit } else { 425aa2bcc31SzhanglyGit memAddrIssueResp := 0.U.asTypeOf(memAddrIssueResp) 426aa2bcc31SzhanglyGit } 427e8800897SXuan Hu }) 4287e471bf8SXuan Hu iq.io.vecLoadIssueResp.foreach(_.zipWithIndex.foreach { case (resp, deqIdx) => 4297e471bf8SXuan Hu resp := io.vecLoadIssueResp(i)(deqIdx) 4307e471bf8SXuan Hu }) 431f99b81adSHaojin Tang iq.io.wbBusyTableRead := io.fromWbFuBusyTable.fuBusyTableRead(i) 432f99b81adSHaojin Tang io.wbFuBusyTable(i) := iq.io.wbBusyTableWrite 433f8b278aaSsinsanction iq.io.replaceRCIdx.foreach(x => x := 0.U.asTypeOf(x)) 434f8b278aaSsinsanction } 43542b6cdf9Ssinsanction if (params.needOg2Resp) { 43642b6cdf9Ssinsanction issueQueues.filter(_.params.needOg2Resp).zip(io.fromOg2Resp.get).foreach{ case (iq, og2RespVec) => 43742b6cdf9Ssinsanction iq.io.og2Resp.get.zip(og2RespVec).foreach{ case (iqOg2Resp, og2Resp) => 43842b6cdf9Ssinsanction iqOg2Resp := og2Resp 43942b6cdf9Ssinsanction } 44042b6cdf9Ssinsanction } 44142b6cdf9Ssinsanction } 442f8b278aaSsinsanction 443f8b278aaSsinsanction // Connect each replace RCIdx to IQ 444f8b278aaSsinsanction if (params.needWriteRegCache) { 445f8b278aaSsinsanction val iqReplaceRCIdxVec = issueQueues.filter(_.params.needWriteRegCache).flatMap{ iq => 446f8b278aaSsinsanction iq.params.allExuParams.zip(iq.io.replaceRCIdx.get).filter(_._1.needWriteRegCache).map(_._2) 447f8b278aaSsinsanction } 448f8b278aaSsinsanction iqReplaceRCIdxVec.zip(io.fromDataPath.replaceRCIdx.get).foreach{ case (iq, in) => 449f8b278aaSsinsanction iq := in 450f8b278aaSsinsanction } 451f8b278aaSsinsanction 452f8b278aaSsinsanction println(s"[Scheduler] numWriteRegCache: ${params.numWriteRegCache}") 453f8b278aaSsinsanction println(s"[Scheduler] iqReplaceRCIdxVec: ${iqReplaceRCIdxVec.size}") 454f99b81adSHaojin Tang } 455f99b81adSHaojin Tang 456e1a85e9fSchengguanghui // perfEvent 457e1a85e9fSchengguanghui val lastCycleDp2IqOutFireVec = RegNext(VecInit(dispatch2Iq.io.out.flatten.map(_.fire))) 458e1a85e9fSchengguanghui val lastCycleIqEnqFireVec = RegNext(VecInit(issueQueues.map(_.io.enq.map(_.fire)).flatten)) 459e1a85e9fSchengguanghui val lastCycleIqFullVec = RegNext(VecInit(issueQueues.map(_.io.enq.head.ready))) 460e1a85e9fSchengguanghui 461e1a85e9fSchengguanghui val issueQueueFullVecPerf = issueQueues.zip(lastCycleIqFullVec)map{ case (iq, full) => (iq.params.getIQName + s"_full", full) } 462e1a85e9fSchengguanghui val basePerfEvents = Seq( 463e1a85e9fSchengguanghui ("dispatch2Iq_out_fire_cnt", PopCount(lastCycleDp2IqOutFireVec) ), 464e1a85e9fSchengguanghui ("issueQueue_enq_fire_cnt", PopCount(lastCycleIqEnqFireVec) ) 465e1a85e9fSchengguanghui ) ++ issueQueueFullVecPerf 466e1a85e9fSchengguanghui 467c0be7f33SXuan Hu println(s"[Scheduler] io.fromSchedulers.wakeupVec: ${io.fromSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}") 468bf35baadSXuan Hu println(s"[Scheduler] iqWakeUpInKeys: ${iqWakeUpInMap.keys}") 469bf35baadSXuan Hu 470bf35baadSXuan Hu println(s"[Scheduler] iqWakeUpOutKeys: ${iqWakeUpOutMap.keys}") 471c0be7f33SXuan Hu println(s"[Scheduler] io.toSchedulers.wakeupVec: ${io.toSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}") 472730cfbc0SXuan Hu} 473730cfbc0SXuan Hu 474730cfbc0SXuan Huclass SchedulerArithImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters) 475730cfbc0SXuan Hu extends SchedulerImpBase(wrapper) 476730cfbc0SXuan Hu with HasXSParameter 477e1a85e9fSchengguanghui with HasPerfEvents 478730cfbc0SXuan Hu{ 4792e0a7dc5Sfdy// dontTouch(io.vfWbFuBusyTable) 480730cfbc0SXuan Hu println(s"[SchedulerArithImp] " + 481730cfbc0SXuan Hu s"has intBusyTable: ${intBusyTable.nonEmpty}, " + 482730cfbc0SXuan Hu s"has vfBusyTable: ${vfBusyTable.nonEmpty}") 483730cfbc0SXuan Hu 484730cfbc0SXuan Hu issueQueues.zipWithIndex.foreach { case (iq, i) => 485730cfbc0SXuan Hu iq.io.flush <> io.fromCtrlBlock.flush 486730cfbc0SXuan Hu iq.io.enq <> dispatch2Iq.io.out(i) 487e600b1ddSxiaofeibao-xjtu if (!iq.params.needLoadDependency) { 488e600b1ddSxiaofeibao-xjtu iq.io.enq.map(x => x.bits.srcLoadDependency := 0.U.asTypeOf(x.bits.srcLoadDependency)) 489e600b1ddSxiaofeibao-xjtu } 490f39a61a1SzhanglyGit val intWBIQ = params.schdType match { 491f39a61a1SzhanglyGit case IntScheduler() => wakeupFromIntWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1) 49260f0c5aeSxiaofeibao case FpScheduler() => wakeupFromFpWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1) 493c720aa49Ssinsanction case VfScheduler() => (wakeupFromVfWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 494c720aa49Ssinsanction wakeupFromV0WBVec.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 495c720aa49Ssinsanction wakeupFromVlWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1)) 496596af5d2SHaojin Tang case _ => null 497f39a61a1SzhanglyGit } 498f39a61a1SzhanglyGit iq.io.wakeupFromWB.zip(intWBIQ).foreach{ case (sink, source) => sink := source} 499730cfbc0SXuan Hu } 500e1a85e9fSchengguanghui 501e1a85e9fSchengguanghui val perfEvents = basePerfEvents 502e1a85e9fSchengguanghui generatePerfEvent() 503730cfbc0SXuan Hu} 504730cfbc0SXuan Hu 505f99b81adSHaojin Tang// FIXME: Vector mem instructions may not be handled properly! 506730cfbc0SXuan Huclass SchedulerMemImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters) 507730cfbc0SXuan Hu extends SchedulerImpBase(wrapper) 508730cfbc0SXuan Hu with HasXSParameter 509e1a85e9fSchengguanghui with HasPerfEvents 510730cfbc0SXuan Hu{ 511730cfbc0SXuan Hu println(s"[SchedulerMemImp] " + 512730cfbc0SXuan Hu s"has intBusyTable: ${intBusyTable.nonEmpty}, " + 513730cfbc0SXuan Hu s"has vfBusyTable: ${vfBusyTable.nonEmpty}") 514730cfbc0SXuan Hu 515559c1710SHaojin Tang val memAddrIQs = issueQueues.filter(_.params.isMemAddrIQ) 516e07131b2Ssinsanction val stAddrIQs = issueQueues.filter(iq => iq.params.StaCnt > 0) // included in memAddrIQs 517e07131b2Ssinsanction val ldAddrIQs = issueQueues.filter(iq => iq.params.LduCnt > 0) 518e07131b2Ssinsanction val stDataIQs = issueQueues.filter(iq => iq.params.StdCnt > 0) 519559c1710SHaojin Tang val vecMemIQs = issueQueues.filter(_.params.isVecMemIQ) 520559c1710SHaojin Tang val (hyuIQs, hyuIQIdxs) = issueQueues.zipWithIndex.filter(_._1.params.HyuCnt > 0).unzip 521499caf4cSXuan Hu 522499caf4cSXuan Hu println(s"[SchedulerMemImp] memAddrIQs.size: ${memAddrIQs.size}, enq.size: ${memAddrIQs.map(_.io.enq.size).sum}") 523499caf4cSXuan Hu println(s"[SchedulerMemImp] stAddrIQs.size: ${stAddrIQs.size }, enq.size: ${stAddrIQs.map(_.io.enq.size).sum}") 524499caf4cSXuan Hu println(s"[SchedulerMemImp] ldAddrIQs.size: ${ldAddrIQs.size }, enq.size: ${ldAddrIQs.map(_.io.enq.size).sum}") 525499caf4cSXuan Hu println(s"[SchedulerMemImp] stDataIQs.size: ${stDataIQs.size }, enq.size: ${stDataIQs.map(_.io.enq.size).sum}") 526499caf4cSXuan Hu println(s"[SchedulerMemImp] hyuIQs.size: ${hyuIQs.size }, enq.size: ${hyuIQs.map(_.io.enq.size).sum}") 527730cfbc0SXuan Hu require(memAddrIQs.nonEmpty && stDataIQs.nonEmpty) 528730cfbc0SXuan Hu 529853cd2d8SHaojin Tang io.toMem.get.loadFastMatch := 0.U.asTypeOf(io.toMem.get.loadFastMatch) // TODO: is still needed? 530853cd2d8SHaojin Tang 531fc45ed13SXuan Hu private val loadWakeUp = issueQueues.filter(_.params.LdExuCnt > 0).map(_.asInstanceOf[IssueQueueMemAddrImp].io.memIO.get.loadWakeUp).flatten 532596af5d2SHaojin Tang require(loadWakeUp.length == io.fromMem.get.wakeup.length) 533596af5d2SHaojin Tang loadWakeUp.zip(io.fromMem.get.wakeup).foreach(x => x._1 := x._2) 534596af5d2SHaojin Tang 535730cfbc0SXuan Hu memAddrIQs.zipWithIndex.foreach { case (iq, i) => 536730cfbc0SXuan Hu iq.io.flush <> io.fromCtrlBlock.flush 537730cfbc0SXuan Hu iq.io.enq <> dispatch2Iq.io.out(i) 538e600b1ddSxiaofeibao-xjtu if (!iq.params.needLoadDependency) { 539e600b1ddSxiaofeibao-xjtu iq.io.enq.map(x => x.bits.srcLoadDependency := 0.U.asTypeOf(x.bits.srcLoadDependency)) 540e600b1ddSxiaofeibao-xjtu } 54160f0c5aeSxiaofeibao iq.io.wakeupFromWB.zip( 54260f0c5aeSxiaofeibao wakeupFromIntWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 54360f0c5aeSxiaofeibao wakeupFromFpWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 544c720aa49Ssinsanction wakeupFromVfWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 545c720aa49Ssinsanction wakeupFromV0WBVec.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 546c720aa49Ssinsanction wakeupFromVlWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1) 54760f0c5aeSxiaofeibao ).foreach{ case (sink, source) => sink := source} 548730cfbc0SXuan Hu } 549730cfbc0SXuan Hu 550ecfc6f16SXuan Hu ldAddrIQs.zipWithIndex.foreach { 551ecfc6f16SXuan Hu case (imp: IssueQueueMemAddrImp, i) => 552ecfc6f16SXuan Hu imp.io.memIO.get.feedbackIO.head := 0.U.asTypeOf(imp.io.memIO.get.feedbackIO.head) 553c14e89f4SHaojin Tang imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr 554de784418SXuan Hu imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 5557b753bebSXuan Hu case _ => 5567b753bebSXuan Hu } 5577b753bebSXuan Hu 558ecfc6f16SXuan Hu stAddrIQs.zipWithIndex.foreach { 559ecfc6f16SXuan Hu case (imp: IssueQueueMemAddrImp, i) => 560ecfc6f16SXuan Hu imp.io.memIO.get.feedbackIO.head := io.fromMem.get.staFeedback(i) 561c14e89f4SHaojin Tang imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr 562c14e89f4SHaojin Tang imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 5637b753bebSXuan Hu case _ => 5647b753bebSXuan Hu } 565730cfbc0SXuan Hu 566559c1710SHaojin Tang hyuIQs.zip(hyuIQIdxs).foreach { 567559c1710SHaojin Tang case (imp: IssueQueueMemAddrImp, idx) => 568670870b3SXuan Hu imp.io.memIO.get.feedbackIO.head := io.fromMem.get.hyuFeedback.head 569670870b3SXuan Hu imp.io.memIO.get.feedbackIO(1) := 0.U.asTypeOf(imp.io.memIO.get.feedbackIO(1)) 5708f1fa9b1Ssfencevma imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr 5718f1fa9b1Ssfencevma imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 572559c1710SHaojin Tang // TODO: refactor ditry code 573559c1710SHaojin Tang imp.io.deqDelay(1).ready := false.B 574559c1710SHaojin Tang io.toDataPathAfterDelay(idx)(1).valid := false.B 575559c1710SHaojin Tang io.toDataPathAfterDelay(idx)(1).bits := 0.U.asTypeOf(io.toDataPathAfterDelay(idx)(1).bits) 5768f1fa9b1Ssfencevma case _ => 5778f1fa9b1Ssfencevma } 5788f1fa9b1Ssfencevma 579e62b6911SXuan Hu private val staIdxSeq = (stAddrIQs).map(iq => iq.params.idxInSchBlk) 580e62b6911SXuan Hu private val hyaIdxSeq = (hyuIQs).map(iq => iq.params.idxInSchBlk) 581e62b6911SXuan Hu 582e62b6911SXuan Hu println(s"[SchedulerMemImp] sta iq idx in memSchdBlock: $staIdxSeq") 583e62b6911SXuan Hu println(s"[SchedulerMemImp] hya iq idx in memSchdBlock: $hyaIdxSeq") 584e62b6911SXuan Hu 585e62b6911SXuan Hu private val staEnqs = stAddrIQs.map(_.io.enq).flatten 586e62b6911SXuan Hu private val stdEnqs = stDataIQs.map(_.io.enq).flatten.take(staEnqs.size) 587e62b6911SXuan Hu private val hyaEnqs = hyuIQs.map(_.io.enq).flatten 588e62b6911SXuan Hu private val hydEnqs = stDataIQs.map(_.io.enq).flatten.drop(staEnqs.size) 589e62b6911SXuan Hu 590e62b6911SXuan Hu require(staEnqs.size == stdEnqs.size, s"number of enq ports of store address IQs(${staEnqs.size}) " + 591e62b6911SXuan Hu s"should be equal to number of enq ports of store data IQs(${stdEnqs.size})") 592e62b6911SXuan Hu 593e62b6911SXuan Hu require(hyaEnqs.size == hydEnqs.size, s"number of enq ports of hybrid address IQs(${hyaEnqs.size}) " + 594e62b6911SXuan Hu s"should be equal to number of enq ports of hybrid data IQs(${hydEnqs.size})") 5959b258a00Sxgkiri 5960438e8f4SHaojin Tang val d2IqStaOut = dispatch2Iq.io.out.zipWithIndex.filter(staIdxSeq contains _._2).unzip._1.flatten 5970438e8f4SHaojin Tang d2IqStaOut.zip(staEnqs).zip(stdEnqs).foreach{ case((dp, staIQ), stdIQ) => 598730cfbc0SXuan Hu val isAllReady = staIQ.ready && stdIQ.ready 599e62b6911SXuan Hu dp.ready := isAllReady 600e62b6911SXuan Hu staIQ.valid := dp.valid && isAllReady 6010438e8f4SHaojin Tang stdIQ.valid := dp.valid && isAllReady && FuType.FuTypeOrR(dp.bits.fuType, FuType.stu, FuType.mou) 6029b258a00Sxgkiri } 603730cfbc0SXuan Hu 6040438e8f4SHaojin Tang val d2IqHyaOut = dispatch2Iq.io.out.zipWithIndex.filter(hyaIdxSeq contains _._2).unzip._1.flatten 6050438e8f4SHaojin Tang d2IqHyaOut.zip(hyaEnqs).zip(hydEnqs).foreach{ case((dp, hyaIQ), hydIQ) => 606e62b6911SXuan Hu val isAllReady = hyaIQ.ready && hydIQ.ready 607e62b6911SXuan Hu dp.ready := isAllReady 608e62b6911SXuan Hu hyaIQ.valid := dp.valid && isAllReady 60956bceacbSHaojin Tang hydIQ.valid := dp.valid && isAllReady && FuType.FuTypeOrR(dp.bits.fuType, FuType.stu, FuType.mou) 610e62b6911SXuan Hu } 611730cfbc0SXuan Hu 612e62b6911SXuan Hu stDataIQs.zipWithIndex.foreach { case (iq, i) => 613e62b6911SXuan Hu iq.io.flush <> io.fromCtrlBlock.flush 61460f0c5aeSxiaofeibao iq.io.wakeupFromWB.zip( 61560f0c5aeSxiaofeibao wakeupFromIntWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 61660f0c5aeSxiaofeibao wakeupFromFpWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 617c720aa49Ssinsanction wakeupFromVfWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 618c720aa49Ssinsanction wakeupFromV0WBVec.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 619c720aa49Ssinsanction wakeupFromVlWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq 62060f0c5aeSxiaofeibao ).foreach{ case (sink, source) => sink := source} 621e62b6911SXuan Hu } 622e62b6911SXuan Hu 623e62b6911SXuan Hu (stdEnqs ++ hydEnqs).zip(staEnqs ++ hyaEnqs).zipWithIndex.foreach { case ((stdIQEnq, staIQEnq), i) => 624730cfbc0SXuan Hu stdIQEnq.bits := staIQEnq.bits 625730cfbc0SXuan Hu // Store data reuses store addr src(1) in dispatch2iq 626e62b6911SXuan Hu // [dispatch2iq] --src*------src*(0)--> [staIQ|hyaIQ] 627730cfbc0SXuan Hu // \ 628730cfbc0SXuan Hu // ---src*(1)--> [stdIQ] 629730cfbc0SXuan Hu // Since the src(1) of sta is easier to get, stdIQEnq.bits.src*(0) is assigned to staIQEnq.bits.src*(1) 630730cfbc0SXuan Hu // instead of dispatch2Iq.io.out(x).bits.src*(1) 63197b279b9SXuan Hu val stdIdx = 1 6322d270511Ssinsanction stdIQEnq.bits.srcState(0) := staIQEnq.bits.srcState(stdIdx) 633955b4beaSsinsanction stdIQEnq.bits.srcLoadDependency(0) := staIQEnq.bits.srcLoadDependency(stdIdx) 6342d270511Ssinsanction stdIQEnq.bits.srcType(0) := staIQEnq.bits.srcType(stdIdx) 6352d270511Ssinsanction stdIQEnq.bits.psrc(0) := staIQEnq.bits.psrc(stdIdx) 636730cfbc0SXuan Hu stdIQEnq.bits.sqIdx := staIQEnq.bits.sqIdx 637955b4beaSsinsanction stdIQEnq.bits.useRegCache(0) := staIQEnq.bits.useRegCache(stdIdx) 638955b4beaSsinsanction stdIQEnq.bits.regCacheIdx(0) := staIQEnq.bits.regCacheIdx(stdIdx) 639730cfbc0SXuan Hu } 640730cfbc0SXuan Hu 6412d270511Ssinsanction vecMemIQs.foreach { 6422d270511Ssinsanction case imp: IssueQueueVecMemImp => 6432d270511Ssinsanction imp.io.memIO.get.sqDeqPtr.foreach(_ := io.fromMem.get.sqDeqPtr) 6442d270511Ssinsanction imp.io.memIO.get.lqDeqPtr.foreach(_ := io.fromMem.get.lqDeqPtr) 6451f3d1b4dSXuan Hu // not used 646b7c799beSzhanglyGit //imp.io.memIO.get.feedbackIO.head := io.fromMem.get.vstuFeedback.head // only vector store replay 6471f3d1b4dSXuan Hu // maybe not used 6481f3d1b4dSXuan Hu imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr 6491f3d1b4dSXuan Hu imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 65060f0c5aeSxiaofeibao imp.io.wakeupFromWB.zip( 65160f0c5aeSxiaofeibao wakeupFromIntWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 65260f0c5aeSxiaofeibao wakeupFromFpWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 653c720aa49Ssinsanction wakeupFromVfWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 654c720aa49Ssinsanction wakeupFromV0WBVec.zipWithIndex.filter(x => imp.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 655c720aa49Ssinsanction wakeupFromVlWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq 65660f0c5aeSxiaofeibao ).foreach{ case (sink, source) => sink := source} 657f39a61a1SzhanglyGit 6582d270511Ssinsanction case _ => 6592d270511Ssinsanction } 660b7c799beSzhanglyGit val vecMemFeedbackIO: Seq[MemRSFeedbackIO] = vecMemIQs.map { 661b7c799beSzhanglyGit case imp: IssueQueueVecMemImp => 662b7c799beSzhanglyGit imp.io.memIO.get.feedbackIO 663b7c799beSzhanglyGit }.flatten 664b7c799beSzhanglyGit assert(vecMemFeedbackIO.size == io.fromMem.get.vstuFeedback.size, "vecMemFeedback size dont match!") 665b7c799beSzhanglyGit vecMemFeedbackIO.zip(io.fromMem.get.vstuFeedback).foreach{ 666b7c799beSzhanglyGit case (sink, source) => 667b7c799beSzhanglyGit sink := source 668b7c799beSzhanglyGit } 6692d270511Ssinsanction 670730cfbc0SXuan Hu val lsqEnqCtrl = Module(new LsqEnqCtrl) 671730cfbc0SXuan Hu 672730cfbc0SXuan Hu lsqEnqCtrl.io.redirect <> io.fromCtrlBlock.flush 673730cfbc0SXuan Hu lsqEnqCtrl.io.enq <> dispatch2Iq.io.enqLsqIO.get 674730cfbc0SXuan Hu lsqEnqCtrl.io.lcommit := io.fromMem.get.lcommit 675730cfbc0SXuan Hu lsqEnqCtrl.io.scommit := io.fromMem.get.scommit 676730cfbc0SXuan Hu lsqEnqCtrl.io.lqCancelCnt := io.fromMem.get.lqCancelCnt 677730cfbc0SXuan Hu lsqEnqCtrl.io.sqCancelCnt := io.fromMem.get.sqCancelCnt 678f3a9fb05SAnzo dispatch2Iq.io.lqFreeCount.get := lsqEnqCtrl.io.lqFreeCount 679f3a9fb05SAnzo dispatch2Iq.io.sqFreeCount.get := lsqEnqCtrl.io.sqFreeCount 680730cfbc0SXuan Hu io.memIO.get.lsqEnqIO <> lsqEnqCtrl.io.enqLsq 6817e471bf8SXuan Hu 6827e471bf8SXuan Hu dontTouch(io.vecLoadIssueResp) 683e1a85e9fSchengguanghui 684e1a85e9fSchengguanghui val intBusyTablePerf = intBusyTable.get 685e1a85e9fSchengguanghui val fpBusyTablePerf = fpBusyTable.get 686e1a85e9fSchengguanghui val vecBusyTablePerf = vfBusyTable.get 687e1a85e9fSchengguanghui val v0BusyTablePerf = v0BusyTable.get 688e1a85e9fSchengguanghui val vlBusyTablePerf = vlBusyTable.get 689e1a85e9fSchengguanghui 690e1a85e9fSchengguanghui val perfEvents = basePerfEvents ++ Seq(intBusyTablePerf, fpBusyTablePerf, vecBusyTablePerf, v0BusyTablePerf, vlBusyTablePerf).flatten(_.getPerfEvents) 691e1a85e9fSchengguanghui generatePerfEvent() 692730cfbc0SXuan Hu} 693