1730cfbc0SXuan Hupackage xiangshan.backend.issue 2730cfbc0SXuan Hu 383ba63b3SXuan Huimport org.chipsalliance.cde.config.Parameters 4730cfbc0SXuan Huimport chisel3._ 5730cfbc0SXuan Huimport chisel3.util._ 6730cfbc0SXuan Huimport freechips.rocketchip.diplomacy.{LazyModule, LazyModuleImp} 7e1a85e9fSchengguanghuiimport utils.{HasPerfEvents, OptionWrapper} 8730cfbc0SXuan Huimport xiangshan._ 910fe9778SXuan Huimport xiangshan.backend.Bundles._ 10c720aa49Ssinsanctionimport xiangshan.backend.datapath.DataConfig._ 11c720aa49Ssinsanctionimport xiangshan.backend.datapath.WbConfig._ 12e62b6911SXuan Huimport xiangshan.backend.fu.FuType 13730cfbc0SXuan Huimport xiangshan.backend.regfile.RfWritePortWithConfig 14730cfbc0SXuan Huimport xiangshan.backend.rename.BusyTable 152d270511Ssinsanctionimport xiangshan.mem.{LsqEnqCtrl, LsqEnqIO, MemWaitUpdateReq, SqPtr, LqPtr} 16c720aa49Ssinsanctionimport xiangshan.backend.datapath.WbConfig.V0WB 17c720aa49Ssinsanctionimport xiangshan.backend.regfile.VlPregParams 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))) 96*be9ff987Ssinsanction val og0Cancel = Input(ExuVec()) 97ea46c302SXuan Hu // Todo: remove this after no cancel signal from og1 98*be9ff987Ssinsanction val og1Cancel = Input(ExuVec()) 99c0be7f33SXuan Hu // just be compatible to old code 100c0be7f33SXuan Hu def apply(i: Int)(j: Int) = resp(i)(j) 101c0be7f33SXuan Hu } 102c0be7f33SXuan Hu 1038a66c02cSXuan Hu val loadFinalIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.LdExuCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x))))))) 1048a66c02cSXuan Hu val memAddrIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.LdExuCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x))))))) 1057e471bf8SXuan Hu val vecLoadIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.VlduCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x))))))) 1060f55a0d3SHaojin Tang 1076810d1e8Ssfencevma val ldCancel = Vec(backendParams.LduCnt + backendParams.HyuCnt, Flipped(new LoadCancelIO)) 108c0be7f33SXuan Hu 109730cfbc0SXuan Hu val memIO = if (params.isMemSchd) Some(new Bundle { 110730cfbc0SXuan Hu val lsqEnqIO = Flipped(new LsqEnqIO) 111730cfbc0SXuan Hu }) else None 112730cfbc0SXuan Hu val fromMem = if (params.isMemSchd) Some(new Bundle { 1137b753bebSXuan Hu val ldaFeedback = Flipped(Vec(params.LduCnt, new MemRSFeedbackIO)) 1147b753bebSXuan Hu val staFeedback = Flipped(Vec(params.StaCnt, new MemRSFeedbackIO)) 1158f1fa9b1Ssfencevma val hyuFeedback = Flipped(Vec(params.HyuCnt, new MemRSFeedbackIO)) 116fd490615Sweiding liu val vstuFeedback = Flipped(Vec(params.VstuCnt, new MemRSFeedbackIO(isVector = true))) 117fd490615Sweiding liu val vlduFeedback = Flipped(Vec(params.VlduCnt, new MemRSFeedbackIO(isVector = true))) 118730cfbc0SXuan Hu val stIssuePtr = Input(new SqPtr()) 119730cfbc0SXuan Hu val lcommit = Input(UInt(log2Up(CommitWidth + 1).W)) 120730cfbc0SXuan Hu val scommit = Input(UInt(log2Ceil(EnsbufferWidth + 1).W)) // connected to `memBlock.io.sqDeq` instead of ROB 121fc45ed13SXuan Hu val wakeup = Vec(params.LdExuCnt, Flipped(Valid(new DynInst))) 1222d270511Ssinsanction val lqDeqPtr = Input(new LqPtr) 1232d270511Ssinsanction val sqDeqPtr = Input(new SqPtr) 124730cfbc0SXuan Hu // from lsq 125730cfbc0SXuan Hu val lqCancelCnt = Input(UInt(log2Up(LoadQueueSize + 1).W)) 126730cfbc0SXuan Hu val sqCancelCnt = Input(UInt(log2Up(StoreQueueSize + 1).W)) 127730cfbc0SXuan Hu val memWaitUpdateReq = Flipped(new MemWaitUpdateReq) 128730cfbc0SXuan Hu }) else None 129730cfbc0SXuan Hu val toMem = if (params.isMemSchd) Some(new Bundle { 130730cfbc0SXuan Hu val loadFastMatch = Output(Vec(params.LduCnt, new IssueQueueLoadBundle)) 131730cfbc0SXuan Hu }) else None 132c38df446SzhanglyGit val fromOg2 = if(params.isVfSchd) Some(MixedVec(params.issueBlockParams.map(x => Flipped(x.genOG2RespBundle)))) else None 133730cfbc0SXuan Hu} 134730cfbc0SXuan Hu 135730cfbc0SXuan Huabstract class SchedulerImpBase(wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters) 136730cfbc0SXuan Hu extends LazyModuleImp(wrapper) 137730cfbc0SXuan Hu with HasXSParameter 138730cfbc0SXuan Hu{ 139730cfbc0SXuan Hu val io = IO(new SchedulerIO()) 140730cfbc0SXuan Hu 141730cfbc0SXuan Hu // alias 142c0be7f33SXuan Hu private val iqWakeUpInMap: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] = 143c0be7f33SXuan Hu io.fromSchedulers.wakeupVec.map(x => (x.bits.exuIdx, x)).toMap 144730cfbc0SXuan Hu private val schdType = params.schdType 145730cfbc0SXuan Hu 146730cfbc0SXuan Hu // Modules 147730cfbc0SXuan Hu val dispatch2Iq: Dispatch2IqImp = wrapper.dispatch2Iq.module 148730cfbc0SXuan Hu val issueQueues: Seq[IssueQueueImp] = wrapper.issueQueue.map(_.module) 14982674533Sxiaofeibao io.intIQValidNumVec := 0.U.asTypeOf(io.intIQValidNumVec) 15082674533Sxiaofeibao io.fpIQValidNumVec := 0.U.asTypeOf(io.fpIQValidNumVec) 151ff3fcdf1Sxiaofeibao-xjtu if (params.isIntSchd) { 15282674533Sxiaofeibao dispatch2Iq.io.intIQValidNumVec.get := io.intIQValidNumVec 15382674533Sxiaofeibao io.intIQValidNumVec := MixedVecInit(issueQueues.map(_.io.validCntDeqVec)) 154ff3fcdf1Sxiaofeibao-xjtu } 15582674533Sxiaofeibao else if (params.isFpSchd) { 15682674533Sxiaofeibao dispatch2Iq.io.fpIQValidNumVec.get := io.fpIQValidNumVec 15782674533Sxiaofeibao io.fpIQValidNumVec := MixedVecInit(issueQueues.map(_.io.validCntDeqVec)) 15882674533Sxiaofeibao } 159730cfbc0SXuan Hu 16056bcaed7SHaojin Tang // valid count 16156bcaed7SHaojin Tang dispatch2Iq.io.iqValidCnt := issueQueues.filter(_.params.StdCnt == 0).map(_.io.status.validCnt) 16256bcaed7SHaojin Tang 163730cfbc0SXuan Hu // BusyTable Modules 164730cfbc0SXuan Hu val intBusyTable = schdType match { 165bc7d6943SzhanglyGit case IntScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numIntStateRead, wrapper.numIntStateWrite, IntPhyRegs, IntWB()))) 166730cfbc0SXuan Hu case _ => None 167730cfbc0SXuan Hu } 16860f0c5aeSxiaofeibao val fpBusyTable = schdType match { 16960f0c5aeSxiaofeibao case FpScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numFpStateRead, wrapper.numFpStateWrite, FpPhyRegs, FpWB()))) 17060f0c5aeSxiaofeibao case _ => None 17160f0c5aeSxiaofeibao } 172730cfbc0SXuan Hu val vfBusyTable = schdType match { 173bc7d6943SzhanglyGit case VfScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numVfStateRead, wrapper.numVfStateWrite, VfPhyRegs, VfWB()))) 174730cfbc0SXuan Hu case _ => None 175730cfbc0SXuan Hu } 176c720aa49Ssinsanction val v0BusyTable = schdType match { 177c720aa49Ssinsanction case VfScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numV0StateRead, wrapper.numV0StateWrite, V0PhyRegs, V0WB()))) 178c720aa49Ssinsanction case _ => None 179c720aa49Ssinsanction } 180c720aa49Ssinsanction val vlBusyTable = schdType match { 181c720aa49Ssinsanction case VfScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numVlStateRead, wrapper.numVlStateWrite, VlPhyRegs, VlWB()))) 182c720aa49Ssinsanction case _ => None 183c720aa49Ssinsanction } 184730cfbc0SXuan Hu 185730cfbc0SXuan Hu dispatch2Iq.io match { case dp2iq => 186730cfbc0SXuan Hu dp2iq.redirect <> io.fromCtrlBlock.flush 187730cfbc0SXuan Hu dp2iq.in <> io.fromDispatch.uops 188730cfbc0SXuan Hu dp2iq.readIntState.foreach(_ <> intBusyTable.get.io.read) 18960f0c5aeSxiaofeibao dp2iq.readFpState.foreach(_ <> fpBusyTable.get.io.read) 190730cfbc0SXuan Hu dp2iq.readVfState.foreach(_ <> vfBusyTable.get.io.read) 191c720aa49Ssinsanction dp2iq.readV0State.foreach(_ <> v0BusyTable.get.io.read) 192c720aa49Ssinsanction dp2iq.readVlState.foreach(_ <> vlBusyTable.get.io.read) 193730cfbc0SXuan Hu } 194730cfbc0SXuan Hu 195730cfbc0SXuan Hu intBusyTable match { 196730cfbc0SXuan Hu case Some(bt) => 197730cfbc0SXuan Hu bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) => 198730cfbc0SXuan Hu btAllocPregs.valid := dpAllocPregs.isInt 199730cfbc0SXuan Hu btAllocPregs.bits := dpAllocPregs.preg 200730cfbc0SXuan Hu } 201730cfbc0SXuan Hu bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) => 202730cfbc0SXuan Hu wb.valid := io.intWriteBack(i).wen && io.intWriteBack(i).intWen 203730cfbc0SXuan Hu wb.bits := io.intWriteBack(i).addr 204730cfbc0SXuan Hu } 205bc7d6943SzhanglyGit bt.io.wakeUp := io.fromSchedulers.wakeupVec 20637080bd8Ssinsanction bt.io.og0Cancel := io.fromDataPath.og0Cancel 20713551487SzhanglyGit bt.io.ldCancel := io.ldCancel 208730cfbc0SXuan Hu case None => 209730cfbc0SXuan Hu } 210730cfbc0SXuan Hu 21160f0c5aeSxiaofeibao fpBusyTable match { 212730cfbc0SXuan Hu case Some(bt) => 213730cfbc0SXuan Hu bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) => 214730cfbc0SXuan Hu btAllocPregs.valid := dpAllocPregs.isFp 215730cfbc0SXuan Hu btAllocPregs.bits := dpAllocPregs.preg 216730cfbc0SXuan Hu } 217730cfbc0SXuan Hu bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) => 21860f0c5aeSxiaofeibao wb.valid := io.fpWriteBack(i).wen && io.fpWriteBack(i).fpWen 21960f0c5aeSxiaofeibao wb.bits := io.fpWriteBack(i).addr 22060f0c5aeSxiaofeibao } 22160f0c5aeSxiaofeibao bt.io.wakeUp := io.fromSchedulers.wakeupVec 22237080bd8Ssinsanction bt.io.og0Cancel := io.fromDataPath.og0Cancel 22360f0c5aeSxiaofeibao bt.io.ldCancel := io.ldCancel 22460f0c5aeSxiaofeibao case None => 22560f0c5aeSxiaofeibao } 22660f0c5aeSxiaofeibao 22760f0c5aeSxiaofeibao vfBusyTable match { 22860f0c5aeSxiaofeibao case Some(bt) => 22960f0c5aeSxiaofeibao bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) => 23060f0c5aeSxiaofeibao btAllocPregs.valid := dpAllocPregs.isVec 23160f0c5aeSxiaofeibao btAllocPregs.bits := dpAllocPregs.preg 23260f0c5aeSxiaofeibao } 23360f0c5aeSxiaofeibao bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) => 23460f0c5aeSxiaofeibao wb.valid := io.vfWriteBack(i).wen && io.vfWriteBack(i).vecWen 235730cfbc0SXuan Hu wb.bits := io.vfWriteBack(i).addr 236730cfbc0SXuan Hu } 237bc7d6943SzhanglyGit bt.io.wakeUp := io.fromSchedulers.wakeupVec 23837080bd8Ssinsanction bt.io.og0Cancel := io.fromDataPath.og0Cancel 23913551487SzhanglyGit bt.io.ldCancel := io.ldCancel 240730cfbc0SXuan Hu case None => 241730cfbc0SXuan Hu } 242730cfbc0SXuan Hu 243c720aa49Ssinsanction v0BusyTable match { 244c720aa49Ssinsanction case Some(bt) => 245c720aa49Ssinsanction bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) => 24629aa55c1Sxiaofeibao btAllocPregs.valid := dpAllocPregs.isV0 247c720aa49Ssinsanction btAllocPregs.bits := dpAllocPregs.preg 248c720aa49Ssinsanction } 249c720aa49Ssinsanction bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) => 250c720aa49Ssinsanction wb.valid := io.v0WriteBack(i).wen && io.v0WriteBack(i).v0Wen 251c720aa49Ssinsanction wb.bits := io.v0WriteBack(i).addr 252c720aa49Ssinsanction } 253c720aa49Ssinsanction bt.io.wakeUp := io.fromSchedulers.wakeupVec 25437080bd8Ssinsanction bt.io.og0Cancel := io.fromDataPath.og0Cancel 255c720aa49Ssinsanction bt.io.ldCancel := io.ldCancel 256c720aa49Ssinsanction case None => 257c720aa49Ssinsanction } 258c720aa49Ssinsanction 259c720aa49Ssinsanction vlBusyTable match { 260c720aa49Ssinsanction case Some(bt) => 261c720aa49Ssinsanction bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) => 26229aa55c1Sxiaofeibao btAllocPregs.valid := dpAllocPregs.isVl 263c720aa49Ssinsanction btAllocPregs.bits := dpAllocPregs.preg 264c720aa49Ssinsanction } 265c720aa49Ssinsanction bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) => 266c720aa49Ssinsanction wb.valid := io.vlWriteBack(i).wen && io.vlWriteBack(i).vlWen 267c720aa49Ssinsanction wb.bits := io.vlWriteBack(i).addr 268c720aa49Ssinsanction } 269c720aa49Ssinsanction bt.io.wakeUp := io.fromSchedulers.wakeupVec 27037080bd8Ssinsanction bt.io.og0Cancel := io.fromDataPath.og0Cancel 271c720aa49Ssinsanction bt.io.ldCancel := io.ldCancel 272c720aa49Ssinsanction case None => 273c720aa49Ssinsanction } 274c720aa49Ssinsanction 275f39a61a1SzhanglyGit val wakeupFromIntWBVec = Wire(params.genIntWBWakeUpSinkValidBundle) 27660f0c5aeSxiaofeibao val wakeupFromFpWBVec = Wire(params.genFpWBWakeUpSinkValidBundle) 277f39a61a1SzhanglyGit val wakeupFromVfWBVec = Wire(params.genVfWBWakeUpSinkValidBundle) 278c720aa49Ssinsanction val wakeupFromV0WBVec = Wire(params.genV0WBWakeUpSinkValidBundle) 279c720aa49Ssinsanction val wakeupFromVlWBVec = Wire(params.genVlWBWakeUpSinkValidBundle) 280f39a61a1SzhanglyGit 281f39a61a1SzhanglyGit wakeupFromIntWBVec.zip(io.intWriteBack).foreach { case (sink, source) => 282f39a61a1SzhanglyGit sink.valid := source.wen 283f39a61a1SzhanglyGit sink.bits.rfWen := source.intWen 284f39a61a1SzhanglyGit sink.bits.fpWen := source.fpWen 285f39a61a1SzhanglyGit sink.bits.vecWen := source.vecWen 286c720aa49Ssinsanction sink.bits.v0Wen := source.v0Wen 287c720aa49Ssinsanction sink.bits.vlWen := source.vlWen 288f39a61a1SzhanglyGit sink.bits.pdest := source.addr 289730cfbc0SXuan Hu } 290f39a61a1SzhanglyGit 29160f0c5aeSxiaofeibao wakeupFromFpWBVec.zip(io.fpWriteBack).foreach { case (sink, source) => 29260f0c5aeSxiaofeibao sink.valid := source.wen 29360f0c5aeSxiaofeibao sink.bits.rfWen := source.intWen 29460f0c5aeSxiaofeibao sink.bits.fpWen := source.fpWen 29560f0c5aeSxiaofeibao sink.bits.vecWen := source.vecWen 296c720aa49Ssinsanction sink.bits.v0Wen := source.v0Wen 297c720aa49Ssinsanction sink.bits.vlWen := source.vlWen 29860f0c5aeSxiaofeibao sink.bits.pdest := source.addr 29960f0c5aeSxiaofeibao } 30060f0c5aeSxiaofeibao 301f39a61a1SzhanglyGit wakeupFromVfWBVec.zip(io.vfWriteBack).foreach { case (sink, source) => 302730cfbc0SXuan Hu sink.valid := source.wen 303730cfbc0SXuan Hu sink.bits.rfWen := source.intWen 304730cfbc0SXuan Hu sink.bits.fpWen := source.fpWen 305730cfbc0SXuan Hu sink.bits.vecWen := source.vecWen 306c720aa49Ssinsanction sink.bits.v0Wen := source.v0Wen 307c720aa49Ssinsanction sink.bits.vlWen := source.vlWen 308c720aa49Ssinsanction sink.bits.pdest := source.addr 309c720aa49Ssinsanction } 310c720aa49Ssinsanction 311c720aa49Ssinsanction wakeupFromV0WBVec.zip(io.v0WriteBack).foreach { case (sink, source) => 312c720aa49Ssinsanction sink.valid := source.wen 313c720aa49Ssinsanction sink.bits.rfWen := source.intWen 314c720aa49Ssinsanction sink.bits.fpWen := source.fpWen 315c720aa49Ssinsanction sink.bits.vecWen := source.vecWen 316c720aa49Ssinsanction sink.bits.v0Wen := source.v0Wen 317c720aa49Ssinsanction sink.bits.vlWen := source.vlWen 318c720aa49Ssinsanction sink.bits.pdest := source.addr 319c720aa49Ssinsanction } 320c720aa49Ssinsanction 321c720aa49Ssinsanction wakeupFromVlWBVec.zip(io.vlWriteBack).foreach { case (sink, source) => 322c720aa49Ssinsanction sink.valid := source.wen 323c720aa49Ssinsanction sink.bits.rfWen := source.intWen 324c720aa49Ssinsanction sink.bits.fpWen := source.fpWen 325c720aa49Ssinsanction sink.bits.vecWen := source.vecWen 326c720aa49Ssinsanction sink.bits.v0Wen := source.v0Wen 327c720aa49Ssinsanction sink.bits.vlWen := source.vlWen 328730cfbc0SXuan Hu sink.bits.pdest := source.addr 329730cfbc0SXuan Hu } 330730cfbc0SXuan Hu 331bf35baadSXuan Hu // Connect bundles having the same wakeup source 33259ef6009Sxiaofeibao-xjtu issueQueues.zipWithIndex.foreach { case(iq, i) => 333bf35baadSXuan Hu iq.io.wakeupFromIQ.foreach { wakeUp => 3340c7ebb58Sxiaofeibao-xjtu val wakeUpIn = iqWakeUpInMap(wakeUp.bits.exuIdx) 3350c7ebb58Sxiaofeibao-xjtu val exuIdx = wakeUp.bits.exuIdx 3360c7ebb58Sxiaofeibao-xjtu println(s"[Backend] Connect wakeup exuIdx ${exuIdx}") 3370c7ebb58Sxiaofeibao-xjtu connectSamePort(wakeUp,wakeUpIn) 3380c7ebb58Sxiaofeibao-xjtu backendParams.connectWakeup(exuIdx) 3390c7ebb58Sxiaofeibao-xjtu if (backendParams.isCopyPdest(exuIdx)) { 3400c7ebb58Sxiaofeibao-xjtu println(s"[Backend] exuIdx ${exuIdx} use pdestCopy ${backendParams.getCopyPdestIndex(exuIdx)}") 3410c7ebb58Sxiaofeibao-xjtu wakeUp.bits.pdest := wakeUpIn.bits.pdestCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 3424c5a0d77Sxiaofeibao-xjtu if (wakeUpIn.bits.rfWenCopy.nonEmpty) wakeUp.bits.rfWen := wakeUpIn.bits.rfWenCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 3434c5a0d77Sxiaofeibao-xjtu if (wakeUpIn.bits.fpWenCopy.nonEmpty) wakeUp.bits.fpWen := wakeUpIn.bits.fpWenCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 3444c5a0d77Sxiaofeibao-xjtu if (wakeUpIn.bits.vecWenCopy.nonEmpty) wakeUp.bits.vecWen := wakeUpIn.bits.vecWenCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 345c720aa49Ssinsanction if (wakeUpIn.bits.v0WenCopy.nonEmpty) wakeUp.bits.v0Wen := wakeUpIn.bits.v0WenCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 346c720aa49Ssinsanction if (wakeUpIn.bits.vlWenCopy.nonEmpty) wakeUp.bits.vlWen := wakeUpIn.bits.vlWenCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 3474c5a0d77Sxiaofeibao-xjtu if (wakeUpIn.bits.loadDependencyCopy.nonEmpty) wakeUp.bits.loadDependency := wakeUpIn.bits.loadDependencyCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 3480c7ebb58Sxiaofeibao-xjtu } 34960912d84Sxiaofeibao-xjtu if (iq.params.numIntSrc == 0) wakeUp.bits.rfWen := false.B 35060f0c5aeSxiaofeibao if (iq.params.numFpSrc == 0) wakeUp.bits.fpWen := false.B 35160912d84Sxiaofeibao-xjtu if (iq.params.numVfSrc == 0) wakeUp.bits.vecWen := false.B 352c720aa49Ssinsanction if (iq.params.numV0Src == 0) wakeUp.bits.v0Wen := false.B 353c720aa49Ssinsanction if (iq.params.numVlSrc == 0) wakeUp.bits.vlWen := false.B 354bf35baadSXuan Hu } 355ea46c302SXuan Hu iq.io.og0Cancel := io.fromDataPath.og0Cancel 356ea46c302SXuan Hu iq.io.og1Cancel := io.fromDataPath.og1Cancel 3570f55a0d3SHaojin Tang iq.io.ldCancel := io.ldCancel 358bf35baadSXuan Hu } 359bf35baadSXuan Hu 360b6279fc6SZiyue Zhang // connect the vl writeback informatino to the issue queues 361b6279fc6SZiyue Zhang issueQueues.zipWithIndex.foreach { case(iq, i) => 362c720aa49Ssinsanction iq.io.vlIsVlmax := io.vlWriteBackInfo.vlIsVlmax 363c720aa49Ssinsanction iq.io.vlIsZero := io.vlWriteBackInfo.vlIsZero 364b6279fc6SZiyue Zhang } 365b6279fc6SZiyue Zhang 366c0be7f33SXuan Hu private val iqWakeUpOutMap: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] = 367bf35baadSXuan Hu issueQueues.flatMap(_.io.wakeupToIQ) 368c0be7f33SXuan Hu .map(x => (x.bits.exuIdx, x)) 369bf35baadSXuan Hu .toMap 370bf35baadSXuan Hu 371bf35baadSXuan Hu // Connect bundles having the same wakeup source 372bf35baadSXuan Hu io.toSchedulers.wakeupVec.foreach { wakeUp => 373c0be7f33SXuan Hu wakeUp := iqWakeUpOutMap(wakeUp.bits.exuIdx) 374bf35baadSXuan Hu } 375bf35baadSXuan Hu 37659ef6009Sxiaofeibao-xjtu io.toDataPathAfterDelay.zipWithIndex.foreach { case (toDpDy, i) => 37759ef6009Sxiaofeibao-xjtu toDpDy <> issueQueues(i).io.deqDelay 37859ef6009Sxiaofeibao-xjtu } 379bf35baadSXuan Hu 380f99b81adSHaojin Tang // Response 381f99b81adSHaojin Tang issueQueues.zipWithIndex.foreach { case (iq, i) => 382f99b81adSHaojin Tang iq.io.og0Resp.zipWithIndex.foreach { case (og0Resp, j) => 383f99b81adSHaojin Tang og0Resp := io.fromDataPath(i)(j).og0resp 384f99b81adSHaojin Tang } 385f99b81adSHaojin Tang iq.io.og1Resp.zipWithIndex.foreach { case (og1Resp, j) => 386f99b81adSHaojin Tang og1Resp := io.fromDataPath(i)(j).og1resp 387f99b81adSHaojin Tang } 388f99b81adSHaojin Tang iq.io.finalIssueResp.foreach(_.zipWithIndex.foreach { case (finalIssueResp, j) => 389670870b3SXuan Hu if (io.loadFinalIssueResp(i).isDefinedAt(j)) { 390f99b81adSHaojin Tang finalIssueResp := io.loadFinalIssueResp(i)(j) 391670870b3SXuan Hu } else { 392670870b3SXuan Hu finalIssueResp := 0.U.asTypeOf(finalIssueResp) 393670870b3SXuan Hu } 394f99b81adSHaojin Tang }) 395e8800897SXuan Hu iq.io.memAddrIssueResp.foreach(_.zipWithIndex.foreach { case (memAddrIssueResp, j) => 396aa2bcc31SzhanglyGit if (io.memAddrIssueResp(i).isDefinedAt(j)) { 397e8800897SXuan Hu memAddrIssueResp := io.memAddrIssueResp(i)(j) 398aa2bcc31SzhanglyGit } else { 399aa2bcc31SzhanglyGit memAddrIssueResp := 0.U.asTypeOf(memAddrIssueResp) 400aa2bcc31SzhanglyGit } 401e8800897SXuan Hu }) 4027e471bf8SXuan Hu iq.io.vecLoadIssueResp.foreach(_.zipWithIndex.foreach { case (resp, deqIdx) => 4037e471bf8SXuan Hu resp := io.vecLoadIssueResp(i)(deqIdx) 4047e471bf8SXuan Hu }) 405c38df446SzhanglyGit if(params.isVfSchd) { 406c38df446SzhanglyGit iq.io.og2Resp.get.zipWithIndex.foreach { case (og2Resp, exuIdx) => 407c38df446SzhanglyGit og2Resp := io.fromOg2.get(i)(exuIdx) 408c38df446SzhanglyGit } 409c38df446SzhanglyGit } 410f99b81adSHaojin Tang iq.io.wbBusyTableRead := io.fromWbFuBusyTable.fuBusyTableRead(i) 411f99b81adSHaojin Tang io.wbFuBusyTable(i) := iq.io.wbBusyTableWrite 412f99b81adSHaojin Tang } 413f99b81adSHaojin Tang 414e1a85e9fSchengguanghui // perfEvent 415e1a85e9fSchengguanghui val lastCycleDp2IqOutFireVec = RegNext(VecInit(dispatch2Iq.io.out.flatten.map(_.fire))) 416e1a85e9fSchengguanghui val lastCycleIqEnqFireVec = RegNext(VecInit(issueQueues.map(_.io.enq.map(_.fire)).flatten)) 417e1a85e9fSchengguanghui val lastCycleIqFullVec = RegNext(VecInit(issueQueues.map(_.io.enq.head.ready))) 418e1a85e9fSchengguanghui 419e1a85e9fSchengguanghui val issueQueueFullVecPerf = issueQueues.zip(lastCycleIqFullVec)map{ case (iq, full) => (iq.params.getIQName + s"_full", full) } 420e1a85e9fSchengguanghui val basePerfEvents = Seq( 421e1a85e9fSchengguanghui ("dispatch2Iq_out_fire_cnt", PopCount(lastCycleDp2IqOutFireVec) ), 422e1a85e9fSchengguanghui ("issueQueue_enq_fire_cnt", PopCount(lastCycleIqEnqFireVec) ) 423e1a85e9fSchengguanghui ) ++ issueQueueFullVecPerf 424e1a85e9fSchengguanghui 425c0be7f33SXuan Hu println(s"[Scheduler] io.fromSchedulers.wakeupVec: ${io.fromSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}") 426bf35baadSXuan Hu println(s"[Scheduler] iqWakeUpInKeys: ${iqWakeUpInMap.keys}") 427bf35baadSXuan Hu 428bf35baadSXuan Hu println(s"[Scheduler] iqWakeUpOutKeys: ${iqWakeUpOutMap.keys}") 429c0be7f33SXuan Hu println(s"[Scheduler] io.toSchedulers.wakeupVec: ${io.toSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}") 430730cfbc0SXuan Hu} 431730cfbc0SXuan Hu 432730cfbc0SXuan Huclass SchedulerArithImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters) 433730cfbc0SXuan Hu extends SchedulerImpBase(wrapper) 434730cfbc0SXuan Hu with HasXSParameter 435e1a85e9fSchengguanghui with HasPerfEvents 436730cfbc0SXuan Hu{ 4372e0a7dc5Sfdy// dontTouch(io.vfWbFuBusyTable) 438730cfbc0SXuan Hu println(s"[SchedulerArithImp] " + 439730cfbc0SXuan Hu s"has intBusyTable: ${intBusyTable.nonEmpty}, " + 440730cfbc0SXuan Hu s"has vfBusyTable: ${vfBusyTable.nonEmpty}") 441730cfbc0SXuan Hu 442730cfbc0SXuan Hu issueQueues.zipWithIndex.foreach { case (iq, i) => 443730cfbc0SXuan Hu iq.io.flush <> io.fromCtrlBlock.flush 444730cfbc0SXuan Hu iq.io.enq <> dispatch2Iq.io.out(i) 445f39a61a1SzhanglyGit val intWBIQ = params.schdType match { 446f39a61a1SzhanglyGit case IntScheduler() => wakeupFromIntWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1) 44760f0c5aeSxiaofeibao case FpScheduler() => wakeupFromFpWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1) 448c720aa49Ssinsanction case VfScheduler() => (wakeupFromVfWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 449c720aa49Ssinsanction wakeupFromV0WBVec.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 450c720aa49Ssinsanction wakeupFromVlWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1)) 451596af5d2SHaojin Tang case _ => null 452f39a61a1SzhanglyGit } 453f39a61a1SzhanglyGit iq.io.wakeupFromWB.zip(intWBIQ).foreach{ case (sink, source) => sink := source} 454730cfbc0SXuan Hu } 455e1a85e9fSchengguanghui 456e1a85e9fSchengguanghui val perfEvents = basePerfEvents 457e1a85e9fSchengguanghui generatePerfEvent() 458730cfbc0SXuan Hu} 459730cfbc0SXuan Hu 460f99b81adSHaojin Tang// FIXME: Vector mem instructions may not be handled properly! 461730cfbc0SXuan Huclass SchedulerMemImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters) 462730cfbc0SXuan Hu extends SchedulerImpBase(wrapper) 463730cfbc0SXuan Hu with HasXSParameter 464e1a85e9fSchengguanghui with HasPerfEvents 465730cfbc0SXuan Hu{ 466730cfbc0SXuan Hu println(s"[SchedulerMemImp] " + 467730cfbc0SXuan Hu s"has intBusyTable: ${intBusyTable.nonEmpty}, " + 468730cfbc0SXuan Hu s"has vfBusyTable: ${vfBusyTable.nonEmpty}") 469730cfbc0SXuan Hu 470559c1710SHaojin Tang val memAddrIQs = issueQueues.filter(_.params.isMemAddrIQ) 471e07131b2Ssinsanction val stAddrIQs = issueQueues.filter(iq => iq.params.StaCnt > 0) // included in memAddrIQs 472e07131b2Ssinsanction val ldAddrIQs = issueQueues.filter(iq => iq.params.LduCnt > 0) 473e07131b2Ssinsanction val stDataIQs = issueQueues.filter(iq => iq.params.StdCnt > 0) 474559c1710SHaojin Tang val vecMemIQs = issueQueues.filter(_.params.isVecMemIQ) 475559c1710SHaojin Tang val (hyuIQs, hyuIQIdxs) = issueQueues.zipWithIndex.filter(_._1.params.HyuCnt > 0).unzip 476499caf4cSXuan Hu 477499caf4cSXuan Hu println(s"[SchedulerMemImp] memAddrIQs.size: ${memAddrIQs.size}, enq.size: ${memAddrIQs.map(_.io.enq.size).sum}") 478499caf4cSXuan Hu println(s"[SchedulerMemImp] stAddrIQs.size: ${stAddrIQs.size }, enq.size: ${stAddrIQs.map(_.io.enq.size).sum}") 479499caf4cSXuan Hu println(s"[SchedulerMemImp] ldAddrIQs.size: ${ldAddrIQs.size }, enq.size: ${ldAddrIQs.map(_.io.enq.size).sum}") 480499caf4cSXuan Hu println(s"[SchedulerMemImp] stDataIQs.size: ${stDataIQs.size }, enq.size: ${stDataIQs.map(_.io.enq.size).sum}") 481499caf4cSXuan Hu println(s"[SchedulerMemImp] hyuIQs.size: ${hyuIQs.size }, enq.size: ${hyuIQs.map(_.io.enq.size).sum}") 482730cfbc0SXuan Hu require(memAddrIQs.nonEmpty && stDataIQs.nonEmpty) 483730cfbc0SXuan Hu 484853cd2d8SHaojin Tang io.toMem.get.loadFastMatch := 0.U.asTypeOf(io.toMem.get.loadFastMatch) // TODO: is still needed? 485853cd2d8SHaojin Tang 486fc45ed13SXuan Hu private val loadWakeUp = issueQueues.filter(_.params.LdExuCnt > 0).map(_.asInstanceOf[IssueQueueMemAddrImp].io.memIO.get.loadWakeUp).flatten 487596af5d2SHaojin Tang require(loadWakeUp.length == io.fromMem.get.wakeup.length) 488596af5d2SHaojin Tang loadWakeUp.zip(io.fromMem.get.wakeup).foreach(x => x._1 := x._2) 489596af5d2SHaojin Tang 490730cfbc0SXuan Hu memAddrIQs.zipWithIndex.foreach { case (iq, i) => 491730cfbc0SXuan Hu iq.io.flush <> io.fromCtrlBlock.flush 492730cfbc0SXuan Hu iq.io.enq <> dispatch2Iq.io.out(i) 49360f0c5aeSxiaofeibao iq.io.wakeupFromWB.zip( 49460f0c5aeSxiaofeibao wakeupFromIntWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 49560f0c5aeSxiaofeibao wakeupFromFpWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 496c720aa49Ssinsanction wakeupFromVfWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 497c720aa49Ssinsanction wakeupFromV0WBVec.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 498c720aa49Ssinsanction wakeupFromVlWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1) 49960f0c5aeSxiaofeibao ).foreach{ case (sink, source) => sink := source} 500730cfbc0SXuan Hu } 501730cfbc0SXuan Hu 502ecfc6f16SXuan Hu ldAddrIQs.zipWithIndex.foreach { 503ecfc6f16SXuan Hu case (imp: IssueQueueMemAddrImp, i) => 504ecfc6f16SXuan Hu imp.io.memIO.get.feedbackIO.head := 0.U.asTypeOf(imp.io.memIO.get.feedbackIO.head) 505c14e89f4SHaojin Tang imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr 506de784418SXuan Hu imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 5077b753bebSXuan Hu case _ => 5087b753bebSXuan Hu } 5097b753bebSXuan Hu 510ecfc6f16SXuan Hu stAddrIQs.zipWithIndex.foreach { 511ecfc6f16SXuan Hu case (imp: IssueQueueMemAddrImp, i) => 512ecfc6f16SXuan Hu imp.io.memIO.get.feedbackIO.head := io.fromMem.get.staFeedback(i) 513c14e89f4SHaojin Tang imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr 514c14e89f4SHaojin Tang imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 5157b753bebSXuan Hu case _ => 5167b753bebSXuan Hu } 517730cfbc0SXuan Hu 518559c1710SHaojin Tang hyuIQs.zip(hyuIQIdxs).foreach { 519559c1710SHaojin Tang case (imp: IssueQueueMemAddrImp, idx) => 520670870b3SXuan Hu imp.io.memIO.get.feedbackIO.head := io.fromMem.get.hyuFeedback.head 521670870b3SXuan Hu imp.io.memIO.get.feedbackIO(1) := 0.U.asTypeOf(imp.io.memIO.get.feedbackIO(1)) 5228f1fa9b1Ssfencevma imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr 5238f1fa9b1Ssfencevma imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 524559c1710SHaojin Tang // TODO: refactor ditry code 525559c1710SHaojin Tang imp.io.deqDelay(1).ready := false.B 526559c1710SHaojin Tang io.toDataPathAfterDelay(idx)(1).valid := false.B 527559c1710SHaojin Tang io.toDataPathAfterDelay(idx)(1).bits := 0.U.asTypeOf(io.toDataPathAfterDelay(idx)(1).bits) 5288f1fa9b1Ssfencevma case _ => 5298f1fa9b1Ssfencevma } 5308f1fa9b1Ssfencevma 531e62b6911SXuan Hu private val staIdxSeq = (stAddrIQs).map(iq => iq.params.idxInSchBlk) 532e62b6911SXuan Hu private val hyaIdxSeq = (hyuIQs).map(iq => iq.params.idxInSchBlk) 533e62b6911SXuan Hu 534e62b6911SXuan Hu println(s"[SchedulerMemImp] sta iq idx in memSchdBlock: $staIdxSeq") 535e62b6911SXuan Hu println(s"[SchedulerMemImp] hya iq idx in memSchdBlock: $hyaIdxSeq") 536e62b6911SXuan Hu 537e62b6911SXuan Hu private val staEnqs = stAddrIQs.map(_.io.enq).flatten 538e62b6911SXuan Hu private val stdEnqs = stDataIQs.map(_.io.enq).flatten.take(staEnqs.size) 539e62b6911SXuan Hu private val hyaEnqs = hyuIQs.map(_.io.enq).flatten 540e62b6911SXuan Hu private val hydEnqs = stDataIQs.map(_.io.enq).flatten.drop(staEnqs.size) 541e62b6911SXuan Hu 542e62b6911SXuan Hu require(staEnqs.size == stdEnqs.size, s"number of enq ports of store address IQs(${staEnqs.size}) " + 543e62b6911SXuan Hu s"should be equal to number of enq ports of store data IQs(${stdEnqs.size})") 544e62b6911SXuan Hu 545e62b6911SXuan Hu require(hyaEnqs.size == hydEnqs.size, s"number of enq ports of hybrid address IQs(${hyaEnqs.size}) " + 546e62b6911SXuan Hu s"should be equal to number of enq ports of hybrid data IQs(${hydEnqs.size})") 5479b258a00Sxgkiri 5480438e8f4SHaojin Tang val d2IqStaOut = dispatch2Iq.io.out.zipWithIndex.filter(staIdxSeq contains _._2).unzip._1.flatten 5490438e8f4SHaojin Tang d2IqStaOut.zip(staEnqs).zip(stdEnqs).foreach{ case((dp, staIQ), stdIQ) => 550730cfbc0SXuan Hu val isAllReady = staIQ.ready && stdIQ.ready 551e62b6911SXuan Hu dp.ready := isAllReady 552e62b6911SXuan Hu staIQ.valid := dp.valid && isAllReady 5530438e8f4SHaojin Tang stdIQ.valid := dp.valid && isAllReady && FuType.FuTypeOrR(dp.bits.fuType, FuType.stu, FuType.mou) 5549b258a00Sxgkiri } 555730cfbc0SXuan Hu 5560438e8f4SHaojin Tang val d2IqHyaOut = dispatch2Iq.io.out.zipWithIndex.filter(hyaIdxSeq contains _._2).unzip._1.flatten 5570438e8f4SHaojin Tang d2IqHyaOut.zip(hyaEnqs).zip(hydEnqs).foreach{ case((dp, hyaIQ), hydIQ) => 558e62b6911SXuan Hu val isAllReady = hyaIQ.ready && hydIQ.ready 559e62b6911SXuan Hu dp.ready := isAllReady 560e62b6911SXuan Hu hyaIQ.valid := dp.valid && isAllReady 56156bceacbSHaojin Tang hydIQ.valid := dp.valid && isAllReady && FuType.FuTypeOrR(dp.bits.fuType, FuType.stu, FuType.mou) 562e62b6911SXuan Hu } 563730cfbc0SXuan Hu 564e62b6911SXuan Hu stDataIQs.zipWithIndex.foreach { case (iq, i) => 565e62b6911SXuan Hu iq.io.flush <> io.fromCtrlBlock.flush 56660f0c5aeSxiaofeibao iq.io.wakeupFromWB.zip( 56760f0c5aeSxiaofeibao wakeupFromIntWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 56860f0c5aeSxiaofeibao wakeupFromFpWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 569c720aa49Ssinsanction wakeupFromVfWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 570c720aa49Ssinsanction wakeupFromV0WBVec.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 571c720aa49Ssinsanction wakeupFromVlWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq 57260f0c5aeSxiaofeibao ).foreach{ case (sink, source) => sink := source} 573e62b6911SXuan Hu } 574e62b6911SXuan Hu 575e62b6911SXuan Hu (stdEnqs ++ hydEnqs).zip(staEnqs ++ hyaEnqs).zipWithIndex.foreach { case ((stdIQEnq, staIQEnq), i) => 576730cfbc0SXuan Hu stdIQEnq.bits := staIQEnq.bits 577730cfbc0SXuan Hu // Store data reuses store addr src(1) in dispatch2iq 578e62b6911SXuan Hu // [dispatch2iq] --src*------src*(0)--> [staIQ|hyaIQ] 579730cfbc0SXuan Hu // \ 580730cfbc0SXuan Hu // ---src*(1)--> [stdIQ] 581730cfbc0SXuan Hu // Since the src(1) of sta is easier to get, stdIQEnq.bits.src*(0) is assigned to staIQEnq.bits.src*(1) 582730cfbc0SXuan Hu // instead of dispatch2Iq.io.out(x).bits.src*(1) 58397b279b9SXuan Hu val stdIdx = 1 5842d270511Ssinsanction stdIQEnq.bits.srcState(0) := staIQEnq.bits.srcState(stdIdx) 58513551487SzhanglyGit stdIQEnq.bits.srcLoadDependency(0) := staIQEnq.bits.srcLoadDependency(1) 5862d270511Ssinsanction stdIQEnq.bits.srcType(0) := staIQEnq.bits.srcType(stdIdx) 5872d270511Ssinsanction stdIQEnq.bits.psrc(0) := staIQEnq.bits.psrc(stdIdx) 588730cfbc0SXuan Hu stdIQEnq.bits.sqIdx := staIQEnq.bits.sqIdx 589730cfbc0SXuan Hu } 590730cfbc0SXuan Hu 5912d270511Ssinsanction vecMemIQs.foreach { 5922d270511Ssinsanction case imp: IssueQueueVecMemImp => 5932d270511Ssinsanction imp.io.memIO.get.sqDeqPtr.foreach(_ := io.fromMem.get.sqDeqPtr) 5942d270511Ssinsanction imp.io.memIO.get.lqDeqPtr.foreach(_ := io.fromMem.get.lqDeqPtr) 5951f3d1b4dSXuan Hu // not used 596b7c799beSzhanglyGit //imp.io.memIO.get.feedbackIO.head := io.fromMem.get.vstuFeedback.head // only vector store replay 5971f3d1b4dSXuan Hu // maybe not used 5981f3d1b4dSXuan Hu imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr 5991f3d1b4dSXuan Hu imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 60060f0c5aeSxiaofeibao imp.io.wakeupFromWB.zip( 60160f0c5aeSxiaofeibao wakeupFromIntWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 60260f0c5aeSxiaofeibao wakeupFromFpWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 603c720aa49Ssinsanction wakeupFromVfWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 604c720aa49Ssinsanction wakeupFromV0WBVec.zipWithIndex.filter(x => imp.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 605c720aa49Ssinsanction wakeupFromVlWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq 60660f0c5aeSxiaofeibao ).foreach{ case (sink, source) => sink := source} 607f39a61a1SzhanglyGit 6082d270511Ssinsanction case _ => 6092d270511Ssinsanction } 610b7c799beSzhanglyGit val vecMemFeedbackIO: Seq[MemRSFeedbackIO] = vecMemIQs.map { 611b7c799beSzhanglyGit case imp: IssueQueueVecMemImp => 612b7c799beSzhanglyGit imp.io.memIO.get.feedbackIO 613b7c799beSzhanglyGit }.flatten 614b7c799beSzhanglyGit assert(vecMemFeedbackIO.size == io.fromMem.get.vstuFeedback.size, "vecMemFeedback size dont match!") 615b7c799beSzhanglyGit vecMemFeedbackIO.zip(io.fromMem.get.vstuFeedback).foreach{ 616b7c799beSzhanglyGit case (sink, source) => 617b7c799beSzhanglyGit sink := source 618b7c799beSzhanglyGit } 6192d270511Ssinsanction 620730cfbc0SXuan Hu val lsqEnqCtrl = Module(new LsqEnqCtrl) 621730cfbc0SXuan Hu 622730cfbc0SXuan Hu lsqEnqCtrl.io.redirect <> io.fromCtrlBlock.flush 623730cfbc0SXuan Hu lsqEnqCtrl.io.enq <> dispatch2Iq.io.enqLsqIO.get 624730cfbc0SXuan Hu lsqEnqCtrl.io.lcommit := io.fromMem.get.lcommit 625730cfbc0SXuan Hu lsqEnqCtrl.io.scommit := io.fromMem.get.scommit 626730cfbc0SXuan Hu lsqEnqCtrl.io.lqCancelCnt := io.fromMem.get.lqCancelCnt 627730cfbc0SXuan Hu lsqEnqCtrl.io.sqCancelCnt := io.fromMem.get.sqCancelCnt 628f3a9fb05SAnzo dispatch2Iq.io.lqFreeCount.get := lsqEnqCtrl.io.lqFreeCount 629f3a9fb05SAnzo dispatch2Iq.io.sqFreeCount.get := lsqEnqCtrl.io.sqFreeCount 630730cfbc0SXuan Hu io.memIO.get.lsqEnqIO <> lsqEnqCtrl.io.enqLsq 6317e471bf8SXuan Hu 6327e471bf8SXuan Hu dontTouch(io.vecLoadIssueResp) 633e1a85e9fSchengguanghui 634e1a85e9fSchengguanghui val intBusyTablePerf = intBusyTable.get 635e1a85e9fSchengguanghui val fpBusyTablePerf = fpBusyTable.get 636e1a85e9fSchengguanghui val vecBusyTablePerf = vfBusyTable.get 637e1a85e9fSchengguanghui val v0BusyTablePerf = v0BusyTable.get 638e1a85e9fSchengguanghui val vlBusyTablePerf = vlBusyTable.get 639e1a85e9fSchengguanghui 640e1a85e9fSchengguanghui val perfEvents = basePerfEvents ++ Seq(intBusyTablePerf, fpBusyTablePerf, vecBusyTablePerf, v0BusyTablePerf, vlBusyTablePerf).flatten(_.getPerfEvents) 641e1a85e9fSchengguanghui generatePerfEvent() 642730cfbc0SXuan Hu} 643