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*e1a85e9fSchengguanghuiimport 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 18730cfbc0SXuan Hu 19730cfbc0SXuan Husealed trait SchedulerType 20730cfbc0SXuan Hu 21730cfbc0SXuan Hucase class IntScheduler() extends SchedulerType 2260f0c5aeSxiaofeibaocase class FpScheduler() extends SchedulerType 23730cfbc0SXuan Hucase class MemScheduler() extends SchedulerType 24730cfbc0SXuan Hucase class VfScheduler() extends SchedulerType 25730cfbc0SXuan Hucase class NoScheduler() extends SchedulerType 26730cfbc0SXuan Hu 27730cfbc0SXuan Huclass Scheduler(val params: SchdBlockParams)(implicit p: Parameters) extends LazyModule with HasXSParameter { 281ca4a39dSXuan Hu override def shouldBeInlined: Boolean = false 291ca4a39dSXuan Hu 3039c59369SXuan Hu val numIntStateWrite = backendParams.numPregWb(IntData()) 3160f0c5aeSxiaofeibao val numFpStateWrite = backendParams.numPregWb(FpData()) 3239c59369SXuan Hu val numVfStateWrite = backendParams.numPregWb(VecData()) 3307b5cc60Sxiaofeibao val numV0StateWrite = backendParams.numPregWb(V0Data()) 3407b5cc60Sxiaofeibao val numVlStateWrite = backendParams.numPregWb(VlData()) 35730cfbc0SXuan Hu 36730cfbc0SXuan Hu val dispatch2Iq = LazyModule(new Dispatch2Iq(params)) 37730cfbc0SXuan Hu val issueQueue = params.issueBlockParams.map(x => LazyModule(new IssueQueue(x).suggestName(x.getIQName))) 38730cfbc0SXuan Hu 3983ba63b3SXuan Hu lazy val module: SchedulerImpBase = params.schdType match { 40730cfbc0SXuan Hu case IntScheduler() => new SchedulerArithImp(this)(params, p) 4160f0c5aeSxiaofeibao case FpScheduler() => new SchedulerArithImp(this)(params, p) 42730cfbc0SXuan Hu case MemScheduler() => new SchedulerMemImp(this)(params, p) 43730cfbc0SXuan Hu case VfScheduler() => new SchedulerArithImp(this)(params, p) 44730cfbc0SXuan Hu case _ => null 45730cfbc0SXuan Hu } 46730cfbc0SXuan Hu} 47730cfbc0SXuan Hu 487f8233d5SHaojin Tangclass SchedulerIO()(implicit params: SchdBlockParams, p: Parameters) extends XSBundle { 4968d13085SXuan Hu // params alias 507f8233d5SHaojin Tang private val LoadQueueSize = VirtualLoadQueueSize 5168d13085SXuan Hu 52730cfbc0SXuan Hu val fromTop = new Bundle { 53730cfbc0SXuan Hu val hartId = Input(UInt(8.W)) 54730cfbc0SXuan Hu } 552e0a7dc5Sfdy val fromWbFuBusyTable = new Bundle{ 562e0a7dc5Sfdy val fuBusyTableRead = MixedVec(params.issueBlockParams.map(x => Input(x.genWbFuBusyTableReadBundle))) 572e0a7dc5Sfdy } 58dd970561SzhanglyGit val wbFuBusyTable = MixedVec(params.issueBlockParams.map(x => Output(x.genWbFuBusyTableWriteBundle))) 5982674533Sxiaofeibao val intIQValidNumVec = Output(MixedVec(backendParams.genIntIQValidNumBundle)) 6082674533Sxiaofeibao val fpIQValidNumVec = Output(MixedVec(backendParams.genFpIQValidNumBundle)) 61dd970561SzhanglyGit 62730cfbc0SXuan Hu val fromCtrlBlock = new Bundle { 63730cfbc0SXuan Hu val flush = Flipped(ValidIO(new Redirect)) 64730cfbc0SXuan Hu } 65730cfbc0SXuan Hu val fromDispatch = new Bundle { 66730cfbc0SXuan Hu val allocPregs = Vec(RenameWidth, Input(new ResetPregStateReq)) 67730cfbc0SXuan Hu val uops = Vec(params.numUopIn, Flipped(DecoupledIO(new DynInst))) 68730cfbc0SXuan Hu } 6939c59369SXuan Hu val intWriteBack = MixedVec(Vec(backendParams.numPregWb(IntData()), 70730cfbc0SXuan Hu new RfWritePortWithConfig(backendParams.intPregParams.dataCfg, backendParams.intPregParams.addrWidth))) 7160f0c5aeSxiaofeibao val fpWriteBack = MixedVec(Vec(backendParams.numPregWb(FpData()), 7260f0c5aeSxiaofeibao new RfWritePortWithConfig(backendParams.fpPregParams.dataCfg, backendParams.fpPregParams.addrWidth))) 7339c59369SXuan Hu val vfWriteBack = MixedVec(Vec(backendParams.numPregWb(VecData()), 74730cfbc0SXuan Hu new RfWritePortWithConfig(backendParams.vfPregParams.dataCfg, backendParams.vfPregParams.addrWidth))) 7507b5cc60Sxiaofeibao val v0WriteBack = MixedVec(Vec(backendParams.numPregWb(V0Data()), 76c720aa49Ssinsanction new RfWritePortWithConfig(backendParams.v0PregParams.dataCfg, backendParams.v0PregParams.addrWidth))) 7707b5cc60Sxiaofeibao val vlWriteBack = MixedVec(Vec(backendParams.numPregWb(VlData()), 78c720aa49Ssinsanction new RfWritePortWithConfig(backendParams.vlPregParams.dataCfg, backendParams.vlPregParams.addrWidth))) 7959ef6009Sxiaofeibao-xjtu val toDataPathAfterDelay: MixedVec[MixedVec[DecoupledIO[IssueQueueIssueBundle]]] = MixedVec(params.issueBlockParams.map(_.genIssueDecoupledBundle)) 80730cfbc0SXuan Hu 81c720aa49Ssinsanction val vlWriteBackInfo = new Bundle { 82b6279fc6SZiyue Zhang val vlIsZero = Input(Bool()) 83b6279fc6SZiyue Zhang val vlIsVlmax = Input(Bool()) 84b6279fc6SZiyue Zhang } 85b6279fc6SZiyue Zhang 86bf35baadSXuan Hu val fromSchedulers = new Bundle { 87c0be7f33SXuan Hu val wakeupVec: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpInValidBundle) 88bf35baadSXuan Hu } 89bf35baadSXuan Hu 90bf35baadSXuan Hu val toSchedulers = new Bundle { 91c0be7f33SXuan Hu val wakeupVec: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = params.genIQWakeUpOutValidBundle 92bf35baadSXuan Hu } 93bf35baadSXuan Hu 94c0be7f33SXuan Hu val fromDataPath = new Bundle { 9510fe9778SXuan Hu val resp: MixedVec[MixedVec[OGRespBundle]] = MixedVec(params.issueBlockParams.map(x => Flipped(x.genOGRespBundle))) 967a96cc7fSHaojin Tang val og0Cancel = Input(ExuOH(backendParams.numExu)) 97ea46c302SXuan Hu // Todo: remove this after no cancel signal from og1 987a96cc7fSHaojin Tang val og1Cancel = Input(ExuOH(backendParams.numExu)) 99bc7d6943SzhanglyGit val cancelToBusyTable = Vec(backendParams.numExu, Flipped(ValidIO(new CancelSignal))) 100c0be7f33SXuan Hu // just be compatible to old code 101c0be7f33SXuan Hu def apply(i: Int)(j: Int) = resp(i)(j) 102c0be7f33SXuan Hu } 103c0be7f33SXuan Hu 1048a66c02cSXuan Hu val loadFinalIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.LdExuCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x))))))) 1058a66c02cSXuan Hu val memAddrIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.LdExuCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x))))))) 1067e471bf8SXuan Hu val vecLoadIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.VlduCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x))))))) 1070f55a0d3SHaojin Tang 1086810d1e8Ssfencevma val ldCancel = Vec(backendParams.LduCnt + backendParams.HyuCnt, Flipped(new LoadCancelIO)) 109c0be7f33SXuan Hu 110730cfbc0SXuan Hu val memIO = if (params.isMemSchd) Some(new Bundle { 111730cfbc0SXuan Hu val lsqEnqIO = Flipped(new LsqEnqIO) 112730cfbc0SXuan Hu }) else None 113730cfbc0SXuan Hu val fromMem = if (params.isMemSchd) Some(new Bundle { 1147b753bebSXuan Hu val ldaFeedback = Flipped(Vec(params.LduCnt, new MemRSFeedbackIO)) 1157b753bebSXuan Hu val staFeedback = Flipped(Vec(params.StaCnt, new MemRSFeedbackIO)) 1168f1fa9b1Ssfencevma val hyuFeedback = Flipped(Vec(params.HyuCnt, new MemRSFeedbackIO)) 117fd490615Sweiding liu val vstuFeedback = Flipped(Vec(params.VstuCnt, new MemRSFeedbackIO(isVector = true))) 118fd490615Sweiding liu val vlduFeedback = Flipped(Vec(params.VlduCnt, new MemRSFeedbackIO(isVector = true))) 119730cfbc0SXuan Hu val stIssuePtr = Input(new SqPtr()) 120730cfbc0SXuan Hu val lcommit = Input(UInt(log2Up(CommitWidth + 1).W)) 121730cfbc0SXuan Hu val scommit = Input(UInt(log2Ceil(EnsbufferWidth + 1).W)) // connected to `memBlock.io.sqDeq` instead of ROB 122fc45ed13SXuan Hu val wakeup = Vec(params.LdExuCnt, Flipped(Valid(new DynInst))) 1232d270511Ssinsanction val lqDeqPtr = Input(new LqPtr) 1242d270511Ssinsanction val sqDeqPtr = Input(new SqPtr) 125730cfbc0SXuan Hu // from lsq 126730cfbc0SXuan Hu val lqCancelCnt = Input(UInt(log2Up(LoadQueueSize + 1).W)) 127730cfbc0SXuan Hu val sqCancelCnt = Input(UInt(log2Up(StoreQueueSize + 1).W)) 128730cfbc0SXuan Hu val memWaitUpdateReq = Flipped(new MemWaitUpdateReq) 129730cfbc0SXuan Hu }) else None 130730cfbc0SXuan Hu val toMem = if (params.isMemSchd) Some(new Bundle { 131730cfbc0SXuan Hu val loadFastMatch = Output(Vec(params.LduCnt, new IssueQueueLoadBundle)) 132730cfbc0SXuan Hu }) else None 133c38df446SzhanglyGit val fromOg2 = if(params.isVfSchd) Some(MixedVec(params.issueBlockParams.map(x => Flipped(x.genOG2RespBundle)))) else None 134730cfbc0SXuan Hu} 135730cfbc0SXuan Hu 136730cfbc0SXuan Huabstract class SchedulerImpBase(wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters) 137730cfbc0SXuan Hu extends LazyModuleImp(wrapper) 138730cfbc0SXuan Hu with HasXSParameter 139730cfbc0SXuan Hu{ 140730cfbc0SXuan Hu val io = IO(new SchedulerIO()) 141730cfbc0SXuan Hu 142730cfbc0SXuan Hu // alias 143c0be7f33SXuan Hu private val iqWakeUpInMap: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] = 144c0be7f33SXuan Hu io.fromSchedulers.wakeupVec.map(x => (x.bits.exuIdx, x)).toMap 145730cfbc0SXuan Hu private val schdType = params.schdType 146730cfbc0SXuan Hu 147730cfbc0SXuan Hu // Modules 148730cfbc0SXuan Hu val dispatch2Iq: Dispatch2IqImp = wrapper.dispatch2Iq.module 149730cfbc0SXuan Hu val issueQueues: Seq[IssueQueueImp] = wrapper.issueQueue.map(_.module) 15082674533Sxiaofeibao io.intIQValidNumVec := 0.U.asTypeOf(io.intIQValidNumVec) 15182674533Sxiaofeibao io.fpIQValidNumVec := 0.U.asTypeOf(io.fpIQValidNumVec) 152ff3fcdf1Sxiaofeibao-xjtu if (params.isIntSchd) { 15382674533Sxiaofeibao dispatch2Iq.io.intIQValidNumVec.get := io.intIQValidNumVec 15482674533Sxiaofeibao io.intIQValidNumVec := MixedVecInit(issueQueues.map(_.io.validCntDeqVec)) 155ff3fcdf1Sxiaofeibao-xjtu } 15682674533Sxiaofeibao else if (params.isFpSchd) { 15782674533Sxiaofeibao dispatch2Iq.io.fpIQValidNumVec.get := io.fpIQValidNumVec 15882674533Sxiaofeibao io.fpIQValidNumVec := MixedVecInit(issueQueues.map(_.io.validCntDeqVec)) 15982674533Sxiaofeibao } 160730cfbc0SXuan Hu 16156bcaed7SHaojin Tang // valid count 16256bcaed7SHaojin Tang dispatch2Iq.io.iqValidCnt := issueQueues.filter(_.params.StdCnt == 0).map(_.io.status.validCnt) 16356bcaed7SHaojin Tang 164730cfbc0SXuan Hu // BusyTable Modules 165730cfbc0SXuan Hu val intBusyTable = schdType match { 166bc7d6943SzhanglyGit case IntScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numIntStateRead, wrapper.numIntStateWrite, IntPhyRegs, IntWB()))) 167730cfbc0SXuan Hu case _ => None 168730cfbc0SXuan Hu } 16960f0c5aeSxiaofeibao val fpBusyTable = schdType match { 17060f0c5aeSxiaofeibao case FpScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numFpStateRead, wrapper.numFpStateWrite, FpPhyRegs, FpWB()))) 17160f0c5aeSxiaofeibao case _ => None 17260f0c5aeSxiaofeibao } 173730cfbc0SXuan Hu val vfBusyTable = schdType match { 174bc7d6943SzhanglyGit case VfScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numVfStateRead, wrapper.numVfStateWrite, VfPhyRegs, VfWB()))) 175730cfbc0SXuan Hu case _ => None 176730cfbc0SXuan Hu } 177c720aa49Ssinsanction val v0BusyTable = schdType match { 178c720aa49Ssinsanction case VfScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numV0StateRead, wrapper.numV0StateWrite, V0PhyRegs, V0WB()))) 179c720aa49Ssinsanction case _ => None 180c720aa49Ssinsanction } 181c720aa49Ssinsanction val vlBusyTable = schdType match { 182c720aa49Ssinsanction case VfScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numVlStateRead, wrapper.numVlStateWrite, VlPhyRegs, VlWB()))) 183c720aa49Ssinsanction case _ => None 184c720aa49Ssinsanction } 185730cfbc0SXuan Hu 186730cfbc0SXuan Hu dispatch2Iq.io match { case dp2iq => 187730cfbc0SXuan Hu dp2iq.redirect <> io.fromCtrlBlock.flush 188730cfbc0SXuan Hu dp2iq.in <> io.fromDispatch.uops 189730cfbc0SXuan Hu dp2iq.readIntState.foreach(_ <> intBusyTable.get.io.read) 19060f0c5aeSxiaofeibao dp2iq.readFpState.foreach(_ <> fpBusyTable.get.io.read) 191730cfbc0SXuan Hu dp2iq.readVfState.foreach(_ <> vfBusyTable.get.io.read) 192c720aa49Ssinsanction dp2iq.readV0State.foreach(_ <> v0BusyTable.get.io.read) 193c720aa49Ssinsanction dp2iq.readVlState.foreach(_ <> vlBusyTable.get.io.read) 194730cfbc0SXuan Hu } 195730cfbc0SXuan Hu 196730cfbc0SXuan Hu intBusyTable match { 197730cfbc0SXuan Hu case Some(bt) => 198730cfbc0SXuan Hu bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) => 199730cfbc0SXuan Hu btAllocPregs.valid := dpAllocPregs.isInt 200730cfbc0SXuan Hu btAllocPregs.bits := dpAllocPregs.preg 201730cfbc0SXuan Hu } 202730cfbc0SXuan Hu bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) => 203730cfbc0SXuan Hu wb.valid := io.intWriteBack(i).wen && io.intWriteBack(i).intWen 204730cfbc0SXuan Hu wb.bits := io.intWriteBack(i).addr 205730cfbc0SXuan Hu } 206bc7d6943SzhanglyGit bt.io.wakeUp := io.fromSchedulers.wakeupVec 207bc7d6943SzhanglyGit bt.io.cancel := io.fromDataPath.cancelToBusyTable 20813551487SzhanglyGit bt.io.ldCancel := io.ldCancel 209730cfbc0SXuan Hu case None => 210730cfbc0SXuan Hu } 211730cfbc0SXuan Hu 21260f0c5aeSxiaofeibao fpBusyTable match { 213730cfbc0SXuan Hu case Some(bt) => 214730cfbc0SXuan Hu bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) => 215730cfbc0SXuan Hu btAllocPregs.valid := dpAllocPregs.isFp 216730cfbc0SXuan Hu btAllocPregs.bits := dpAllocPregs.preg 217730cfbc0SXuan Hu } 218730cfbc0SXuan Hu bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) => 21960f0c5aeSxiaofeibao wb.valid := io.fpWriteBack(i).wen && io.fpWriteBack(i).fpWen 22060f0c5aeSxiaofeibao wb.bits := io.fpWriteBack(i).addr 22160f0c5aeSxiaofeibao } 22260f0c5aeSxiaofeibao bt.io.wakeUp := io.fromSchedulers.wakeupVec 22360f0c5aeSxiaofeibao bt.io.cancel := io.fromDataPath.cancelToBusyTable 22460f0c5aeSxiaofeibao bt.io.ldCancel := io.ldCancel 22560f0c5aeSxiaofeibao case None => 22660f0c5aeSxiaofeibao } 22760f0c5aeSxiaofeibao 22860f0c5aeSxiaofeibao vfBusyTable match { 22960f0c5aeSxiaofeibao case Some(bt) => 23060f0c5aeSxiaofeibao bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) => 23160f0c5aeSxiaofeibao btAllocPregs.valid := dpAllocPregs.isVec 23260f0c5aeSxiaofeibao btAllocPregs.bits := dpAllocPregs.preg 23360f0c5aeSxiaofeibao } 23460f0c5aeSxiaofeibao bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) => 23560f0c5aeSxiaofeibao wb.valid := io.vfWriteBack(i).wen && io.vfWriteBack(i).vecWen 236730cfbc0SXuan Hu wb.bits := io.vfWriteBack(i).addr 237730cfbc0SXuan Hu } 238bc7d6943SzhanglyGit bt.io.wakeUp := io.fromSchedulers.wakeupVec 239bc7d6943SzhanglyGit bt.io.cancel := io.fromDataPath.cancelToBusyTable 24013551487SzhanglyGit bt.io.ldCancel := io.ldCancel 241730cfbc0SXuan Hu case None => 242730cfbc0SXuan Hu } 243730cfbc0SXuan Hu 244c720aa49Ssinsanction v0BusyTable match { 245c720aa49Ssinsanction case Some(bt) => 246c720aa49Ssinsanction bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) => 24729aa55c1Sxiaofeibao btAllocPregs.valid := dpAllocPregs.isV0 248c720aa49Ssinsanction btAllocPregs.bits := dpAllocPregs.preg 249c720aa49Ssinsanction } 250c720aa49Ssinsanction bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) => 251c720aa49Ssinsanction wb.valid := io.v0WriteBack(i).wen && io.v0WriteBack(i).v0Wen 252c720aa49Ssinsanction wb.bits := io.v0WriteBack(i).addr 253c720aa49Ssinsanction } 254c720aa49Ssinsanction bt.io.wakeUp := io.fromSchedulers.wakeupVec 255c720aa49Ssinsanction bt.io.cancel := io.fromDataPath.cancelToBusyTable 256c720aa49Ssinsanction bt.io.ldCancel := io.ldCancel 257c720aa49Ssinsanction case None => 258c720aa49Ssinsanction } 259c720aa49Ssinsanction 260c720aa49Ssinsanction vlBusyTable match { 261c720aa49Ssinsanction case Some(bt) => 262c720aa49Ssinsanction bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) => 26329aa55c1Sxiaofeibao btAllocPregs.valid := dpAllocPregs.isVl 264c720aa49Ssinsanction btAllocPregs.bits := dpAllocPregs.preg 265c720aa49Ssinsanction } 266c720aa49Ssinsanction bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) => 267c720aa49Ssinsanction wb.valid := io.vlWriteBack(i).wen && io.vlWriteBack(i).vlWen 268c720aa49Ssinsanction wb.bits := io.vlWriteBack(i).addr 269c720aa49Ssinsanction } 270c720aa49Ssinsanction bt.io.wakeUp := io.fromSchedulers.wakeupVec 271c720aa49Ssinsanction bt.io.cancel := io.fromDataPath.cancelToBusyTable 272c720aa49Ssinsanction bt.io.ldCancel := io.ldCancel 273c720aa49Ssinsanction case None => 274c720aa49Ssinsanction } 275c720aa49Ssinsanction 276f39a61a1SzhanglyGit val wakeupFromIntWBVec = Wire(params.genIntWBWakeUpSinkValidBundle) 27760f0c5aeSxiaofeibao val wakeupFromFpWBVec = Wire(params.genFpWBWakeUpSinkValidBundle) 278f39a61a1SzhanglyGit val wakeupFromVfWBVec = Wire(params.genVfWBWakeUpSinkValidBundle) 279c720aa49Ssinsanction val wakeupFromV0WBVec = Wire(params.genV0WBWakeUpSinkValidBundle) 280c720aa49Ssinsanction val wakeupFromVlWBVec = Wire(params.genVlWBWakeUpSinkValidBundle) 281f39a61a1SzhanglyGit 282f39a61a1SzhanglyGit wakeupFromIntWBVec.zip(io.intWriteBack).foreach { case (sink, source) => 283f39a61a1SzhanglyGit sink.valid := source.wen 284f39a61a1SzhanglyGit sink.bits.rfWen := source.intWen 285f39a61a1SzhanglyGit sink.bits.fpWen := source.fpWen 286f39a61a1SzhanglyGit sink.bits.vecWen := source.vecWen 287c720aa49Ssinsanction sink.bits.v0Wen := source.v0Wen 288c720aa49Ssinsanction sink.bits.vlWen := source.vlWen 289f39a61a1SzhanglyGit sink.bits.pdest := source.addr 290730cfbc0SXuan Hu } 291f39a61a1SzhanglyGit 29260f0c5aeSxiaofeibao wakeupFromFpWBVec.zip(io.fpWriteBack).foreach { case (sink, source) => 29360f0c5aeSxiaofeibao sink.valid := source.wen 29460f0c5aeSxiaofeibao sink.bits.rfWen := source.intWen 29560f0c5aeSxiaofeibao sink.bits.fpWen := source.fpWen 29660f0c5aeSxiaofeibao sink.bits.vecWen := source.vecWen 297c720aa49Ssinsanction sink.bits.v0Wen := source.v0Wen 298c720aa49Ssinsanction sink.bits.vlWen := source.vlWen 29960f0c5aeSxiaofeibao sink.bits.pdest := source.addr 30060f0c5aeSxiaofeibao } 30160f0c5aeSxiaofeibao 302f39a61a1SzhanglyGit wakeupFromVfWBVec.zip(io.vfWriteBack).foreach { case (sink, source) => 303730cfbc0SXuan Hu sink.valid := source.wen 304730cfbc0SXuan Hu sink.bits.rfWen := source.intWen 305730cfbc0SXuan Hu sink.bits.fpWen := source.fpWen 306730cfbc0SXuan Hu sink.bits.vecWen := source.vecWen 307c720aa49Ssinsanction sink.bits.v0Wen := source.v0Wen 308c720aa49Ssinsanction sink.bits.vlWen := source.vlWen 309c720aa49Ssinsanction sink.bits.pdest := source.addr 310c720aa49Ssinsanction } 311c720aa49Ssinsanction 312c720aa49Ssinsanction wakeupFromV0WBVec.zip(io.v0WriteBack).foreach { case (sink, source) => 313c720aa49Ssinsanction sink.valid := source.wen 314c720aa49Ssinsanction sink.bits.rfWen := source.intWen 315c720aa49Ssinsanction sink.bits.fpWen := source.fpWen 316c720aa49Ssinsanction sink.bits.vecWen := source.vecWen 317c720aa49Ssinsanction sink.bits.v0Wen := source.v0Wen 318c720aa49Ssinsanction sink.bits.vlWen := source.vlWen 319c720aa49Ssinsanction sink.bits.pdest := source.addr 320c720aa49Ssinsanction } 321c720aa49Ssinsanction 322c720aa49Ssinsanction wakeupFromVlWBVec.zip(io.vlWriteBack).foreach { case (sink, source) => 323c720aa49Ssinsanction sink.valid := source.wen 324c720aa49Ssinsanction sink.bits.rfWen := source.intWen 325c720aa49Ssinsanction sink.bits.fpWen := source.fpWen 326c720aa49Ssinsanction sink.bits.vecWen := source.vecWen 327c720aa49Ssinsanction sink.bits.v0Wen := source.v0Wen 328c720aa49Ssinsanction sink.bits.vlWen := source.vlWen 329730cfbc0SXuan Hu sink.bits.pdest := source.addr 330730cfbc0SXuan Hu } 331730cfbc0SXuan Hu 332bf35baadSXuan Hu // Connect bundles having the same wakeup source 33359ef6009Sxiaofeibao-xjtu issueQueues.zipWithIndex.foreach { case(iq, i) => 334bf35baadSXuan Hu iq.io.wakeupFromIQ.foreach { wakeUp => 3350c7ebb58Sxiaofeibao-xjtu val wakeUpIn = iqWakeUpInMap(wakeUp.bits.exuIdx) 3360c7ebb58Sxiaofeibao-xjtu val exuIdx = wakeUp.bits.exuIdx 3370c7ebb58Sxiaofeibao-xjtu println(s"[Backend] Connect wakeup exuIdx ${exuIdx}") 3380c7ebb58Sxiaofeibao-xjtu connectSamePort(wakeUp,wakeUpIn) 3390c7ebb58Sxiaofeibao-xjtu backendParams.connectWakeup(exuIdx) 3400c7ebb58Sxiaofeibao-xjtu if (backendParams.isCopyPdest(exuIdx)) { 3410c7ebb58Sxiaofeibao-xjtu println(s"[Backend] exuIdx ${exuIdx} use pdestCopy ${backendParams.getCopyPdestIndex(exuIdx)}") 3420c7ebb58Sxiaofeibao-xjtu wakeUp.bits.pdest := wakeUpIn.bits.pdestCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 3434c5a0d77Sxiaofeibao-xjtu if (wakeUpIn.bits.rfWenCopy.nonEmpty) wakeUp.bits.rfWen := wakeUpIn.bits.rfWenCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 3444c5a0d77Sxiaofeibao-xjtu if (wakeUpIn.bits.fpWenCopy.nonEmpty) wakeUp.bits.fpWen := wakeUpIn.bits.fpWenCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 3454c5a0d77Sxiaofeibao-xjtu if (wakeUpIn.bits.vecWenCopy.nonEmpty) wakeUp.bits.vecWen := wakeUpIn.bits.vecWenCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 346c720aa49Ssinsanction if (wakeUpIn.bits.v0WenCopy.nonEmpty) wakeUp.bits.v0Wen := wakeUpIn.bits.v0WenCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 347c720aa49Ssinsanction if (wakeUpIn.bits.vlWenCopy.nonEmpty) wakeUp.bits.vlWen := wakeUpIn.bits.vlWenCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 3484c5a0d77Sxiaofeibao-xjtu if (wakeUpIn.bits.loadDependencyCopy.nonEmpty) wakeUp.bits.loadDependency := wakeUpIn.bits.loadDependencyCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 3490c7ebb58Sxiaofeibao-xjtu } 35060912d84Sxiaofeibao-xjtu if (iq.params.numIntSrc == 0) wakeUp.bits.rfWen := false.B 35160f0c5aeSxiaofeibao if (iq.params.numFpSrc == 0) wakeUp.bits.fpWen := false.B 35260912d84Sxiaofeibao-xjtu if (iq.params.numVfSrc == 0) wakeUp.bits.vecWen := false.B 353c720aa49Ssinsanction if (iq.params.numV0Src == 0) wakeUp.bits.v0Wen := false.B 354c720aa49Ssinsanction if (iq.params.numVlSrc == 0) wakeUp.bits.vlWen := false.B 355bf35baadSXuan Hu } 356ea46c302SXuan Hu iq.io.og0Cancel := io.fromDataPath.og0Cancel 357ea46c302SXuan Hu iq.io.og1Cancel := io.fromDataPath.og1Cancel 3580f55a0d3SHaojin Tang iq.io.ldCancel := io.ldCancel 359bf35baadSXuan Hu } 360bf35baadSXuan Hu 361b6279fc6SZiyue Zhang // connect the vl writeback informatino to the issue queues 362b6279fc6SZiyue Zhang issueQueues.zipWithIndex.foreach { case(iq, i) => 363c720aa49Ssinsanction iq.io.vlIsVlmax := io.vlWriteBackInfo.vlIsVlmax 364c720aa49Ssinsanction iq.io.vlIsZero := io.vlWriteBackInfo.vlIsZero 365b6279fc6SZiyue Zhang } 366b6279fc6SZiyue Zhang 367c0be7f33SXuan Hu private val iqWakeUpOutMap: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] = 368bf35baadSXuan Hu issueQueues.flatMap(_.io.wakeupToIQ) 369c0be7f33SXuan Hu .map(x => (x.bits.exuIdx, x)) 370bf35baadSXuan Hu .toMap 371bf35baadSXuan Hu 372bf35baadSXuan Hu // Connect bundles having the same wakeup source 373bf35baadSXuan Hu io.toSchedulers.wakeupVec.foreach { wakeUp => 374c0be7f33SXuan Hu wakeUp := iqWakeUpOutMap(wakeUp.bits.exuIdx) 375bf35baadSXuan Hu } 376bf35baadSXuan Hu 37759ef6009Sxiaofeibao-xjtu io.toDataPathAfterDelay.zipWithIndex.foreach { case (toDpDy, i) => 37859ef6009Sxiaofeibao-xjtu toDpDy <> issueQueues(i).io.deqDelay 37959ef6009Sxiaofeibao-xjtu } 380bf35baadSXuan Hu 381f99b81adSHaojin Tang // Response 382f99b81adSHaojin Tang issueQueues.zipWithIndex.foreach { case (iq, i) => 383f99b81adSHaojin Tang iq.io.og0Resp.zipWithIndex.foreach { case (og0Resp, j) => 384f99b81adSHaojin Tang og0Resp := io.fromDataPath(i)(j).og0resp 385f99b81adSHaojin Tang } 386f99b81adSHaojin Tang iq.io.og1Resp.zipWithIndex.foreach { case (og1Resp, j) => 387f99b81adSHaojin Tang og1Resp := io.fromDataPath(i)(j).og1resp 388f99b81adSHaojin Tang } 389f99b81adSHaojin Tang iq.io.finalIssueResp.foreach(_.zipWithIndex.foreach { case (finalIssueResp, j) => 390670870b3SXuan Hu if (io.loadFinalIssueResp(i).isDefinedAt(j)) { 391f99b81adSHaojin Tang finalIssueResp := io.loadFinalIssueResp(i)(j) 392670870b3SXuan Hu } else { 393670870b3SXuan Hu finalIssueResp := 0.U.asTypeOf(finalIssueResp) 394670870b3SXuan Hu } 395f99b81adSHaojin Tang }) 396e8800897SXuan Hu iq.io.memAddrIssueResp.foreach(_.zipWithIndex.foreach { case (memAddrIssueResp, j) => 397aa2bcc31SzhanglyGit if (io.memAddrIssueResp(i).isDefinedAt(j)) { 398e8800897SXuan Hu memAddrIssueResp := io.memAddrIssueResp(i)(j) 399aa2bcc31SzhanglyGit } else { 400aa2bcc31SzhanglyGit memAddrIssueResp := 0.U.asTypeOf(memAddrIssueResp) 401aa2bcc31SzhanglyGit } 402e8800897SXuan Hu }) 4037e471bf8SXuan Hu iq.io.vecLoadIssueResp.foreach(_.zipWithIndex.foreach { case (resp, deqIdx) => 4047e471bf8SXuan Hu resp := io.vecLoadIssueResp(i)(deqIdx) 4057e471bf8SXuan Hu }) 406c38df446SzhanglyGit if(params.isVfSchd) { 407c38df446SzhanglyGit iq.io.og2Resp.get.zipWithIndex.foreach { case (og2Resp, exuIdx) => 408c38df446SzhanglyGit og2Resp := io.fromOg2.get(i)(exuIdx) 409c38df446SzhanglyGit } 410c38df446SzhanglyGit } 411f99b81adSHaojin Tang iq.io.wbBusyTableRead := io.fromWbFuBusyTable.fuBusyTableRead(i) 412f99b81adSHaojin Tang io.wbFuBusyTable(i) := iq.io.wbBusyTableWrite 413f99b81adSHaojin Tang } 414f99b81adSHaojin Tang 415*e1a85e9fSchengguanghui // perfEvent 416*e1a85e9fSchengguanghui val lastCycleDp2IqOutFireVec = RegNext(VecInit(dispatch2Iq.io.out.flatten.map(_.fire))) 417*e1a85e9fSchengguanghui val lastCycleIqEnqFireVec = RegNext(VecInit(issueQueues.map(_.io.enq.map(_.fire)).flatten)) 418*e1a85e9fSchengguanghui val lastCycleIqFullVec = RegNext(VecInit(issueQueues.map(_.io.enq.head.ready))) 419*e1a85e9fSchengguanghui 420*e1a85e9fSchengguanghui val issueQueueFullVecPerf = issueQueues.zip(lastCycleIqFullVec)map{ case (iq, full) => (iq.params.getIQName + s"_full", full) } 421*e1a85e9fSchengguanghui val basePerfEvents = Seq( 422*e1a85e9fSchengguanghui ("dispatch2Iq_out_fire_cnt", PopCount(lastCycleDp2IqOutFireVec) ), 423*e1a85e9fSchengguanghui ("issueQueue_enq_fire_cnt", PopCount(lastCycleIqEnqFireVec) ) 424*e1a85e9fSchengguanghui ) ++ issueQueueFullVecPerf 425*e1a85e9fSchengguanghui 426c0be7f33SXuan Hu println(s"[Scheduler] io.fromSchedulers.wakeupVec: ${io.fromSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}") 427bf35baadSXuan Hu println(s"[Scheduler] iqWakeUpInKeys: ${iqWakeUpInMap.keys}") 428bf35baadSXuan Hu 429bf35baadSXuan Hu println(s"[Scheduler] iqWakeUpOutKeys: ${iqWakeUpOutMap.keys}") 430c0be7f33SXuan Hu println(s"[Scheduler] io.toSchedulers.wakeupVec: ${io.toSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}") 431730cfbc0SXuan Hu} 432730cfbc0SXuan Hu 433730cfbc0SXuan Huclass SchedulerArithImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters) 434730cfbc0SXuan Hu extends SchedulerImpBase(wrapper) 435730cfbc0SXuan Hu with HasXSParameter 436*e1a85e9fSchengguanghui with HasPerfEvents 437730cfbc0SXuan Hu{ 4382e0a7dc5Sfdy// dontTouch(io.vfWbFuBusyTable) 439730cfbc0SXuan Hu println(s"[SchedulerArithImp] " + 440730cfbc0SXuan Hu s"has intBusyTable: ${intBusyTable.nonEmpty}, " + 441730cfbc0SXuan Hu s"has vfBusyTable: ${vfBusyTable.nonEmpty}") 442730cfbc0SXuan Hu 443730cfbc0SXuan Hu issueQueues.zipWithIndex.foreach { case (iq, i) => 444730cfbc0SXuan Hu iq.io.flush <> io.fromCtrlBlock.flush 445730cfbc0SXuan Hu iq.io.enq <> dispatch2Iq.io.out(i) 446f39a61a1SzhanglyGit val intWBIQ = params.schdType match { 447f39a61a1SzhanglyGit case IntScheduler() => wakeupFromIntWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1) 44860f0c5aeSxiaofeibao case FpScheduler() => wakeupFromFpWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1) 449c720aa49Ssinsanction case VfScheduler() => (wakeupFromVfWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 450c720aa49Ssinsanction wakeupFromV0WBVec.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 451c720aa49Ssinsanction wakeupFromVlWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1)) 452596af5d2SHaojin Tang case _ => null 453f39a61a1SzhanglyGit } 454f39a61a1SzhanglyGit iq.io.wakeupFromWB.zip(intWBIQ).foreach{ case (sink, source) => sink := source} 455730cfbc0SXuan Hu } 456*e1a85e9fSchengguanghui 457*e1a85e9fSchengguanghui val perfEvents = basePerfEvents 458*e1a85e9fSchengguanghui generatePerfEvent() 459730cfbc0SXuan Hu} 460730cfbc0SXuan Hu 461f99b81adSHaojin Tang// FIXME: Vector mem instructions may not be handled properly! 462730cfbc0SXuan Huclass SchedulerMemImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters) 463730cfbc0SXuan Hu extends SchedulerImpBase(wrapper) 464730cfbc0SXuan Hu with HasXSParameter 465*e1a85e9fSchengguanghui with HasPerfEvents 466730cfbc0SXuan Hu{ 467730cfbc0SXuan Hu println(s"[SchedulerMemImp] " + 468730cfbc0SXuan Hu s"has intBusyTable: ${intBusyTable.nonEmpty}, " + 469730cfbc0SXuan Hu s"has vfBusyTable: ${vfBusyTable.nonEmpty}") 470730cfbc0SXuan Hu 471559c1710SHaojin Tang val memAddrIQs = issueQueues.filter(_.params.isMemAddrIQ) 472e07131b2Ssinsanction val stAddrIQs = issueQueues.filter(iq => iq.params.StaCnt > 0) // included in memAddrIQs 473e07131b2Ssinsanction val ldAddrIQs = issueQueues.filter(iq => iq.params.LduCnt > 0) 474e07131b2Ssinsanction val stDataIQs = issueQueues.filter(iq => iq.params.StdCnt > 0) 475559c1710SHaojin Tang val vecMemIQs = issueQueues.filter(_.params.isVecMemIQ) 476559c1710SHaojin Tang val (hyuIQs, hyuIQIdxs) = issueQueues.zipWithIndex.filter(_._1.params.HyuCnt > 0).unzip 477499caf4cSXuan Hu 478499caf4cSXuan Hu println(s"[SchedulerMemImp] memAddrIQs.size: ${memAddrIQs.size}, enq.size: ${memAddrIQs.map(_.io.enq.size).sum}") 479499caf4cSXuan Hu println(s"[SchedulerMemImp] stAddrIQs.size: ${stAddrIQs.size }, enq.size: ${stAddrIQs.map(_.io.enq.size).sum}") 480499caf4cSXuan Hu println(s"[SchedulerMemImp] ldAddrIQs.size: ${ldAddrIQs.size }, enq.size: ${ldAddrIQs.map(_.io.enq.size).sum}") 481499caf4cSXuan Hu println(s"[SchedulerMemImp] stDataIQs.size: ${stDataIQs.size }, enq.size: ${stDataIQs.map(_.io.enq.size).sum}") 482499caf4cSXuan Hu println(s"[SchedulerMemImp] hyuIQs.size: ${hyuIQs.size }, enq.size: ${hyuIQs.map(_.io.enq.size).sum}") 483730cfbc0SXuan Hu require(memAddrIQs.nonEmpty && stDataIQs.nonEmpty) 484730cfbc0SXuan Hu 485853cd2d8SHaojin Tang io.toMem.get.loadFastMatch := 0.U.asTypeOf(io.toMem.get.loadFastMatch) // TODO: is still needed? 486853cd2d8SHaojin Tang 487fc45ed13SXuan Hu private val loadWakeUp = issueQueues.filter(_.params.LdExuCnt > 0).map(_.asInstanceOf[IssueQueueMemAddrImp].io.memIO.get.loadWakeUp).flatten 488596af5d2SHaojin Tang require(loadWakeUp.length == io.fromMem.get.wakeup.length) 489596af5d2SHaojin Tang loadWakeUp.zip(io.fromMem.get.wakeup).foreach(x => x._1 := x._2) 490596af5d2SHaojin Tang 491730cfbc0SXuan Hu memAddrIQs.zipWithIndex.foreach { case (iq, i) => 492730cfbc0SXuan Hu iq.io.flush <> io.fromCtrlBlock.flush 493730cfbc0SXuan Hu iq.io.enq <> dispatch2Iq.io.out(i) 49460f0c5aeSxiaofeibao iq.io.wakeupFromWB.zip( 49560f0c5aeSxiaofeibao wakeupFromIntWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 49660f0c5aeSxiaofeibao wakeupFromFpWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 497c720aa49Ssinsanction 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) 50060f0c5aeSxiaofeibao ).foreach{ case (sink, source) => sink := source} 501730cfbc0SXuan Hu } 502730cfbc0SXuan Hu 503ecfc6f16SXuan Hu ldAddrIQs.zipWithIndex.foreach { 504ecfc6f16SXuan Hu case (imp: IssueQueueMemAddrImp, i) => 505ecfc6f16SXuan Hu imp.io.memIO.get.feedbackIO.head := 0.U.asTypeOf(imp.io.memIO.get.feedbackIO.head) 506c14e89f4SHaojin Tang imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr 507de784418SXuan Hu imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 5087b753bebSXuan Hu case _ => 5097b753bebSXuan Hu } 5107b753bebSXuan Hu 511ecfc6f16SXuan Hu stAddrIQs.zipWithIndex.foreach { 512ecfc6f16SXuan Hu case (imp: IssueQueueMemAddrImp, i) => 513ecfc6f16SXuan Hu imp.io.memIO.get.feedbackIO.head := io.fromMem.get.staFeedback(i) 514c14e89f4SHaojin Tang imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr 515c14e89f4SHaojin Tang imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 5167b753bebSXuan Hu case _ => 5177b753bebSXuan Hu } 518730cfbc0SXuan Hu 519559c1710SHaojin Tang hyuIQs.zip(hyuIQIdxs).foreach { 520559c1710SHaojin Tang case (imp: IssueQueueMemAddrImp, idx) => 521670870b3SXuan Hu imp.io.memIO.get.feedbackIO.head := io.fromMem.get.hyuFeedback.head 522670870b3SXuan Hu imp.io.memIO.get.feedbackIO(1) := 0.U.asTypeOf(imp.io.memIO.get.feedbackIO(1)) 5238f1fa9b1Ssfencevma imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr 5248f1fa9b1Ssfencevma imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 525559c1710SHaojin Tang // TODO: refactor ditry code 526559c1710SHaojin Tang imp.io.deqDelay(1).ready := false.B 527559c1710SHaojin Tang io.toDataPathAfterDelay(idx)(1).valid := false.B 528559c1710SHaojin Tang io.toDataPathAfterDelay(idx)(1).bits := 0.U.asTypeOf(io.toDataPathAfterDelay(idx)(1).bits) 5298f1fa9b1Ssfencevma case _ => 5308f1fa9b1Ssfencevma } 5318f1fa9b1Ssfencevma 532e62b6911SXuan Hu private val staIdxSeq = (stAddrIQs).map(iq => iq.params.idxInSchBlk) 533e62b6911SXuan Hu private val hyaIdxSeq = (hyuIQs).map(iq => iq.params.idxInSchBlk) 534e62b6911SXuan Hu 535e62b6911SXuan Hu println(s"[SchedulerMemImp] sta iq idx in memSchdBlock: $staIdxSeq") 536e62b6911SXuan Hu println(s"[SchedulerMemImp] hya iq idx in memSchdBlock: $hyaIdxSeq") 537e62b6911SXuan Hu 538e62b6911SXuan Hu private val staEnqs = stAddrIQs.map(_.io.enq).flatten 539e62b6911SXuan Hu private val stdEnqs = stDataIQs.map(_.io.enq).flatten.take(staEnqs.size) 540e62b6911SXuan Hu private val hyaEnqs = hyuIQs.map(_.io.enq).flatten 541e62b6911SXuan Hu private val hydEnqs = stDataIQs.map(_.io.enq).flatten.drop(staEnqs.size) 542e62b6911SXuan Hu 543e62b6911SXuan Hu require(staEnqs.size == stdEnqs.size, s"number of enq ports of store address IQs(${staEnqs.size}) " + 544e62b6911SXuan Hu s"should be equal to number of enq ports of store data IQs(${stdEnqs.size})") 545e62b6911SXuan Hu 546e62b6911SXuan Hu require(hyaEnqs.size == hydEnqs.size, s"number of enq ports of hybrid address IQs(${hyaEnqs.size}) " + 547e62b6911SXuan Hu s"should be equal to number of enq ports of hybrid data IQs(${hydEnqs.size})") 5489b258a00Sxgkiri 5490438e8f4SHaojin Tang val d2IqStaOut = dispatch2Iq.io.out.zipWithIndex.filter(staIdxSeq contains _._2).unzip._1.flatten 5500438e8f4SHaojin Tang d2IqStaOut.zip(staEnqs).zip(stdEnqs).foreach{ case((dp, staIQ), stdIQ) => 551730cfbc0SXuan Hu val isAllReady = staIQ.ready && stdIQ.ready 552e62b6911SXuan Hu dp.ready := isAllReady 553e62b6911SXuan Hu staIQ.valid := dp.valid && isAllReady 5540438e8f4SHaojin Tang stdIQ.valid := dp.valid && isAllReady && FuType.FuTypeOrR(dp.bits.fuType, FuType.stu, FuType.mou) 5559b258a00Sxgkiri } 556730cfbc0SXuan Hu 5570438e8f4SHaojin Tang val d2IqHyaOut = dispatch2Iq.io.out.zipWithIndex.filter(hyaIdxSeq contains _._2).unzip._1.flatten 5580438e8f4SHaojin Tang d2IqHyaOut.zip(hyaEnqs).zip(hydEnqs).foreach{ case((dp, hyaIQ), hydIQ) => 559e62b6911SXuan Hu val isAllReady = hyaIQ.ready && hydIQ.ready 560e62b6911SXuan Hu dp.ready := isAllReady 561e62b6911SXuan Hu hyaIQ.valid := dp.valid && isAllReady 56256bceacbSHaojin Tang hydIQ.valid := dp.valid && isAllReady && FuType.FuTypeOrR(dp.bits.fuType, FuType.stu, FuType.mou) 563e62b6911SXuan Hu } 564730cfbc0SXuan Hu 565e62b6911SXuan Hu stDataIQs.zipWithIndex.foreach { case (iq, i) => 566e62b6911SXuan Hu iq.io.flush <> io.fromCtrlBlock.flush 56760f0c5aeSxiaofeibao iq.io.wakeupFromWB.zip( 56860f0c5aeSxiaofeibao wakeupFromIntWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 56960f0c5aeSxiaofeibao wakeupFromFpWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 570c720aa49Ssinsanction wakeupFromVfWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 571c720aa49Ssinsanction wakeupFromV0WBVec.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 572c720aa49Ssinsanction wakeupFromVlWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq 57360f0c5aeSxiaofeibao ).foreach{ case (sink, source) => sink := source} 574e62b6911SXuan Hu } 575e62b6911SXuan Hu 576e62b6911SXuan Hu (stdEnqs ++ hydEnqs).zip(staEnqs ++ hyaEnqs).zipWithIndex.foreach { case ((stdIQEnq, staIQEnq), i) => 577730cfbc0SXuan Hu stdIQEnq.bits := staIQEnq.bits 578730cfbc0SXuan Hu // Store data reuses store addr src(1) in dispatch2iq 579e62b6911SXuan Hu // [dispatch2iq] --src*------src*(0)--> [staIQ|hyaIQ] 580730cfbc0SXuan Hu // \ 581730cfbc0SXuan Hu // ---src*(1)--> [stdIQ] 582730cfbc0SXuan Hu // Since the src(1) of sta is easier to get, stdIQEnq.bits.src*(0) is assigned to staIQEnq.bits.src*(1) 583730cfbc0SXuan Hu // instead of dispatch2Iq.io.out(x).bits.src*(1) 58497b279b9SXuan Hu val stdIdx = 1 5852d270511Ssinsanction stdIQEnq.bits.srcState(0) := staIQEnq.bits.srcState(stdIdx) 58613551487SzhanglyGit stdIQEnq.bits.srcLoadDependency(0) := staIQEnq.bits.srcLoadDependency(1) 5872d270511Ssinsanction stdIQEnq.bits.srcType(0) := staIQEnq.bits.srcType(stdIdx) 5882d270511Ssinsanction stdIQEnq.bits.psrc(0) := staIQEnq.bits.psrc(stdIdx) 589730cfbc0SXuan Hu stdIQEnq.bits.sqIdx := staIQEnq.bits.sqIdx 590730cfbc0SXuan Hu } 591730cfbc0SXuan Hu 5922d270511Ssinsanction vecMemIQs.foreach { 5932d270511Ssinsanction case imp: IssueQueueVecMemImp => 5942d270511Ssinsanction imp.io.memIO.get.sqDeqPtr.foreach(_ := io.fromMem.get.sqDeqPtr) 5952d270511Ssinsanction imp.io.memIO.get.lqDeqPtr.foreach(_ := io.fromMem.get.lqDeqPtr) 5961f3d1b4dSXuan Hu // not used 597b7c799beSzhanglyGit //imp.io.memIO.get.feedbackIO.head := io.fromMem.get.vstuFeedback.head // only vector store replay 5981f3d1b4dSXuan Hu // maybe not used 5991f3d1b4dSXuan Hu imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr 6001f3d1b4dSXuan Hu imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 60160f0c5aeSxiaofeibao imp.io.wakeupFromWB.zip( 60260f0c5aeSxiaofeibao wakeupFromIntWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 60360f0c5aeSxiaofeibao wakeupFromFpWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 604c720aa49Ssinsanction wakeupFromVfWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 605c720aa49Ssinsanction wakeupFromV0WBVec.zipWithIndex.filter(x => imp.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 606c720aa49Ssinsanction wakeupFromVlWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq 60760f0c5aeSxiaofeibao ).foreach{ case (sink, source) => sink := source} 608f39a61a1SzhanglyGit 6092d270511Ssinsanction case _ => 6102d270511Ssinsanction } 611b7c799beSzhanglyGit val vecMemFeedbackIO: Seq[MemRSFeedbackIO] = vecMemIQs.map { 612b7c799beSzhanglyGit case imp: IssueQueueVecMemImp => 613b7c799beSzhanglyGit imp.io.memIO.get.feedbackIO 614b7c799beSzhanglyGit }.flatten 615b7c799beSzhanglyGit assert(vecMemFeedbackIO.size == io.fromMem.get.vstuFeedback.size, "vecMemFeedback size dont match!") 616b7c799beSzhanglyGit vecMemFeedbackIO.zip(io.fromMem.get.vstuFeedback).foreach{ 617b7c799beSzhanglyGit case (sink, source) => 618b7c799beSzhanglyGit sink := source 619b7c799beSzhanglyGit } 6202d270511Ssinsanction 621730cfbc0SXuan Hu val lsqEnqCtrl = Module(new LsqEnqCtrl) 622730cfbc0SXuan Hu 623730cfbc0SXuan Hu lsqEnqCtrl.io.redirect <> io.fromCtrlBlock.flush 624730cfbc0SXuan Hu lsqEnqCtrl.io.enq <> dispatch2Iq.io.enqLsqIO.get 625730cfbc0SXuan Hu lsqEnqCtrl.io.lcommit := io.fromMem.get.lcommit 626730cfbc0SXuan Hu lsqEnqCtrl.io.scommit := io.fromMem.get.scommit 627730cfbc0SXuan Hu lsqEnqCtrl.io.lqCancelCnt := io.fromMem.get.lqCancelCnt 628730cfbc0SXuan Hu lsqEnqCtrl.io.sqCancelCnt := io.fromMem.get.sqCancelCnt 629f3a9fb05SAnzo dispatch2Iq.io.lqFreeCount.get := lsqEnqCtrl.io.lqFreeCount 630f3a9fb05SAnzo dispatch2Iq.io.sqFreeCount.get := lsqEnqCtrl.io.sqFreeCount 631730cfbc0SXuan Hu io.memIO.get.lsqEnqIO <> lsqEnqCtrl.io.enqLsq 6327e471bf8SXuan Hu 6337e471bf8SXuan Hu dontTouch(io.vecLoadIssueResp) 634*e1a85e9fSchengguanghui 635*e1a85e9fSchengguanghui val intBusyTablePerf = intBusyTable.get 636*e1a85e9fSchengguanghui val fpBusyTablePerf = fpBusyTable.get 637*e1a85e9fSchengguanghui val vecBusyTablePerf = vfBusyTable.get 638*e1a85e9fSchengguanghui val v0BusyTablePerf = v0BusyTable.get 639*e1a85e9fSchengguanghui val vlBusyTablePerf = vlBusyTable.get 640*e1a85e9fSchengguanghui 641*e1a85e9fSchengguanghui val perfEvents = basePerfEvents ++ Seq(intBusyTablePerf, fpBusyTablePerf, vecBusyTablePerf, v0BusyTablePerf, vlBusyTablePerf).flatten(_.getPerfEvents) 642*e1a85e9fSchengguanghui generatePerfEvent() 643730cfbc0SXuan Hu} 644