15db4956bSzhanglyGitpackage xiangshan.backend.issue 25db4956bSzhanglyGit 383ba63b3SXuan Huimport org.chipsalliance.cde.config.Parameters 45db4956bSzhanglyGitimport chisel3._ 55db4956bSzhanglyGitimport chisel3.util._ 65db4956bSzhanglyGitimport utility.HasCircularQueuePtrHelper 75db4956bSzhanglyGitimport utils.{MathUtils, OptionWrapper} 85db4956bSzhanglyGitimport xiangshan._ 95db4956bSzhanglyGitimport xiangshan.backend.Bundles._ 105db4956bSzhanglyGitimport xiangshan.backend.fu.FuType 115db4956bSzhanglyGitimport xiangshan.backend.datapath.DataSource 125db4956bSzhanglyGitimport xiangshan.backend.rob.RobPtr 132d270511Ssinsanctionimport xiangshan.mem.{MemWaitUpdateReq, SqPtr, LqPtr} 145db4956bSzhanglyGit 155db4956bSzhanglyGit 165db4956bSzhanglyGitclass EnqEntryIO(implicit p: Parameters, params: IssueBlockParams) extends XSBundle { 175db4956bSzhanglyGit //input 185db4956bSzhanglyGit val enq = Flipped(ValidIO(new EntryBundle)) 195db4956bSzhanglyGit val flush = Flipped(ValidIO(new Redirect)) 205db4956bSzhanglyGit val wakeUpFromWB: MixedVec[ValidIO[IssueQueueWBWakeUpBundle]] = Flipped(params.genWBWakeUpSinkValidBundle) 215db4956bSzhanglyGit val wakeUpFromIQ: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpSinkValidBundle) 227a96cc7fSHaojin Tang val og0Cancel = Input(ExuOH(backendParams.numExu)) 237a96cc7fSHaojin Tang val og1Cancel = Input(ExuOH(backendParams.numExu)) 246810d1e8Ssfencevma val ldCancel = Vec(backendParams.LduCnt + backendParams.HyuCnt, Flipped(new LoadCancelIO)) 25aa2b5219Ssinsanction val enqDelayWakeUpFromWB: MixedVec[ValidIO[IssueQueueWBWakeUpBundle]] = Flipped(params.genWBWakeUpSinkValidBundle) 26aa2b5219Ssinsanction val enqDelayWakeUpFromIQ: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpSinkValidBundle) 27aa2b5219Ssinsanction val enqDelayOg0Cancel = Input(ExuOH(backendParams.numExu)) 287cbafe1aSzhanglyGit val enqDelayLdCancel = Vec(backendParams.LdExuCnt, Flipped(new LoadCancelIO)) 295db4956bSzhanglyGit val deqSel = Input(Bool()) 305db4956bSzhanglyGit val deqPortIdxWrite = Input(UInt(1.W)) 315db4956bSzhanglyGit val transSel = Input(Bool()) 325db4956bSzhanglyGit val issueResp = Flipped(ValidIO(new EntryDeqRespBundle)) 335db4956bSzhanglyGit //output 345db4956bSzhanglyGit val valid = Output(Bool()) 355db4956bSzhanglyGit val canIssue = Output(Bool()) 365db4956bSzhanglyGit val clear = Output(Bool()) 375db4956bSzhanglyGit val fuType = Output(FuType()) 385db4956bSzhanglyGit val dataSource = Output(Vec(params.numRegSrc, DataSource())) 397a96cc7fSHaojin Tang val srcWakeUpL1ExuOH = OptionWrapper(params.hasIQWakeUp, Output(Vec(params.numRegSrc, ExuOH()))) 405db4956bSzhanglyGit val srcTimer = OptionWrapper(params.hasIQWakeUp, Output(Vec(params.numRegSrc, UInt(3.W)))) 415db4956bSzhanglyGit val transEntry = ValidIO(new EntryBundle) 425db4956bSzhanglyGit val isFirstIssue = Output(Bool()) 435db4956bSzhanglyGit val entry = ValidIO(new EntryBundle) 445db4956bSzhanglyGit val robIdx = Output(new RobPtr) 452d270511Ssinsanction val uopIdx = OptionWrapper(params.isVecMemIQ, Output(UopIdx())) 465db4956bSzhanglyGit val deqPortIdxRead = Output(UInt(1.W)) 475db4956bSzhanglyGit val issueTimerRead = Output(UInt(2.W)) 485db4956bSzhanglyGit // mem only 495db4956bSzhanglyGit val fromMem = if(params.isMemAddrIQ) Some(new Bundle { 505db4956bSzhanglyGit val stIssuePtr = Input(new SqPtr) 515db4956bSzhanglyGit val memWaitUpdateReq = Flipped(new MemWaitUpdateReq) 525db4956bSzhanglyGit }) else None 532d270511Ssinsanction // vector mem only 542d270511Ssinsanction val fromLsq = OptionWrapper(params.isVecMemIQ, new Bundle { 552d270511Ssinsanction val sqDeqPtr = Input(new SqPtr) 562d270511Ssinsanction val lqDeqPtr = Input(new LqPtr) 572d270511Ssinsanction }) 5889740385Ssinsanction // debug 5989740385Ssinsanction val cancel = OptionWrapper(params.hasIQWakeUp, Output(Bool())) 605db4956bSzhanglyGit 615db4956bSzhanglyGit def wakeup = wakeUpFromWB ++ wakeUpFromIQ 625db4956bSzhanglyGit} 635db4956bSzhanglyGit 645db4956bSzhanglyGitclass EnqEntry(implicit p: Parameters, params: IssueBlockParams) extends XSModule { 655db4956bSzhanglyGit val io = IO(new EnqEntryIO) 665db4956bSzhanglyGit 675db4956bSzhanglyGit val validReg = RegInit(false.B) 685db4956bSzhanglyGit val entryReg = Reg(new EntryBundle) 69aa2b5219Ssinsanction val enqDelayValidReg = RegInit(false.B) 705db4956bSzhanglyGit 715db4956bSzhanglyGit val validRegNext = Wire(Bool()) 725db4956bSzhanglyGit val entryRegNext = Wire(new EntryBundle) 735db4956bSzhanglyGit val entryUpdate = Wire(new EntryBundle) 74aa2b5219Ssinsanction val enqDelayValidRegNext = Wire(Bool()) 755db4956bSzhanglyGit val enqReady = Wire(Bool()) 765db4956bSzhanglyGit val clear = Wire(Bool()) 775db4956bSzhanglyGit val flushed = Wire(Bool()) 785db4956bSzhanglyGit val deqSuccess = Wire(Bool()) 795db4956bSzhanglyGit val srcWakeUp = Wire(Vec(params.numRegSrc, Bool())) 80af4bd265SzhanglyGit val srcWakeUpByWB = Wire(Vec(params.numRegSrc, Bool())) 815db4956bSzhanglyGit val srcCancelVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numRegSrc, Bool()))) 820f55a0d3SHaojin Tang val srcLoadCancelVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numRegSrc, Bool()))) 835db4956bSzhanglyGit val srcWakeUpByIQVec = Wire(Vec(params.numRegSrc, Vec(params.numWakeupFromIQ, Bool()))) 84af4bd265SzhanglyGit val srcWakeUpByIQWithoutCancel = Wire(Vec(params.numRegSrc, Vec(params.numWakeupFromIQ, Bool()))) 85af4bd265SzhanglyGit val srcWakeUpButCancel = Wire(Vec(params.numRegSrc, Vec(params.numWakeupFromIQ, Bool()))) 86af4bd265SzhanglyGit val srcWakeUpL1ExuOHOut = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numRegSrc, ExuOH()))) 87af4bd265SzhanglyGit val srcLoadDependencyOut = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numRegSrc, Vec(LoadPipelineWidth, UInt(3.W))))) 880f55a0d3SHaojin Tang val wakeupLoadDependencyByIQVec = Wire(Vec(params.numWakeupFromIQ, Vec(LoadPipelineWidth, UInt(3.W)))) 890f55a0d3SHaojin Tang val shiftedWakeupLoadDependencyByIQVec = Wire(Vec(params.numWakeupFromIQ, Vec(LoadPipelineWidth, UInt(3.W)))) 90af4bd265SzhanglyGit val shiftedWakeupLoadDependencyByIQBypassVec = Wire(Vec(params.numWakeupFromIQ, Vec(LoadPipelineWidth, UInt(3.W)))) 9189740385Ssinsanction val cancelVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numRegSrc, Bool()))) 925db4956bSzhanglyGit 93aa2b5219Ssinsanction val currentStatus = Wire(new Status()) 94aa2b5219Ssinsanction val enqDelaySrcState = Wire(Vec(params.numRegSrc, SrcState())) 95aa2b5219Ssinsanction val enqDelayDataSources = Wire(Vec(params.numRegSrc, DataSource())) 96aa2b5219Ssinsanction val enqDelaySrcWakeUpL1ExuOH = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numRegSrc, ExuOH()))) 97aa2b5219Ssinsanction val enqDelaySrcTimer = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numRegSrc, UInt(3.W)))) 98aa2b5219Ssinsanction val enqDelaySrcLoadDependency = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numRegSrc, Vec(LoadPipelineWidth, UInt(3.W))))) 99aa2b5219Ssinsanction 100aa2b5219Ssinsanction val enqDelaySrcWakeUpByWB: Vec[UInt] = Wire(Vec(params.numRegSrc, SrcState())) 101aa2b5219Ssinsanction val enqDelaySrcWakeUpByIQ: Vec[UInt] = Wire(Vec(params.numRegSrc, SrcState())) 102aa2b5219Ssinsanction val enqDelaySrcWakeUpByIQVec: Vec[Vec[Bool]] = Wire(Vec(params.numRegSrc, Vec(params.numWakeupFromIQ, Bool()))) 103aa2b5219Ssinsanction val enqDelayShiftedWakeupLoadDependencyByIQVec: Vec[Vec[UInt]] = Wire(Vec(params.numWakeupFromIQ, Vec(LoadPipelineWidth, UInt(3.W)))) 104aa2b5219Ssinsanction 1055db4956bSzhanglyGit //Reg 1065db4956bSzhanglyGit validReg := validRegNext 1075db4956bSzhanglyGit entryReg := entryRegNext 108aa2b5219Ssinsanction enqDelayValidReg := enqDelayValidRegNext 1095db4956bSzhanglyGit 1105db4956bSzhanglyGit //Wire 1115db4956bSzhanglyGit when(io.enq.valid && enqReady) { 1125db4956bSzhanglyGit validRegNext := true.B 1135db4956bSzhanglyGit }.elsewhen(clear) { 1145db4956bSzhanglyGit validRegNext := false.B 1155db4956bSzhanglyGit }.otherwise { 1165db4956bSzhanglyGit validRegNext := validReg 1175db4956bSzhanglyGit } 1185db4956bSzhanglyGit 1195db4956bSzhanglyGit when(io.enq.valid && enqReady) { 1205db4956bSzhanglyGit entryRegNext := io.enq.bits 1215db4956bSzhanglyGit }.otherwise { 1225db4956bSzhanglyGit entryRegNext := entryUpdate 1235db4956bSzhanglyGit } 1245db4956bSzhanglyGit 125aa2b5219Ssinsanction when(io.enq.valid && enqReady) { 126aa2b5219Ssinsanction enqDelayValidRegNext := true.B 127aa2b5219Ssinsanction }.otherwise { 128aa2b5219Ssinsanction enqDelayValidRegNext := false.B 129aa2b5219Ssinsanction } 130aa2b5219Ssinsanction 1315db4956bSzhanglyGit enqReady := !validReg || clear 1325db4956bSzhanglyGit clear := flushed || io.transSel || deqSuccess 1335db4956bSzhanglyGit flushed := entryReg.status.robIdx.needFlush(io.flush) 1340f55a0d3SHaojin Tang deqSuccess := io.issueResp.valid && io.issueResp.bits.respType === RSFeedbackType.fuIdle && !srcLoadCancelVec.map(_.reduce(_ || _)).getOrElse(false.B) 135aa2b5219Ssinsanction 136aa2b5219Ssinsanction // current wakeup 137af4bd265SzhanglyGit srcWakeUpByWB := io.wakeUpFromWB.map(bundle => bundle.bits.wakeUp(entryReg.status.psrc zip entryReg.status.srcType, bundle.valid)).transpose.map(x => VecInit(x.toSeq).asUInt.orR).toSeq 138af4bd265SzhanglyGit srcWakeUp := srcWakeUpByWB.zip(srcWakeUpByIQVec).map { case (x, y) => x || y.asUInt.orR } 1395db4956bSzhanglyGit 1400f55a0d3SHaojin Tang shiftedWakeupLoadDependencyByIQVec 1410f55a0d3SHaojin Tang .zip(wakeupLoadDependencyByIQVec) 1420f55a0d3SHaojin Tang .zip(params.wakeUpInExuSources.map(_.name)).foreach { 1430f55a0d3SHaojin Tang case ((deps, originalDeps), name) => deps.zip(originalDeps).zipWithIndex.foreach { 1440f55a0d3SHaojin Tang case ((dep, originalDep), deqPortIdx) => 145a9ffe60aSHaojin Tang if (params.backendParam.getLdExuIdx(params.backendParam.allExuParams.find(_.name == name).get) == deqPortIdx) 146af4bd265SzhanglyGit dep := (originalDep << 2).asUInt | 2.U 1470f55a0d3SHaojin Tang else 1480f55a0d3SHaojin Tang dep := originalDep << 1 1490f55a0d3SHaojin Tang } 1500f55a0d3SHaojin Tang } 151af4bd265SzhanglyGit shiftedWakeupLoadDependencyByIQBypassVec 152af4bd265SzhanglyGit .zip(wakeupLoadDependencyByIQVec) 153af4bd265SzhanglyGit .zip(params.wakeUpInExuSources.map(_.name)).foreach { 154af4bd265SzhanglyGit case ((deps, originalDeps), name) => deps.zip(originalDeps).zipWithIndex.foreach { 155af4bd265SzhanglyGit case ((dep, originalDep), deqPortIdx) => 156aa2b5219Ssinsanction if (params.backendParam.getLdExuIdx(params.backendParam.allExuParams.find(_.name == name).get) == deqPortIdx) 157af4bd265SzhanglyGit dep := (originalDep << 1).asUInt | 1.U 158af4bd265SzhanglyGit else 159af4bd265SzhanglyGit dep := originalDep 160af4bd265SzhanglyGit } 161af4bd265SzhanglyGit } 1620f55a0d3SHaojin Tang 1635db4956bSzhanglyGit if (params.hasIQWakeUp) { 1647cbafe1aSzhanglyGit srcCancelVec.get.zip(srcLoadCancelVec.get).zip(srcWakeUpByIQWithoutCancel).zipWithIndex.foreach { case (((srcCancel, srcLoadCancel), wakeUpByIQVec), srcIdx) => 165e08589a5Ssinsanction val ldTransCancel = Mux1H(wakeUpByIQVec, wakeupLoadDependencyByIQVec.map(dep => LoadShouldCancel(Some(dep), io.ldCancel))) 166aa2b5219Ssinsanction srcLoadCancel := LoadShouldCancel(currentStatus.srcLoadDependency.map(_(srcIdx)), io.ldCancel) 167af4bd265SzhanglyGit srcCancel := srcLoadCancel || ldTransCancel 1685db4956bSzhanglyGit } 1695db4956bSzhanglyGit } 1705db4956bSzhanglyGit 1715db4956bSzhanglyGit if (io.wakeUpFromIQ.isEmpty) { 1725db4956bSzhanglyGit srcWakeUpByIQVec := 0.U.asTypeOf(srcWakeUpByIQVec) 1730f55a0d3SHaojin Tang wakeupLoadDependencyByIQVec := 0.U.asTypeOf(wakeupLoadDependencyByIQVec) 1745db4956bSzhanglyGit } else { 1755db4956bSzhanglyGit val wakeupVec: IndexedSeq[IndexedSeq[Bool]] = io.wakeUpFromIQ.map((bundle: ValidIO[IssueQueueIQWakeUpBundle]) => 1765db4956bSzhanglyGit bundle.bits.wakeUp(entryReg.status.psrc zip entryReg.status.srcType, bundle.valid) 17783ba63b3SXuan Hu ).toIndexedSeq.transpose 178*acf41503Ssinsanction val cancelSel = params.wakeUpSourceExuIdx.map(io.og0Cancel(_)) 179af4bd265SzhanglyGit srcWakeUpByIQVec := wakeupVec.map(x => VecInit(x.zip(cancelSel).map { case (wakeup, cancel) => wakeup && !cancel })) 180af4bd265SzhanglyGit srcWakeUpButCancel := wakeupVec.map(x => VecInit(x.zip(cancelSel).map { case (wakeup, cancel) => wakeup && cancel })) 181af4bd265SzhanglyGit srcWakeUpByIQWithoutCancel := wakeupVec.map(x => VecInit(x)) 18283ba63b3SXuan Hu wakeupLoadDependencyByIQVec := io.wakeUpFromIQ.map(_.bits.loadDependency).toSeq 1835db4956bSzhanglyGit } 1845db4956bSzhanglyGit 185aa2b5219Ssinsanction // enq delay wakeup 186aa2b5219Ssinsanction enqDelaySrcWakeUpByWB.zipWithIndex.foreach { case (wakeup, i) => 187aa2b5219Ssinsanction wakeup := io.enqDelayWakeUpFromWB.map(x => x.bits.wakeUp(Seq((entryReg.status.psrc(i), entryReg.status.srcType(i))), x.valid).head 188aa2b5219Ssinsanction ).reduce(_ || _) 189aa2b5219Ssinsanction } 190aa2b5219Ssinsanction 191aa2b5219Ssinsanction if (params.hasIQWakeUp) { 192aa2b5219Ssinsanction val wakeupVec: IndexedSeq[IndexedSeq[Bool]] = io.enqDelayWakeUpFromIQ.map( x => 193aa2b5219Ssinsanction x.bits.wakeUp(entryReg.status.psrc.zip(entryReg.status.srcType), x.valid) 194aa2b5219Ssinsanction ).toIndexedSeq.transpose 195*acf41503Ssinsanction val cancelSel = params.wakeUpSourceExuIdx.map(io.enqDelayOg0Cancel(_)) 196aa2b5219Ssinsanction enqDelaySrcWakeUpByIQVec := wakeupVec.map(x => VecInit(x.zip(cancelSel).map { case (wakeup, cancel) => wakeup && !cancel })) 197aa2b5219Ssinsanction } else { 198aa2b5219Ssinsanction enqDelaySrcWakeUpByIQVec := 0.U.asTypeOf(enqDelaySrcWakeUpByIQVec) 199aa2b5219Ssinsanction } 200aa2b5219Ssinsanction 201aa2b5219Ssinsanction if (params.hasIQWakeUp) { 202aa2b5219Ssinsanction enqDelaySrcWakeUpByIQ.zipWithIndex.foreach { case (wakeup, i) => 203aa2b5219Ssinsanction val ldTransCancel = Mux1H(enqDelaySrcWakeUpByIQVec(i), io.enqDelayWakeUpFromIQ.map(_.bits.loadDependency).map(dp => LoadShouldCancel(Some(dp), io.enqDelayLdCancel)).toSeq) 204aa2b5219Ssinsanction wakeup := enqDelaySrcWakeUpByIQVec(i).asUInt.orR && !ldTransCancel 205aa2b5219Ssinsanction } 206aa2b5219Ssinsanction } else { 207aa2b5219Ssinsanction enqDelaySrcWakeUpByIQ := 0.U.asTypeOf(enqDelaySrcWakeUpByIQ) 208aa2b5219Ssinsanction } 209aa2b5219Ssinsanction 210aa2b5219Ssinsanction enqDelayShiftedWakeupLoadDependencyByIQVec.zip(io.enqDelayWakeUpFromIQ.map(_.bits.loadDependency)) 211aa2b5219Ssinsanction .zip(params.wakeUpInExuSources.map(_.name)).foreach { case ((dps, ldps), name) => 212aa2b5219Ssinsanction dps.zip(ldps).zipWithIndex.foreach { case ((dp, ldp), deqPortIdx) => 213aa2b5219Ssinsanction if (params.backendParam.getLdExuIdx(params.backendParam.allExuParams.find(_.name == name).get) == deqPortIdx) 214aa2b5219Ssinsanction dp := (ldp << 2).asUInt | 2.U 215aa2b5219Ssinsanction else 216aa2b5219Ssinsanction dp := ldp << 1 217aa2b5219Ssinsanction } 218aa2b5219Ssinsanction } 219aa2b5219Ssinsanction 220aa2b5219Ssinsanction for (i <- 0 until params.numRegSrc) { 221aa2b5219Ssinsanction enqDelaySrcState(i) := entryReg.status.srcState(i) | enqDelaySrcWakeUpByWB(i) | enqDelaySrcWakeUpByIQ(i) 222aa2b5219Ssinsanction enqDelayDataSources(i).value := Mux(enqDelaySrcWakeUpByIQ(i).asBool, DataSource.bypass, DataSource.reg) 223aa2b5219Ssinsanction if (params.hasIQWakeUp) { 224aa2b5219Ssinsanction val wakeUpValid = enqDelaySrcWakeUpByIQVec(i).asUInt.orR 225aa2b5219Ssinsanction val wakeUpOH = enqDelaySrcWakeUpByIQVec(i) 226*acf41503Ssinsanction enqDelaySrcWakeUpL1ExuOH.get(i) := Mux1H(wakeUpOH, params.wakeUpSourceExuIdx.map(x => MathUtils.IntToOH(x).U(backendParams.numExu.W)).toSeq) 227aa2b5219Ssinsanction enqDelaySrcTimer.get(i) := Mux(wakeUpValid, 2.U, 3.U) 22813551487SzhanglyGit enqDelaySrcLoadDependency.get(i) := Mux(wakeUpValid, Mux1H(wakeUpOH, enqDelayShiftedWakeupLoadDependencyByIQVec), entryReg.status.srcLoadDependency.get(i)) 229aa2b5219Ssinsanction } 230aa2b5219Ssinsanction } 231aa2b5219Ssinsanction currentStatus := entryReg.status 232aa2b5219Ssinsanction when (enqDelayValidReg) { 233aa2b5219Ssinsanction currentStatus.srcState := enqDelaySrcState 234aa2b5219Ssinsanction currentStatus.dataSources := enqDelayDataSources 235aa2b5219Ssinsanction currentStatus.srcTimer.foreach(_ := enqDelaySrcTimer.get) 236aa2b5219Ssinsanction currentStatus.srcLoadDependency.foreach(_ := enqDelaySrcLoadDependency.get) 237aa2b5219Ssinsanction } 238aa2b5219Ssinsanction 239*acf41503Ssinsanction if (params.hasIQWakeUp) { 240*acf41503Ssinsanction currentStatus.srcWakeUpL1ExuOH.get.zip(entryReg.status.srcWakeUpL1ExuOH.get).zip(enqDelaySrcWakeUpL1ExuOH.get).foreach { 241*acf41503Ssinsanction case ((currExuOH, regExuOH), enqDelayExuOH) => 242*acf41503Ssinsanction currExuOH := 0.U.asTypeOf(currExuOH) 243*acf41503Ssinsanction params.wakeUpSourceExuIdx.foreach(x => currExuOH(x) := Mux(enqDelayValidReg, enqDelayExuOH(x), regExuOH(x))) 244*acf41503Ssinsanction } 245*acf41503Ssinsanction } 246*acf41503Ssinsanction 2475db4956bSzhanglyGit //entryUpdate 248aa2b5219Ssinsanction entryUpdate.status.srcState.zip(currentStatus.srcState).zip(srcWakeUp).zipWithIndex.foreach { case (((stateNext, state), wakeup), srcIdx) => 2495db4956bSzhanglyGit val cancel = srcCancelVec.map(_ (srcIdx)).getOrElse(false.B) 2505db4956bSzhanglyGit stateNext := Mux(cancel, false.B, wakeup | state) 25189740385Ssinsanction if (params.hasIQWakeUp) { 25289740385Ssinsanction cancelVec.get(srcIdx) := cancel 25389740385Ssinsanction } 2545db4956bSzhanglyGit } 255aa2b5219Ssinsanction entryUpdate.status.dataSources.zip(srcWakeUpByIQVec).foreach { 256aa2b5219Ssinsanction case (dataSourceNext: DataSource, wakeUpByIQOH: Vec[Bool]) => 2575db4956bSzhanglyGit when(wakeUpByIQOH.asUInt.orR) { 2585db4956bSzhanglyGit dataSourceNext.value := DataSource.bypass 2595db4956bSzhanglyGit }.otherwise { 2605db4956bSzhanglyGit dataSourceNext.value := DataSource.reg 2615db4956bSzhanglyGit } 2625db4956bSzhanglyGit } 2635db4956bSzhanglyGit if (params.hasIQWakeUp) { 2640f55a0d3SHaojin Tang entryUpdate.status.srcWakeUpL1ExuOH.get.zip(srcWakeUpByIQVec).zip(srcWakeUp).zipWithIndex.foreach { 2657a96cc7fSHaojin Tang case (((exuOH: UInt, wakeUpByIQOH: Vec[Bool]), wakeUp: Bool), srcIdx) => 266*acf41503Ssinsanction val origExuOH = 0.U.asTypeOf(exuOH) 2675db4956bSzhanglyGit when(wakeUpByIQOH.asUInt.orR) { 268*acf41503Ssinsanction origExuOH := Mux1H(wakeUpByIQOH, params.wakeUpSourceExuIdx.toSeq.map(x => MathUtils.IntToOH(x).U(backendParams.numExu.W))) 2690f55a0d3SHaojin Tang }.elsewhen(wakeUp) { 270*acf41503Ssinsanction origExuOH := 0.U.asTypeOf(origExuOH) 2715db4956bSzhanglyGit }.otherwise { 272*acf41503Ssinsanction origExuOH := currentStatus.srcWakeUpL1ExuOH.get(srcIdx) 2735db4956bSzhanglyGit } 274*acf41503Ssinsanction exuOH := 0.U.asTypeOf(exuOH) 275*acf41503Ssinsanction params.wakeUpSourceExuIdx.foreach(x => exuOH(x) := origExuOH(x)) 2765db4956bSzhanglyGit } 277af4bd265SzhanglyGit srcWakeUpL1ExuOHOut.get.zip(srcWakeUpByIQWithoutCancel).zip(srcWakeUp).zipWithIndex.foreach { 278af4bd265SzhanglyGit case (((exuOH: UInt, wakeUpByIQOH: Vec[Bool]), wakeUp: Bool), srcIdx) => 279*acf41503Ssinsanction val origExuOH = 0.U.asTypeOf(exuOH) 280af4bd265SzhanglyGit when(wakeUpByIQOH.asUInt.orR) { 281*acf41503Ssinsanction origExuOH := Mux1H(wakeUpByIQOH, params.wakeUpSourceExuIdx.map(x => MathUtils.IntToOH(x).U(backendParams.numExu.W)).toSeq) 282af4bd265SzhanglyGit }.otherwise { 283*acf41503Ssinsanction origExuOH := currentStatus.srcWakeUpL1ExuOH.get(srcIdx) 284af4bd265SzhanglyGit } 285*acf41503Ssinsanction exuOH := 0.U.asTypeOf(exuOH) 286*acf41503Ssinsanction params.wakeUpSourceExuIdx.foreach(x => exuOH(x) := origExuOH(x)) 287af4bd265SzhanglyGit } 288aa2b5219Ssinsanction entryUpdate.status.srcTimer.get.zip(currentStatus.srcTimer.get).zip(srcWakeUpByIQVec).zipWithIndex.foreach { 2895db4956bSzhanglyGit case (((srcIssuedTimerNext, srcIssuedTimer), wakeUpByIQOH: Vec[Bool]), srcIdx) => 290af4bd265SzhanglyGit srcIssuedTimerNext := MuxCase(3.U, Seq( 2915db4956bSzhanglyGit // T0: waked up by IQ, T1: reset timer as 1 292af4bd265SzhanglyGit wakeUpByIQOH.asUInt.orR -> 2.U, 2935db4956bSzhanglyGit // do not overflow 2945db4956bSzhanglyGit srcIssuedTimer.andR -> srcIssuedTimer, 2950f55a0d3SHaojin Tang // T2+: increase if the entry is valid, the src is ready, and the src is woken up by iq 296aa2b5219Ssinsanction (validReg && SrcState.isReady(currentStatus.srcState(srcIdx)) && currentStatus.srcWakeUpL1ExuOH.get.asUInt.orR) -> (srcIssuedTimer + 1.U) 2975db4956bSzhanglyGit )) 2985db4956bSzhanglyGit } 299aa2b5219Ssinsanction entryUpdate.status.srcLoadDependency.get.zip(currentStatus.srcLoadDependency.get).zip(srcWakeUpByIQVec).zip(srcWakeUp).foreach { 3000f55a0d3SHaojin Tang case (((loadDependencyNext, loadDependency), wakeUpByIQVec), wakeup) => 3010f55a0d3SHaojin Tang loadDependencyNext := 3020f55a0d3SHaojin Tang Mux(wakeup, 303e08589a5Ssinsanction Mux1H(wakeUpByIQVec, shiftedWakeupLoadDependencyByIQVec), 3040f55a0d3SHaojin Tang Mux(validReg && loadDependency.asUInt.orR, VecInit(loadDependency.map(i => i(i.getWidth - 2, 0) << 1)), loadDependency) 3050f55a0d3SHaojin Tang ) 3060f55a0d3SHaojin Tang } 307aa2b5219Ssinsanction srcLoadDependencyOut.get.zip(currentStatus.srcLoadDependency.get).zip(srcWakeUpByIQVec).zip(srcWakeUp).foreach { 308af4bd265SzhanglyGit case (((loadDependencyOut, loadDependency), wakeUpByIQVec), wakeup) => 3097cbafe1aSzhanglyGit loadDependencyOut := Mux1H(wakeUpByIQVec, shiftedWakeupLoadDependencyByIQBypassVec) 310af4bd265SzhanglyGit } 3115db4956bSzhanglyGit } 312e08589a5Ssinsanction 3135db4956bSzhanglyGit when(io.deqSel) { 314ea159d42Ssinsanction entryUpdate.status.issueTimer := 0.U 3155db4956bSzhanglyGit entryUpdate.status.deqPortIdx := io.deqPortIdxWrite 3165db4956bSzhanglyGit }.elsewhen(entryReg.status.issued){ 3175db4956bSzhanglyGit entryUpdate.status.issueTimer := entryReg.status.issueTimer + 1.U 3185db4956bSzhanglyGit entryUpdate.status.deqPortIdx := entryReg.status.deqPortIdx 319e08589a5Ssinsanction }.otherwise { 320e08589a5Ssinsanction entryUpdate.status.issueTimer := "b10".U 321e08589a5Ssinsanction entryUpdate.status.deqPortIdx := 0.U 3225db4956bSzhanglyGit } 3235db4956bSzhanglyGit entryUpdate.status.psrc := entryReg.status.psrc 3245db4956bSzhanglyGit entryUpdate.status.srcType := entryReg.status.srcType 3255db4956bSzhanglyGit entryUpdate.status.fuType := entryReg.status.fuType 3265db4956bSzhanglyGit entryUpdate.status.robIdx := entryReg.status.robIdx 327af4bd265SzhanglyGit when(srcLoadCancelVec.map(_.reduce(_ || _)).getOrElse(false.B) || srcWakeUpButCancel.map(_.fold(false.B)(_ || _)).fold(false.B)(_ || _)) { 3280f55a0d3SHaojin Tang entryUpdate.status.issued := false.B 329ea159d42Ssinsanction }.elsewhen(io.deqSel) { 3305db4956bSzhanglyGit entryUpdate.status.issued := true.B 331ea159d42Ssinsanction }.elsewhen(io.issueResp.valid && RSFeedbackType.isBlocked(io.issueResp.bits.respType)) { 3325db4956bSzhanglyGit entryUpdate.status.issued := false.B 333aa2b5219Ssinsanction }.elsewhen(!currentStatus.srcReady) { 334af4bd265SzhanglyGit entryUpdate.status.issued := false.B 335e08589a5Ssinsanction }.otherwise { 336e08589a5Ssinsanction entryUpdate.status.issued := entryReg.status.issued 3375db4956bSzhanglyGit } 3385db4956bSzhanglyGit entryUpdate.status.firstIssue := io.deqSel || entryReg.status.firstIssue 3395db4956bSzhanglyGit entryUpdate.status.blocked := false.B //todo 3405db4956bSzhanglyGit //remain imm and payload 341520f7dacSsinsanction entryUpdate.imm.foreach(_ := entryReg.imm.get) 3425db4956bSzhanglyGit entryUpdate.payload := entryReg.payload 343aa2b5219Ssinsanction 344aa2b5219Ssinsanction //output 345aa2b5219Ssinsanction val canIssue = currentStatus.canIssue && validReg && !srcCancelVec.getOrElse(false.B).asUInt.orR 346af4bd265SzhanglyGit val canIssueBypass = validReg && !entryReg.status.issued && !entryReg.status.blocked && 347aa2b5219Ssinsanction VecInit(currentStatus.srcState.zip(srcWakeUpByIQWithoutCancel).zipWithIndex.map { case ((state, wakeupVec), srcIdx) => 348af4bd265SzhanglyGit val cancel = srcCancelVec.map(_ (srcIdx)).getOrElse(false.B) 349af4bd265SzhanglyGit Mux(cancel, false.B, wakeupVec.asUInt.orR | state) 350af4bd265SzhanglyGit }).asUInt.andR 351aa2b5219Ssinsanction io.dataSource.zip(currentStatus.dataSources).zip(srcWakeUpByIQVec).zip(srcWakeUp).foreach { 352af4bd265SzhanglyGit case (((dataSourceOut: DataSource, dataSource: DataSource), wakeUpByIQOH: Vec[Bool]), wakeUpAll) => 353af4bd265SzhanglyGit when(wakeUpByIQOH.asUInt.orR) { 354af4bd265SzhanglyGit dataSourceOut.value := DataSource.forward 355af4bd265SzhanglyGit }.otherwise { 356af4bd265SzhanglyGit dataSourceOut.value := dataSource.value 357af4bd265SzhanglyGit } 358af4bd265SzhanglyGit } 359af4bd265SzhanglyGit if (params.hasIQWakeUp) { 360aa2b5219Ssinsanction io.srcTimer.get.zip(currentStatus.srcTimer.get).zip(srcWakeUpByIQWithoutCancel).zip(srcWakeUp).foreach { 361af4bd265SzhanglyGit case (((srcTimerOut, srcTimer), wakeUpByIQOH: Vec[Bool]), wakeUpAll) => 362af4bd265SzhanglyGit when(wakeUpByIQOH.asUInt.orR) { 363af4bd265SzhanglyGit srcTimerOut := 1.U 364af4bd265SzhanglyGit }.otherwise { 365af4bd265SzhanglyGit srcTimerOut := srcTimer 366af4bd265SzhanglyGit } 367af4bd265SzhanglyGit } 368aa2b5219Ssinsanction io.srcWakeUpL1ExuOH.get := Mux(canIssueBypass && !canIssue, srcWakeUpL1ExuOHOut.get, currentStatus.srcWakeUpL1ExuOH.get) 369af4bd265SzhanglyGit } 370e08589a5Ssinsanction io.transEntry.valid := validReg && !flushed && !deqSuccess 3715db4956bSzhanglyGit io.transEntry.bits := entryUpdate 37259f958d4SzhanglyGit io.canIssue := (canIssue || canIssueBypass) && !flushed 3735db4956bSzhanglyGit io.clear := clear 3745db4956bSzhanglyGit io.fuType := entryReg.status.fuType 3755db4956bSzhanglyGit io.valid := validReg 3765db4956bSzhanglyGit io.isFirstIssue := !entryReg.status.firstIssue 3775db4956bSzhanglyGit io.entry.valid := validReg 3785db4956bSzhanglyGit io.entry.bits := entryReg 379aa2b5219Ssinsanction io.entry.bits.status := currentStatus 380aa2b5219Ssinsanction io.entry.bits.status.srcLoadDependency.foreach(_ := Mux(canIssueBypass && !canIssue, srcLoadDependencyOut.get, currentStatus.srcLoadDependency.get)) 3815db4956bSzhanglyGit io.robIdx := entryReg.status.robIdx 3822d270511Ssinsanction io.uopIdx.foreach(_ := entryReg.status.uopIdx.get) 383ea159d42Ssinsanction io.issueTimerRead := entryReg.status.issueTimer 384ea159d42Ssinsanction io.deqPortIdxRead := entryReg.status.deqPortIdx 38589740385Ssinsanction io.cancel.foreach(_ := cancelVec.get.asUInt.orR) 3865db4956bSzhanglyGit} 3875db4956bSzhanglyGit 3885db4956bSzhanglyGitclass EnqEntryMem()(implicit p: Parameters, params: IssueBlockParams) extends EnqEntry 3895db4956bSzhanglyGit with HasCircularQueuePtrHelper { 3905db4956bSzhanglyGit val fromMem = io.fromMem.get 3915db4956bSzhanglyGit 3925db4956bSzhanglyGit val memStatus = entryReg.status.mem.get 3935db4956bSzhanglyGit println("memStatus" + memStatus) 3945db4956bSzhanglyGit val memStatusNext = entryRegNext.status.mem.get 3955db4956bSzhanglyGit val memStatusUpdate = entryUpdate.status.mem.get 3965db4956bSzhanglyGit 3975db4956bSzhanglyGit // load cannot be issued before older store, unless meet some condition 3985db4956bSzhanglyGit val blockedByOlderStore = isAfter(memStatusNext.sqIdx, fromMem.stIssuePtr) 3995db4956bSzhanglyGit 4005db4956bSzhanglyGit val deqFailedForStdInvalid = io.issueResp.valid && io.issueResp.bits.respType === RSFeedbackType.dataInvalid 4015db4956bSzhanglyGit 4025db4956bSzhanglyGit val staWaitedReleased = Cat( 40306083203SHaojin Tang fromMem.memWaitUpdateReq.robIdx.map(x => x.valid && x.bits.value === memStatusNext.waitForRobIdx.value) 4045db4956bSzhanglyGit ).orR 4055db4956bSzhanglyGit val stdWaitedReleased = Cat( 40606083203SHaojin Tang fromMem.memWaitUpdateReq.sqIdx.map(x => x.valid && x.bits.value === memStatusNext.waitForSqIdx.value) 4075db4956bSzhanglyGit ).orR 4085db4956bSzhanglyGit val olderStaNotViolate = staWaitedReleased && !memStatusNext.strictWait 4095db4956bSzhanglyGit val olderStdReady = stdWaitedReleased && memStatusNext.waitForStd 4105db4956bSzhanglyGit val waitStd = !olderStdReady 4115db4956bSzhanglyGit val waitSta = !olderStaNotViolate 4125db4956bSzhanglyGit 4135db4956bSzhanglyGit when (io.enq.valid && enqReady) { 4145db4956bSzhanglyGit memStatusNext.waitForSqIdx := io.enq.bits.status.mem.get.waitForSqIdx 4155db4956bSzhanglyGit // update by lfst at dispatch stage 4165db4956bSzhanglyGit memStatusNext.waitForRobIdx := io.enq.bits.status.mem.get.waitForRobIdx 4175db4956bSzhanglyGit // new load inst don't known if it is blocked by store data ahead of it 4185db4956bSzhanglyGit memStatusNext.waitForStd := false.B 4195db4956bSzhanglyGit // update by ssit at rename stage 4205db4956bSzhanglyGit memStatusNext.strictWait := io.enq.bits.status.mem.get.strictWait 4215db4956bSzhanglyGit memStatusNext.sqIdx := io.enq.bits.status.mem.get.sqIdx 4225db4956bSzhanglyGit }.otherwise { 4235db4956bSzhanglyGit memStatusNext := memStatusUpdate 4245db4956bSzhanglyGit } 4255db4956bSzhanglyGit 4265db4956bSzhanglyGit when(deqFailedForStdInvalid) { 4275db4956bSzhanglyGit memStatusUpdate.waitForSqIdx := io.issueResp.bits.dataInvalidSqIdx 4285db4956bSzhanglyGit memStatusUpdate.waitForRobIdx := memStatus.waitForRobIdx 4295db4956bSzhanglyGit memStatusUpdate.waitForStd := true.B 4305db4956bSzhanglyGit memStatusUpdate.strictWait := memStatus.strictWait 4315db4956bSzhanglyGit memStatusUpdate.sqIdx := memStatus.sqIdx 4325db4956bSzhanglyGit }.otherwise { 4335db4956bSzhanglyGit memStatusUpdate := memStatus 4345db4956bSzhanglyGit } 4355db4956bSzhanglyGit 4365db4956bSzhanglyGit val shouldBlock = Mux(io.enq.valid && enqReady, io.enq.bits.status.blocked, entryReg.status.blocked) 4375db4956bSzhanglyGit val blockNotReleased = waitStd || waitSta 4385db4956bSzhanglyGit val respBlock = deqFailedForStdInvalid 4395db4956bSzhanglyGit entryRegNext.status.blocked := shouldBlock && blockNotReleased && blockedByOlderStore || respBlock 4405db4956bSzhanglyGit entryUpdate.status.blocked := shouldBlock && blockNotReleased && blockedByOlderStore || respBlock 4415db4956bSzhanglyGit 4425db4956bSzhanglyGit} 4435db4956bSzhanglyGit 4442d270511Ssinsanctionclass EnqEntryVecMemAddr()(implicit p: Parameters, params: IssueBlockParams) extends EnqEntryMem { 4452d270511Ssinsanction 4462d270511Ssinsanction require(params.isVecMemAddrIQ, "EnqEntryVecMemAddr can only be instance of VecMemAddr IQ") 4472d270511Ssinsanction 4482d270511Ssinsanction val vecMemStatus = entryReg.status.vecMem.get 4492d270511Ssinsanction val vecMemStatusNext = entryRegNext.status.vecMem.get 4502d270511Ssinsanction val vecMemStatusUpdate = entryUpdate.status.vecMem.get 4512d270511Ssinsanction val fromLsq = io.fromLsq.get 4522d270511Ssinsanction 4532d270511Ssinsanction when (io.enq.valid && enqReady) { 4542d270511Ssinsanction vecMemStatusNext.sqIdx := io.enq.bits.status.vecMem.get.sqIdx 4552d270511Ssinsanction vecMemStatusNext.lqIdx := io.enq.bits.status.vecMem.get.lqIdx 4562d270511Ssinsanction }.otherwise { 4572d270511Ssinsanction vecMemStatusNext := vecMemStatusUpdate 4582d270511Ssinsanction } 4592d270511Ssinsanction vecMemStatusUpdate := vecMemStatus 4602d270511Ssinsanction 4612d270511Ssinsanction val isLsqHead = { 46229b863e5Szhanglinjuan // if (params.isVecLdAddrIQ) 46331c1fcd8Szhanglinjuan entryRegNext.status.vecMem.get.lqIdx <= fromLsq.lqDeqPtr && 46429b863e5Szhanglinjuan // else 46531c1fcd8Szhanglinjuan entryRegNext.status.vecMem.get.sqIdx <= fromLsq.sqDeqPtr 4662d270511Ssinsanction } 4672d270511Ssinsanction 4682d270511Ssinsanction entryRegNext.status.blocked := shouldBlock && blockNotReleased && blockedByOlderStore || respBlock || !isLsqHead 4692d270511Ssinsanction entryUpdate.status.blocked := shouldBlock && blockNotReleased && blockedByOlderStore || respBlock || !isLsqHead 47044d24a97SXuan Hu entryUpdate.status.uopIdx.get := entryReg.status.uopIdx.get 4712d270511Ssinsanction} 4722d270511Ssinsanction 4732d270511Ssinsanctionclass EnqEntryVecMemData()(implicit p: Parameters, params: IssueBlockParams) extends EnqEntry 4742d270511Ssinsanction with HasCircularQueuePtrHelper { 4752d270511Ssinsanction 4762d270511Ssinsanction require(params.isVecStDataIQ, "EnqEntryVecMemData can only be instance of VecMemData IQ") 4772d270511Ssinsanction 4782d270511Ssinsanction val vecMemStatus = entryReg.status.vecMem.get 4792d270511Ssinsanction val vecMemStatusNext = entryRegNext.status.vecMem.get 4802d270511Ssinsanction val vecMemStatusUpdate = entryUpdate.status.vecMem.get 4812d270511Ssinsanction val fromLsq = io.fromLsq.get 4822d270511Ssinsanction 4832d270511Ssinsanction when (io.enq.valid && enqReady) { 4842d270511Ssinsanction vecMemStatusNext.sqIdx := io.enq.bits.status.vecMem.get.sqIdx 4852d270511Ssinsanction vecMemStatusNext.lqIdx := io.enq.bits.status.vecMem.get.lqIdx 4862d270511Ssinsanction }.otherwise { 4872d270511Ssinsanction vecMemStatusNext := vecMemStatusUpdate 4882d270511Ssinsanction } 4892d270511Ssinsanction vecMemStatusUpdate := vecMemStatus 4902d270511Ssinsanction 4912d270511Ssinsanction val isLsqHead = entryRegNext.status.vecMem.get.sqIdx.value === fromLsq.sqDeqPtr.value 4922d270511Ssinsanction 4932d270511Ssinsanction entryRegNext.status.blocked := !isLsqHead 4942d270511Ssinsanction entryUpdate.status.blocked := !isLsqHead 49544d24a97SXuan Hu entryUpdate.status.uopIdx.get := entryReg.status.uopIdx.get 4962d270511Ssinsanction} 4972d270511Ssinsanction 4985db4956bSzhanglyGitobject EnqEntry { 4995db4956bSzhanglyGit def apply(implicit p: Parameters, iqParams: IssueBlockParams): EnqEntry = { 5005db4956bSzhanglyGit iqParams.schdType match { 5015db4956bSzhanglyGit case IntScheduler() => new EnqEntry() 5025db4956bSzhanglyGit case MemScheduler() => 50397b279b9SXuan Hu if (iqParams.isLdAddrIQ || iqParams.isStAddrIQ || iqParams.isHyAddrIQ) new EnqEntryMem() 5042d270511Ssinsanction else if (iqParams.isVecMemAddrIQ) new EnqEntryVecMemAddr() 5052d270511Ssinsanction else if (iqParams.isVecStDataIQ) new EnqEntryVecMemData() 5065db4956bSzhanglyGit else new EnqEntry() 5075db4956bSzhanglyGit case VfScheduler() => new EnqEntry() 5085db4956bSzhanglyGit case _ => null 5095db4956bSzhanglyGit } 5105db4956bSzhanglyGit } 5115db4956bSzhanglyGit}