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)) 28*7cbafe1aSzhanglyGit 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) { 164*7cbafe1aSzhanglyGit 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 178af4bd265SzhanglyGit val cancelSel = io.wakeUpFromIQ.map(x => x.bits.exuIdx).map(x => io.og0Cancel(x)) 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 195aa2b5219Ssinsanction val cancelSel = io.enqDelayWakeUpFromIQ.map(x => x.bits.exuIdx).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) 226aa2b5219Ssinsanction enqDelaySrcWakeUpL1ExuOH.get(i) := Mux1H(wakeUpOH, io.enqDelayWakeUpFromIQ.map(x => MathUtils.IntToOH(x.bits.exuIdx).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.srcWakeUpL1ExuOH.foreach(_ := enqDelaySrcWakeUpL1ExuOH.get) 236aa2b5219Ssinsanction currentStatus.srcTimer.foreach(_ := enqDelaySrcTimer.get) 237aa2b5219Ssinsanction currentStatus.srcLoadDependency.foreach(_ := enqDelaySrcLoadDependency.get) 238aa2b5219Ssinsanction } 239aa2b5219Ssinsanction 2405db4956bSzhanglyGit //entryUpdate 241aa2b5219Ssinsanction entryUpdate.status.srcState.zip(currentStatus.srcState).zip(srcWakeUp).zipWithIndex.foreach { case (((stateNext, state), wakeup), srcIdx) => 2425db4956bSzhanglyGit val cancel = srcCancelVec.map(_ (srcIdx)).getOrElse(false.B) 2435db4956bSzhanglyGit stateNext := Mux(cancel, false.B, wakeup | state) 24489740385Ssinsanction if (params.hasIQWakeUp) { 24589740385Ssinsanction cancelVec.get(srcIdx) := cancel 24689740385Ssinsanction } 2475db4956bSzhanglyGit } 248aa2b5219Ssinsanction entryUpdate.status.dataSources.zip(srcWakeUpByIQVec).foreach { 249aa2b5219Ssinsanction case (dataSourceNext: DataSource, wakeUpByIQOH: Vec[Bool]) => 2505db4956bSzhanglyGit when(wakeUpByIQOH.asUInt.orR) { 2515db4956bSzhanglyGit dataSourceNext.value := DataSource.bypass 2525db4956bSzhanglyGit }.otherwise { 2535db4956bSzhanglyGit dataSourceNext.value := DataSource.reg 2545db4956bSzhanglyGit } 2555db4956bSzhanglyGit } 2565db4956bSzhanglyGit if (params.hasIQWakeUp) { 2570f55a0d3SHaojin Tang entryUpdate.status.srcWakeUpL1ExuOH.get.zip(srcWakeUpByIQVec).zip(srcWakeUp).zipWithIndex.foreach { 2587a96cc7fSHaojin Tang case (((exuOH: UInt, wakeUpByIQOH: Vec[Bool]), wakeUp: Bool), srcIdx) => 2595db4956bSzhanglyGit when(wakeUpByIQOH.asUInt.orR) { 2607a96cc7fSHaojin Tang exuOH := Mux1H(wakeUpByIQOH, io.wakeUpFromIQ.toSeq.map(x => MathUtils.IntToOH(x.bits.exuIdx).U(backendParams.numExu.W))) 2610f55a0d3SHaojin Tang }.elsewhen(wakeUp) { 2620f55a0d3SHaojin Tang exuOH := 0.U.asTypeOf(exuOH) 2635db4956bSzhanglyGit }.otherwise { 264aa2b5219Ssinsanction exuOH := currentStatus.srcWakeUpL1ExuOH.get(srcIdx) 2655db4956bSzhanglyGit } 2665db4956bSzhanglyGit } 267af4bd265SzhanglyGit srcWakeUpL1ExuOHOut.get.zip(srcWakeUpByIQWithoutCancel).zip(srcWakeUp).zipWithIndex.foreach { 268af4bd265SzhanglyGit case (((exuOH: UInt, wakeUpByIQOH: Vec[Bool]), wakeUp: Bool), srcIdx) => 269af4bd265SzhanglyGit when(wakeUpByIQOH.asUInt.orR) { 270af4bd265SzhanglyGit exuOH := Mux1H(wakeUpByIQOH, io.wakeUpFromIQ.map(x => MathUtils.IntToOH(x.bits.exuIdx).U(backendParams.numExu.W)).toSeq) 271af4bd265SzhanglyGit }.otherwise { 272aa2b5219Ssinsanction exuOH := currentStatus.srcWakeUpL1ExuOH.get(srcIdx) 273af4bd265SzhanglyGit } 274af4bd265SzhanglyGit } 275aa2b5219Ssinsanction entryUpdate.status.srcTimer.get.zip(currentStatus.srcTimer.get).zip(srcWakeUpByIQVec).zipWithIndex.foreach { 2765db4956bSzhanglyGit case (((srcIssuedTimerNext, srcIssuedTimer), wakeUpByIQOH: Vec[Bool]), srcIdx) => 277af4bd265SzhanglyGit srcIssuedTimerNext := MuxCase(3.U, Seq( 2785db4956bSzhanglyGit // T0: waked up by IQ, T1: reset timer as 1 279af4bd265SzhanglyGit wakeUpByIQOH.asUInt.orR -> 2.U, 2805db4956bSzhanglyGit // do not overflow 2815db4956bSzhanglyGit srcIssuedTimer.andR -> srcIssuedTimer, 2820f55a0d3SHaojin Tang // T2+: increase if the entry is valid, the src is ready, and the src is woken up by iq 283aa2b5219Ssinsanction (validReg && SrcState.isReady(currentStatus.srcState(srcIdx)) && currentStatus.srcWakeUpL1ExuOH.get.asUInt.orR) -> (srcIssuedTimer + 1.U) 2845db4956bSzhanglyGit )) 2855db4956bSzhanglyGit } 286aa2b5219Ssinsanction entryUpdate.status.srcLoadDependency.get.zip(currentStatus.srcLoadDependency.get).zip(srcWakeUpByIQVec).zip(srcWakeUp).foreach { 2870f55a0d3SHaojin Tang case (((loadDependencyNext, loadDependency), wakeUpByIQVec), wakeup) => 2880f55a0d3SHaojin Tang loadDependencyNext := 2890f55a0d3SHaojin Tang Mux(wakeup, 290e08589a5Ssinsanction Mux1H(wakeUpByIQVec, shiftedWakeupLoadDependencyByIQVec), 2910f55a0d3SHaojin Tang Mux(validReg && loadDependency.asUInt.orR, VecInit(loadDependency.map(i => i(i.getWidth - 2, 0) << 1)), loadDependency) 2920f55a0d3SHaojin Tang ) 2930f55a0d3SHaojin Tang } 294aa2b5219Ssinsanction srcLoadDependencyOut.get.zip(currentStatus.srcLoadDependency.get).zip(srcWakeUpByIQVec).zip(srcWakeUp).foreach { 295af4bd265SzhanglyGit case (((loadDependencyOut, loadDependency), wakeUpByIQVec), wakeup) => 296*7cbafe1aSzhanglyGit loadDependencyOut := Mux1H(wakeUpByIQVec, shiftedWakeupLoadDependencyByIQBypassVec) 297af4bd265SzhanglyGit } 2985db4956bSzhanglyGit } 299e08589a5Ssinsanction 3005db4956bSzhanglyGit when(io.deqSel) { 301ea159d42Ssinsanction entryUpdate.status.issueTimer := 0.U 3025db4956bSzhanglyGit entryUpdate.status.deqPortIdx := io.deqPortIdxWrite 3035db4956bSzhanglyGit }.elsewhen(entryReg.status.issued){ 3045db4956bSzhanglyGit entryUpdate.status.issueTimer := entryReg.status.issueTimer + 1.U 3055db4956bSzhanglyGit entryUpdate.status.deqPortIdx := entryReg.status.deqPortIdx 306e08589a5Ssinsanction }.otherwise { 307e08589a5Ssinsanction entryUpdate.status.issueTimer := "b10".U 308e08589a5Ssinsanction entryUpdate.status.deqPortIdx := 0.U 3095db4956bSzhanglyGit } 3105db4956bSzhanglyGit entryUpdate.status.psrc := entryReg.status.psrc 3115db4956bSzhanglyGit entryUpdate.status.srcType := entryReg.status.srcType 3125db4956bSzhanglyGit entryUpdate.status.fuType := entryReg.status.fuType 3135db4956bSzhanglyGit entryUpdate.status.robIdx := entryReg.status.robIdx 314af4bd265SzhanglyGit when(srcLoadCancelVec.map(_.reduce(_ || _)).getOrElse(false.B) || srcWakeUpButCancel.map(_.fold(false.B)(_ || _)).fold(false.B)(_ || _)) { 3150f55a0d3SHaojin Tang entryUpdate.status.issued := false.B 316ea159d42Ssinsanction }.elsewhen(io.deqSel) { 3175db4956bSzhanglyGit entryUpdate.status.issued := true.B 318ea159d42Ssinsanction }.elsewhen(io.issueResp.valid && RSFeedbackType.isBlocked(io.issueResp.bits.respType)) { 3195db4956bSzhanglyGit entryUpdate.status.issued := false.B 320aa2b5219Ssinsanction }.elsewhen(!currentStatus.srcReady) { 321af4bd265SzhanglyGit entryUpdate.status.issued := false.B 322e08589a5Ssinsanction }.otherwise { 323e08589a5Ssinsanction entryUpdate.status.issued := entryReg.status.issued 3245db4956bSzhanglyGit } 3255db4956bSzhanglyGit entryUpdate.status.firstIssue := io.deqSel || entryReg.status.firstIssue 3265db4956bSzhanglyGit entryUpdate.status.blocked := false.B //todo 3275db4956bSzhanglyGit //remain imm and payload 328520f7dacSsinsanction entryUpdate.imm.foreach(_ := entryReg.imm.get) 3295db4956bSzhanglyGit entryUpdate.payload := entryReg.payload 330aa2b5219Ssinsanction 331aa2b5219Ssinsanction //output 332aa2b5219Ssinsanction val canIssue = currentStatus.canIssue && validReg && !srcCancelVec.getOrElse(false.B).asUInt.orR 333af4bd265SzhanglyGit val canIssueBypass = validReg && !entryReg.status.issued && !entryReg.status.blocked && 334aa2b5219Ssinsanction VecInit(currentStatus.srcState.zip(srcWakeUpByIQWithoutCancel).zipWithIndex.map { case ((state, wakeupVec), srcIdx) => 335af4bd265SzhanglyGit val cancel = srcCancelVec.map(_ (srcIdx)).getOrElse(false.B) 336af4bd265SzhanglyGit Mux(cancel, false.B, wakeupVec.asUInt.orR | state) 337af4bd265SzhanglyGit }).asUInt.andR 338aa2b5219Ssinsanction io.dataSource.zip(currentStatus.dataSources).zip(srcWakeUpByIQVec).zip(srcWakeUp).foreach { 339af4bd265SzhanglyGit case (((dataSourceOut: DataSource, dataSource: DataSource), wakeUpByIQOH: Vec[Bool]), wakeUpAll) => 340af4bd265SzhanglyGit when(wakeUpByIQOH.asUInt.orR) { 341af4bd265SzhanglyGit dataSourceOut.value := DataSource.forward 342af4bd265SzhanglyGit }.otherwise { 343af4bd265SzhanglyGit dataSourceOut.value := dataSource.value 344af4bd265SzhanglyGit } 345af4bd265SzhanglyGit } 346af4bd265SzhanglyGit if (params.hasIQWakeUp) { 347aa2b5219Ssinsanction io.srcTimer.get.zip(currentStatus.srcTimer.get).zip(srcWakeUpByIQWithoutCancel).zip(srcWakeUp).foreach { 348af4bd265SzhanglyGit case (((srcTimerOut, srcTimer), wakeUpByIQOH: Vec[Bool]), wakeUpAll) => 349af4bd265SzhanglyGit when(wakeUpByIQOH.asUInt.orR) { 350af4bd265SzhanglyGit srcTimerOut := 1.U 351af4bd265SzhanglyGit }.otherwise { 352af4bd265SzhanglyGit srcTimerOut := srcTimer 353af4bd265SzhanglyGit } 354af4bd265SzhanglyGit } 355aa2b5219Ssinsanction io.srcWakeUpL1ExuOH.get := Mux(canIssueBypass && !canIssue, srcWakeUpL1ExuOHOut.get, currentStatus.srcWakeUpL1ExuOH.get) 356af4bd265SzhanglyGit } 357e08589a5Ssinsanction io.transEntry.valid := validReg && !flushed && !deqSuccess 3585db4956bSzhanglyGit io.transEntry.bits := entryUpdate 35959f958d4SzhanglyGit io.canIssue := (canIssue || canIssueBypass) && !flushed 3605db4956bSzhanglyGit io.clear := clear 3615db4956bSzhanglyGit io.fuType := entryReg.status.fuType 3625db4956bSzhanglyGit io.valid := validReg 3635db4956bSzhanglyGit io.isFirstIssue := !entryReg.status.firstIssue 3645db4956bSzhanglyGit io.entry.valid := validReg 3655db4956bSzhanglyGit io.entry.bits := entryReg 366aa2b5219Ssinsanction io.entry.bits.status := currentStatus 367aa2b5219Ssinsanction io.entry.bits.status.srcLoadDependency.foreach(_ := Mux(canIssueBypass && !canIssue, srcLoadDependencyOut.get, currentStatus.srcLoadDependency.get)) 3685db4956bSzhanglyGit io.robIdx := entryReg.status.robIdx 3692d270511Ssinsanction io.uopIdx.foreach(_ := entryReg.status.uopIdx.get) 370ea159d42Ssinsanction io.issueTimerRead := entryReg.status.issueTimer 371ea159d42Ssinsanction io.deqPortIdxRead := entryReg.status.deqPortIdx 37289740385Ssinsanction io.cancel.foreach(_ := cancelVec.get.asUInt.orR) 3735db4956bSzhanglyGit} 3745db4956bSzhanglyGit 3755db4956bSzhanglyGitclass EnqEntryMem()(implicit p: Parameters, params: IssueBlockParams) extends EnqEntry 3765db4956bSzhanglyGit with HasCircularQueuePtrHelper { 3775db4956bSzhanglyGit val fromMem = io.fromMem.get 3785db4956bSzhanglyGit 3795db4956bSzhanglyGit val memStatus = entryReg.status.mem.get 3805db4956bSzhanglyGit println("memStatus" + memStatus) 3815db4956bSzhanglyGit val memStatusNext = entryRegNext.status.mem.get 3825db4956bSzhanglyGit val memStatusUpdate = entryUpdate.status.mem.get 3835db4956bSzhanglyGit 3845db4956bSzhanglyGit // load cannot be issued before older store, unless meet some condition 3855db4956bSzhanglyGit val blockedByOlderStore = isAfter(memStatusNext.sqIdx, fromMem.stIssuePtr) 3865db4956bSzhanglyGit 3875db4956bSzhanglyGit val deqFailedForStdInvalid = io.issueResp.valid && io.issueResp.bits.respType === RSFeedbackType.dataInvalid 3885db4956bSzhanglyGit 3895db4956bSzhanglyGit val staWaitedReleased = Cat( 39006083203SHaojin Tang fromMem.memWaitUpdateReq.robIdx.map(x => x.valid && x.bits.value === memStatusNext.waitForRobIdx.value) 3915db4956bSzhanglyGit ).orR 3925db4956bSzhanglyGit val stdWaitedReleased = Cat( 39306083203SHaojin Tang fromMem.memWaitUpdateReq.sqIdx.map(x => x.valid && x.bits.value === memStatusNext.waitForSqIdx.value) 3945db4956bSzhanglyGit ).orR 3955db4956bSzhanglyGit val olderStaNotViolate = staWaitedReleased && !memStatusNext.strictWait 3965db4956bSzhanglyGit val olderStdReady = stdWaitedReleased && memStatusNext.waitForStd 3975db4956bSzhanglyGit val waitStd = !olderStdReady 3985db4956bSzhanglyGit val waitSta = !olderStaNotViolate 3995db4956bSzhanglyGit 4005db4956bSzhanglyGit when (io.enq.valid && enqReady) { 4015db4956bSzhanglyGit memStatusNext.waitForSqIdx := io.enq.bits.status.mem.get.waitForSqIdx 4025db4956bSzhanglyGit // update by lfst at dispatch stage 4035db4956bSzhanglyGit memStatusNext.waitForRobIdx := io.enq.bits.status.mem.get.waitForRobIdx 4045db4956bSzhanglyGit // new load inst don't known if it is blocked by store data ahead of it 4055db4956bSzhanglyGit memStatusNext.waitForStd := false.B 4065db4956bSzhanglyGit // update by ssit at rename stage 4075db4956bSzhanglyGit memStatusNext.strictWait := io.enq.bits.status.mem.get.strictWait 4085db4956bSzhanglyGit memStatusNext.sqIdx := io.enq.bits.status.mem.get.sqIdx 4095db4956bSzhanglyGit }.otherwise { 4105db4956bSzhanglyGit memStatusNext := memStatusUpdate 4115db4956bSzhanglyGit } 4125db4956bSzhanglyGit 4135db4956bSzhanglyGit when(deqFailedForStdInvalid) { 4145db4956bSzhanglyGit memStatusUpdate.waitForSqIdx := io.issueResp.bits.dataInvalidSqIdx 4155db4956bSzhanglyGit memStatusUpdate.waitForRobIdx := memStatus.waitForRobIdx 4165db4956bSzhanglyGit memStatusUpdate.waitForStd := true.B 4175db4956bSzhanglyGit memStatusUpdate.strictWait := memStatus.strictWait 4185db4956bSzhanglyGit memStatusUpdate.sqIdx := memStatus.sqIdx 4195db4956bSzhanglyGit }.otherwise { 4205db4956bSzhanglyGit memStatusUpdate := memStatus 4215db4956bSzhanglyGit } 4225db4956bSzhanglyGit 4235db4956bSzhanglyGit val shouldBlock = Mux(io.enq.valid && enqReady, io.enq.bits.status.blocked, entryReg.status.blocked) 4245db4956bSzhanglyGit val blockNotReleased = waitStd || waitSta 4255db4956bSzhanglyGit val respBlock = deqFailedForStdInvalid 4265db4956bSzhanglyGit entryRegNext.status.blocked := shouldBlock && blockNotReleased && blockedByOlderStore || respBlock 4275db4956bSzhanglyGit entryUpdate.status.blocked := shouldBlock && blockNotReleased && blockedByOlderStore || respBlock 4285db4956bSzhanglyGit 4295db4956bSzhanglyGit} 4305db4956bSzhanglyGit 4312d270511Ssinsanctionclass EnqEntryVecMemAddr()(implicit p: Parameters, params: IssueBlockParams) extends EnqEntryMem { 4322d270511Ssinsanction 4332d270511Ssinsanction require(params.isVecMemAddrIQ, "EnqEntryVecMemAddr can only be instance of VecMemAddr IQ") 4342d270511Ssinsanction 4352d270511Ssinsanction val vecMemStatus = entryReg.status.vecMem.get 4362d270511Ssinsanction val vecMemStatusNext = entryRegNext.status.vecMem.get 4372d270511Ssinsanction val vecMemStatusUpdate = entryUpdate.status.vecMem.get 4382d270511Ssinsanction val fromLsq = io.fromLsq.get 4392d270511Ssinsanction 4402d270511Ssinsanction when (io.enq.valid && enqReady) { 4412d270511Ssinsanction vecMemStatusNext.sqIdx := io.enq.bits.status.vecMem.get.sqIdx 4422d270511Ssinsanction vecMemStatusNext.lqIdx := io.enq.bits.status.vecMem.get.lqIdx 4432d270511Ssinsanction }.otherwise { 4442d270511Ssinsanction vecMemStatusNext := vecMemStatusUpdate 4452d270511Ssinsanction } 4462d270511Ssinsanction vecMemStatusUpdate := vecMemStatus 4472d270511Ssinsanction 4482d270511Ssinsanction val isLsqHead = { 44929b863e5Szhanglinjuan // if (params.isVecLdAddrIQ) 45031c1fcd8Szhanglinjuan entryRegNext.status.vecMem.get.lqIdx <= fromLsq.lqDeqPtr && 45129b863e5Szhanglinjuan // else 45231c1fcd8Szhanglinjuan entryRegNext.status.vecMem.get.sqIdx <= fromLsq.sqDeqPtr 4532d270511Ssinsanction } 4542d270511Ssinsanction 4552d270511Ssinsanction entryRegNext.status.blocked := shouldBlock && blockNotReleased && blockedByOlderStore || respBlock || !isLsqHead 4562d270511Ssinsanction entryUpdate.status.blocked := shouldBlock && blockNotReleased && blockedByOlderStore || respBlock || !isLsqHead 4572d270511Ssinsanction} 4582d270511Ssinsanction 4592d270511Ssinsanctionclass EnqEntryVecMemData()(implicit p: Parameters, params: IssueBlockParams) extends EnqEntry 4602d270511Ssinsanction with HasCircularQueuePtrHelper { 4612d270511Ssinsanction 4622d270511Ssinsanction require(params.isVecStDataIQ, "EnqEntryVecMemData can only be instance of VecMemData IQ") 4632d270511Ssinsanction 4642d270511Ssinsanction val vecMemStatus = entryReg.status.vecMem.get 4652d270511Ssinsanction val vecMemStatusNext = entryRegNext.status.vecMem.get 4662d270511Ssinsanction val vecMemStatusUpdate = entryUpdate.status.vecMem.get 4672d270511Ssinsanction val fromLsq = io.fromLsq.get 4682d270511Ssinsanction 4692d270511Ssinsanction when (io.enq.valid && enqReady) { 4702d270511Ssinsanction vecMemStatusNext.sqIdx := io.enq.bits.status.vecMem.get.sqIdx 4712d270511Ssinsanction vecMemStatusNext.lqIdx := io.enq.bits.status.vecMem.get.lqIdx 4722d270511Ssinsanction }.otherwise { 4732d270511Ssinsanction vecMemStatusNext := vecMemStatusUpdate 4742d270511Ssinsanction } 4752d270511Ssinsanction vecMemStatusUpdate := vecMemStatus 4762d270511Ssinsanction 4772d270511Ssinsanction val isLsqHead = entryRegNext.status.vecMem.get.sqIdx.value === fromLsq.sqDeqPtr.value 4782d270511Ssinsanction 4792d270511Ssinsanction entryRegNext.status.blocked := !isLsqHead 4802d270511Ssinsanction entryUpdate.status.blocked := !isLsqHead 4812d270511Ssinsanction} 4822d270511Ssinsanction 4835db4956bSzhanglyGitobject EnqEntry { 4845db4956bSzhanglyGit def apply(implicit p: Parameters, iqParams: IssueBlockParams): EnqEntry = { 4855db4956bSzhanglyGit iqParams.schdType match { 4865db4956bSzhanglyGit case IntScheduler() => new EnqEntry() 4875db4956bSzhanglyGit case MemScheduler() => 48897b279b9SXuan Hu if (iqParams.isLdAddrIQ || iqParams.isStAddrIQ || iqParams.isHyAddrIQ) new EnqEntryMem() 4892d270511Ssinsanction else if (iqParams.isVecMemAddrIQ) new EnqEntryVecMemAddr() 4902d270511Ssinsanction else if (iqParams.isVecStDataIQ) new EnqEntryVecMemData() 4915db4956bSzhanglyGit else new EnqEntry() 4925db4956bSzhanglyGit case VfScheduler() => new EnqEntry() 4935db4956bSzhanglyGit case _ => null 4945db4956bSzhanglyGit } 4955db4956bSzhanglyGit } 4965db4956bSzhanglyGit}