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)) 25*aa2b5219Ssinsanction val enqDelayWakeUpFromWB: MixedVec[ValidIO[IssueQueueWBWakeUpBundle]] = Flipped(params.genWBWakeUpSinkValidBundle) 26*aa2b5219Ssinsanction val enqDelayWakeUpFromIQ: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpSinkValidBundle) 27*aa2b5219Ssinsanction val enqDelayOg0Cancel = Input(ExuOH(backendParams.numExu)) 28*aa2b5219Ssinsanction val enqDelayLdCancel = Vec(backendParams.LduCnt, 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) 69*aa2b5219Ssinsanction val enqDelayValidReg = RegInit(false.B) 705db4956bSzhanglyGit 715db4956bSzhanglyGit val validRegNext = Wire(Bool()) 725db4956bSzhanglyGit val entryRegNext = Wire(new EntryBundle) 735db4956bSzhanglyGit val entryUpdate = Wire(new EntryBundle) 74*aa2b5219Ssinsanction 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 93*aa2b5219Ssinsanction val currentStatus = Wire(new Status()) 94*aa2b5219Ssinsanction val enqDelaySrcState = Wire(Vec(params.numRegSrc, SrcState())) 95*aa2b5219Ssinsanction val enqDelayDataSources = Wire(Vec(params.numRegSrc, DataSource())) 96*aa2b5219Ssinsanction val enqDelaySrcWakeUpL1ExuOH = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numRegSrc, ExuOH()))) 97*aa2b5219Ssinsanction val enqDelaySrcTimer = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numRegSrc, UInt(3.W)))) 98*aa2b5219Ssinsanction val enqDelaySrcLoadDependency = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numRegSrc, Vec(LoadPipelineWidth, UInt(3.W))))) 99*aa2b5219Ssinsanction 100*aa2b5219Ssinsanction val enqDelaySrcWakeUpByWB: Vec[UInt] = Wire(Vec(params.numRegSrc, SrcState())) 101*aa2b5219Ssinsanction val enqDelaySrcWakeUpByIQ: Vec[UInt] = Wire(Vec(params.numRegSrc, SrcState())) 102*aa2b5219Ssinsanction val enqDelaySrcWakeUpByIQVec: Vec[Vec[Bool]] = Wire(Vec(params.numRegSrc, Vec(params.numWakeupFromIQ, Bool()))) 103*aa2b5219Ssinsanction val enqDelayShiftedWakeupLoadDependencyByIQVec: Vec[Vec[UInt]] = Wire(Vec(params.numWakeupFromIQ, Vec(LoadPipelineWidth, UInt(3.W)))) 104*aa2b5219Ssinsanction 1055db4956bSzhanglyGit //Reg 1065db4956bSzhanglyGit validReg := validRegNext 1075db4956bSzhanglyGit entryReg := entryRegNext 108*aa2b5219Ssinsanction 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 125*aa2b5219Ssinsanction when(io.enq.valid && enqReady) { 126*aa2b5219Ssinsanction enqDelayValidRegNext := true.B 127*aa2b5219Ssinsanction }.otherwise { 128*aa2b5219Ssinsanction enqDelayValidRegNext := false.B 129*aa2b5219Ssinsanction } 130*aa2b5219Ssinsanction 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) 135*aa2b5219Ssinsanction 136*aa2b5219Ssinsanction // 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) => 156*aa2b5219Ssinsanction 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) { 1640f55a0d3SHaojin Tang srcCancelVec.get.zip(srcLoadCancelVec.get).zip(srcWakeUpByIQVec).zipWithIndex.foreach { case (((srcCancel, srcLoadCancel), wakeUpByIQVec), srcIdx) => 1650f55a0d3SHaojin Tang val ldTransCancel = Mux( 1660f55a0d3SHaojin Tang wakeUpByIQVec.asUInt.orR, 1670f55a0d3SHaojin Tang Mux1H(wakeUpByIQVec, wakeupLoadDependencyByIQVec.map(dep => LoadShouldCancel(Some(dep), io.ldCancel))), 1680f55a0d3SHaojin Tang false.B 1690f55a0d3SHaojin Tang ) 170*aa2b5219Ssinsanction srcLoadCancel := LoadShouldCancel(currentStatus.srcLoadDependency.map(_(srcIdx)), io.ldCancel) 171af4bd265SzhanglyGit srcCancel := srcLoadCancel || ldTransCancel 1725db4956bSzhanglyGit } 1735db4956bSzhanglyGit } 1745db4956bSzhanglyGit 1755db4956bSzhanglyGit if (io.wakeUpFromIQ.isEmpty) { 1765db4956bSzhanglyGit srcWakeUpByIQVec := 0.U.asTypeOf(srcWakeUpByIQVec) 1770f55a0d3SHaojin Tang wakeupLoadDependencyByIQVec := 0.U.asTypeOf(wakeupLoadDependencyByIQVec) 1785db4956bSzhanglyGit } else { 1795db4956bSzhanglyGit val wakeupVec: IndexedSeq[IndexedSeq[Bool]] = io.wakeUpFromIQ.map((bundle: ValidIO[IssueQueueIQWakeUpBundle]) => 1805db4956bSzhanglyGit bundle.bits.wakeUp(entryReg.status.psrc zip entryReg.status.srcType, bundle.valid) 18183ba63b3SXuan Hu ).toIndexedSeq.transpose 182af4bd265SzhanglyGit val cancelSel = io.wakeUpFromIQ.map(x => x.bits.exuIdx).map(x => io.og0Cancel(x)) 183af4bd265SzhanglyGit srcWakeUpByIQVec := wakeupVec.map(x => VecInit(x.zip(cancelSel).map { case (wakeup, cancel) => wakeup && !cancel })) 184af4bd265SzhanglyGit srcWakeUpButCancel := wakeupVec.map(x => VecInit(x.zip(cancelSel).map { case (wakeup, cancel) => wakeup && cancel })) 185af4bd265SzhanglyGit srcWakeUpByIQWithoutCancel := wakeupVec.map(x => VecInit(x)) 18683ba63b3SXuan Hu wakeupLoadDependencyByIQVec := io.wakeUpFromIQ.map(_.bits.loadDependency).toSeq 1875db4956bSzhanglyGit } 1885db4956bSzhanglyGit 189*aa2b5219Ssinsanction // enq delay wakeup 190*aa2b5219Ssinsanction enqDelaySrcWakeUpByWB.zipWithIndex.foreach { case (wakeup, i) => 191*aa2b5219Ssinsanction wakeup := io.enqDelayWakeUpFromWB.map(x => x.bits.wakeUp(Seq((entryReg.status.psrc(i), entryReg.status.srcType(i))), x.valid).head 192*aa2b5219Ssinsanction ).reduce(_ || _) 193*aa2b5219Ssinsanction } 194*aa2b5219Ssinsanction 195*aa2b5219Ssinsanction if (params.hasIQWakeUp) { 196*aa2b5219Ssinsanction val wakeupVec: IndexedSeq[IndexedSeq[Bool]] = io.enqDelayWakeUpFromIQ.map( x => 197*aa2b5219Ssinsanction x.bits.wakeUp(entryReg.status.psrc.zip(entryReg.status.srcType), x.valid) 198*aa2b5219Ssinsanction ).toIndexedSeq.transpose 199*aa2b5219Ssinsanction val cancelSel = io.enqDelayWakeUpFromIQ.map(x => x.bits.exuIdx).map(io.enqDelayOg0Cancel(_)) 200*aa2b5219Ssinsanction enqDelaySrcWakeUpByIQVec := wakeupVec.map(x => VecInit(x.zip(cancelSel).map { case (wakeup, cancel) => wakeup && !cancel })) 201*aa2b5219Ssinsanction } else { 202*aa2b5219Ssinsanction enqDelaySrcWakeUpByIQVec := 0.U.asTypeOf(enqDelaySrcWakeUpByIQVec) 203*aa2b5219Ssinsanction } 204*aa2b5219Ssinsanction 205*aa2b5219Ssinsanction if (params.hasIQWakeUp) { 206*aa2b5219Ssinsanction enqDelaySrcWakeUpByIQ.zipWithIndex.foreach { case (wakeup, i) => 207*aa2b5219Ssinsanction val ldTransCancel = Mux1H(enqDelaySrcWakeUpByIQVec(i), io.enqDelayWakeUpFromIQ.map(_.bits.loadDependency).map(dp => LoadShouldCancel(Some(dp), io.enqDelayLdCancel)).toSeq) 208*aa2b5219Ssinsanction wakeup := enqDelaySrcWakeUpByIQVec(i).asUInt.orR && !ldTransCancel 209*aa2b5219Ssinsanction } 210*aa2b5219Ssinsanction } else { 211*aa2b5219Ssinsanction enqDelaySrcWakeUpByIQ := 0.U.asTypeOf(enqDelaySrcWakeUpByIQ) 212*aa2b5219Ssinsanction } 213*aa2b5219Ssinsanction 214*aa2b5219Ssinsanction enqDelayShiftedWakeupLoadDependencyByIQVec.zip(io.enqDelayWakeUpFromIQ.map(_.bits.loadDependency)) 215*aa2b5219Ssinsanction .zip(params.wakeUpInExuSources.map(_.name)).foreach { case ((dps, ldps), name) => 216*aa2b5219Ssinsanction dps.zip(ldps).zipWithIndex.foreach { case ((dp, ldp), deqPortIdx) => 217*aa2b5219Ssinsanction if (params.backendParam.getLdExuIdx(params.backendParam.allExuParams.find(_.name == name).get) == deqPortIdx) 218*aa2b5219Ssinsanction dp := (ldp << 2).asUInt | 2.U 219*aa2b5219Ssinsanction else 220*aa2b5219Ssinsanction dp := ldp << 1 221*aa2b5219Ssinsanction } 222*aa2b5219Ssinsanction } 223*aa2b5219Ssinsanction 224*aa2b5219Ssinsanction for(i <- 0 until params.numRegSrc) { 225*aa2b5219Ssinsanction enqDelaySrcState(i) := entryReg.status.srcState(i) | enqDelaySrcWakeUpByWB(i) | enqDelaySrcWakeUpByIQ(i) 226*aa2b5219Ssinsanction enqDelayDataSources(i).value := Mux(enqDelaySrcWakeUpByIQ(i).asBool, DataSource.bypass, DataSource.reg) 227*aa2b5219Ssinsanction if (params.hasIQWakeUp) { 228*aa2b5219Ssinsanction val wakeUpValid = enqDelaySrcWakeUpByIQVec(i).asUInt.orR 229*aa2b5219Ssinsanction val wakeUpOH = enqDelaySrcWakeUpByIQVec(i) 230*aa2b5219Ssinsanction enqDelaySrcWakeUpL1ExuOH.get(i) := Mux1H(wakeUpOH, io.enqDelayWakeUpFromIQ.map(x => MathUtils.IntToOH(x.bits.exuIdx).U(backendParams.numExu.W)).toSeq) 231*aa2b5219Ssinsanction enqDelaySrcTimer.get(i) := Mux(wakeUpValid, 2.U, 3.U) 232*aa2b5219Ssinsanction enqDelaySrcLoadDependency.get(i) := Mux1H(wakeUpOH, enqDelayShiftedWakeupLoadDependencyByIQVec) 233*aa2b5219Ssinsanction } 234*aa2b5219Ssinsanction } 235*aa2b5219Ssinsanction currentStatus := entryReg.status 236*aa2b5219Ssinsanction when (enqDelayValidReg) { 237*aa2b5219Ssinsanction currentStatus.srcState := enqDelaySrcState 238*aa2b5219Ssinsanction currentStatus.dataSources := enqDelayDataSources 239*aa2b5219Ssinsanction currentStatus.srcWakeUpL1ExuOH.foreach(_ := enqDelaySrcWakeUpL1ExuOH.get) 240*aa2b5219Ssinsanction currentStatus.srcTimer.foreach(_ := enqDelaySrcTimer.get) 241*aa2b5219Ssinsanction currentStatus.srcLoadDependency.foreach(_ := enqDelaySrcLoadDependency.get) 242*aa2b5219Ssinsanction } 243*aa2b5219Ssinsanction 2445db4956bSzhanglyGit //entryUpdate 245*aa2b5219Ssinsanction entryUpdate.status.srcState.zip(currentStatus.srcState).zip(srcWakeUp).zipWithIndex.foreach { case (((stateNext, state), wakeup), srcIdx) => 2465db4956bSzhanglyGit val cancel = srcCancelVec.map(_ (srcIdx)).getOrElse(false.B) 2475db4956bSzhanglyGit stateNext := Mux(cancel, false.B, wakeup | state) 24889740385Ssinsanction if (params.hasIQWakeUp) { 24989740385Ssinsanction cancelVec.get(srcIdx) := cancel 25089740385Ssinsanction } 2515db4956bSzhanglyGit } 252*aa2b5219Ssinsanction entryUpdate.status.dataSources.zip(srcWakeUpByIQVec).foreach { 253*aa2b5219Ssinsanction case (dataSourceNext: DataSource, wakeUpByIQOH: Vec[Bool]) => 2545db4956bSzhanglyGit when(wakeUpByIQOH.asUInt.orR) { 2555db4956bSzhanglyGit dataSourceNext.value := DataSource.bypass 2565db4956bSzhanglyGit }.otherwise { 2575db4956bSzhanglyGit dataSourceNext.value := DataSource.reg 2585db4956bSzhanglyGit } 2595db4956bSzhanglyGit } 2605db4956bSzhanglyGit if (params.hasIQWakeUp) { 2610f55a0d3SHaojin Tang entryUpdate.status.srcWakeUpL1ExuOH.get.zip(srcWakeUpByIQVec).zip(srcWakeUp).zipWithIndex.foreach { 2627a96cc7fSHaojin Tang case (((exuOH: UInt, wakeUpByIQOH: Vec[Bool]), wakeUp: Bool), srcIdx) => 2635db4956bSzhanglyGit when(wakeUpByIQOH.asUInt.orR) { 2647a96cc7fSHaojin Tang exuOH := Mux1H(wakeUpByIQOH, io.wakeUpFromIQ.toSeq.map(x => MathUtils.IntToOH(x.bits.exuIdx).U(backendParams.numExu.W))) 2650f55a0d3SHaojin Tang }.elsewhen(wakeUp) { 2660f55a0d3SHaojin Tang exuOH := 0.U.asTypeOf(exuOH) 2675db4956bSzhanglyGit }.otherwise { 268*aa2b5219Ssinsanction exuOH := currentStatus.srcWakeUpL1ExuOH.get(srcIdx) 2695db4956bSzhanglyGit } 2705db4956bSzhanglyGit } 271af4bd265SzhanglyGit srcWakeUpL1ExuOHOut.get.zip(srcWakeUpByIQWithoutCancel).zip(srcWakeUp).zipWithIndex.foreach { 272af4bd265SzhanglyGit case (((exuOH: UInt, wakeUpByIQOH: Vec[Bool]), wakeUp: Bool), srcIdx) => 273af4bd265SzhanglyGit when(wakeUpByIQOH.asUInt.orR) { 274af4bd265SzhanglyGit exuOH := Mux1H(wakeUpByIQOH, io.wakeUpFromIQ.map(x => MathUtils.IntToOH(x.bits.exuIdx).U(backendParams.numExu.W)).toSeq) 275af4bd265SzhanglyGit }.elsewhen(wakeUp) { 276af4bd265SzhanglyGit exuOH := 0.U.asTypeOf(exuOH) 277af4bd265SzhanglyGit }.otherwise { 278*aa2b5219Ssinsanction exuOH := currentStatus.srcWakeUpL1ExuOH.get(srcIdx) 279af4bd265SzhanglyGit } 280af4bd265SzhanglyGit } 281*aa2b5219Ssinsanction entryUpdate.status.srcTimer.get.zip(currentStatus.srcTimer.get).zip(srcWakeUpByIQVec).zipWithIndex.foreach { 2825db4956bSzhanglyGit case (((srcIssuedTimerNext, srcIssuedTimer), wakeUpByIQOH: Vec[Bool]), srcIdx) => 283af4bd265SzhanglyGit srcIssuedTimerNext := MuxCase(3.U, Seq( 2845db4956bSzhanglyGit // T0: waked up by IQ, T1: reset timer as 1 285af4bd265SzhanglyGit wakeUpByIQOH.asUInt.orR -> 2.U, 2865db4956bSzhanglyGit // do not overflow 2875db4956bSzhanglyGit srcIssuedTimer.andR -> srcIssuedTimer, 2880f55a0d3SHaojin Tang // T2+: increase if the entry is valid, the src is ready, and the src is woken up by iq 289*aa2b5219Ssinsanction (validReg && SrcState.isReady(currentStatus.srcState(srcIdx)) && currentStatus.srcWakeUpL1ExuOH.get.asUInt.orR) -> (srcIssuedTimer + 1.U) 2905db4956bSzhanglyGit )) 2915db4956bSzhanglyGit } 292*aa2b5219Ssinsanction entryUpdate.status.srcLoadDependency.get.zip(currentStatus.srcLoadDependency.get).zip(srcWakeUpByIQVec).zip(srcWakeUp).foreach { 2930f55a0d3SHaojin Tang case (((loadDependencyNext, loadDependency), wakeUpByIQVec), wakeup) => 2940f55a0d3SHaojin Tang loadDependencyNext := 2950f55a0d3SHaojin Tang Mux(wakeup, 2960f55a0d3SHaojin Tang Mux(wakeUpByIQVec.asUInt.orR, Mux1H(wakeUpByIQVec, shiftedWakeupLoadDependencyByIQVec), 0.U.asTypeOf(loadDependency)), 2970f55a0d3SHaojin Tang Mux(validReg && loadDependency.asUInt.orR, VecInit(loadDependency.map(i => i(i.getWidth - 2, 0) << 1)), loadDependency) 2980f55a0d3SHaojin Tang ) 2990f55a0d3SHaojin Tang } 300*aa2b5219Ssinsanction srcLoadDependencyOut.get.zip(currentStatus.srcLoadDependency.get).zip(srcWakeUpByIQVec).zip(srcWakeUp).foreach { 301af4bd265SzhanglyGit case (((loadDependencyOut, loadDependency), wakeUpByIQVec), wakeup) => 302af4bd265SzhanglyGit loadDependencyOut := 303af4bd265SzhanglyGit Mux(wakeup, 304*aa2b5219Ssinsanction Mux1H(wakeUpByIQVec, shiftedWakeupLoadDependencyByIQBypassVec), 305af4bd265SzhanglyGit loadDependency 306af4bd265SzhanglyGit ) 307af4bd265SzhanglyGit } 3085db4956bSzhanglyGit } 309ea159d42Ssinsanction entryUpdate.status.issueTimer := "b10".U //otherwise 3105db4956bSzhanglyGit entryUpdate.status.deqPortIdx := 0.U //otherwise 3115db4956bSzhanglyGit when(io.deqSel) { 312ea159d42Ssinsanction entryUpdate.status.issueTimer := 0.U 3135db4956bSzhanglyGit entryUpdate.status.deqPortIdx := io.deqPortIdxWrite 3145db4956bSzhanglyGit }.elsewhen(entryReg.status.issued){ 3155db4956bSzhanglyGit entryUpdate.status.issueTimer := entryReg.status.issueTimer + 1.U 3165db4956bSzhanglyGit entryUpdate.status.deqPortIdx := entryReg.status.deqPortIdx 3175db4956bSzhanglyGit } 3185db4956bSzhanglyGit entryUpdate.status.psrc := entryReg.status.psrc 3195db4956bSzhanglyGit entryUpdate.status.srcType := entryReg.status.srcType 3205db4956bSzhanglyGit entryUpdate.status.fuType := entryReg.status.fuType 3215db4956bSzhanglyGit entryUpdate.status.robIdx := entryReg.status.robIdx 3222d270511Ssinsanction entryUpdate.status.uopIdx.foreach(_ := entryReg.status.uopIdx.get) 3235db4956bSzhanglyGit entryUpdate.status.issued := entryReg.status.issued // otherwise 324af4bd265SzhanglyGit when(srcLoadCancelVec.map(_.reduce(_ || _)).getOrElse(false.B) || srcWakeUpButCancel.map(_.fold(false.B)(_ || _)).fold(false.B)(_ || _)) { 3250f55a0d3SHaojin Tang entryUpdate.status.issued := false.B 326ea159d42Ssinsanction }.elsewhen(io.deqSel) { 3275db4956bSzhanglyGit entryUpdate.status.issued := true.B 328ea159d42Ssinsanction }.elsewhen(io.issueResp.valid && RSFeedbackType.isBlocked(io.issueResp.bits.respType)) { 3295db4956bSzhanglyGit entryUpdate.status.issued := false.B 330*aa2b5219Ssinsanction }.elsewhen(!currentStatus.srcReady) { 331af4bd265SzhanglyGit entryUpdate.status.issued := false.B 3325db4956bSzhanglyGit } 3335db4956bSzhanglyGit entryUpdate.status.firstIssue := io.deqSel || entryReg.status.firstIssue 3345db4956bSzhanglyGit entryUpdate.status.blocked := false.B //todo 3355db4956bSzhanglyGit //remain imm and payload 3365db4956bSzhanglyGit entryUpdate.imm := entryReg.imm 3375db4956bSzhanglyGit entryUpdate.payload := entryReg.payload 3385db4956bSzhanglyGit if(params.needPc) { 3395db4956bSzhanglyGit entryUpdate.status.pc.get := entryReg.status.pc.get 3405db4956bSzhanglyGit } 341*aa2b5219Ssinsanction 342*aa2b5219Ssinsanction //output 343*aa2b5219Ssinsanction val canIssue = currentStatus.canIssue && validReg && !srcCancelVec.getOrElse(false.B).asUInt.orR 344af4bd265SzhanglyGit val canIssueBypass = validReg && !entryReg.status.issued && !entryReg.status.blocked && 345*aa2b5219Ssinsanction VecInit(currentStatus.srcState.zip(srcWakeUpByIQWithoutCancel).zipWithIndex.map { case ((state, wakeupVec), srcIdx) => 346af4bd265SzhanglyGit val cancel = srcCancelVec.map(_ (srcIdx)).getOrElse(false.B) 347af4bd265SzhanglyGit Mux(cancel, false.B, wakeupVec.asUInt.orR | state) 348af4bd265SzhanglyGit }).asUInt.andR 349*aa2b5219Ssinsanction io.dataSource.zip(currentStatus.dataSources).zip(srcWakeUpByIQVec).zip(srcWakeUp).foreach { 350af4bd265SzhanglyGit case (((dataSourceOut: DataSource, dataSource: DataSource), wakeUpByIQOH: Vec[Bool]), wakeUpAll) => 351af4bd265SzhanglyGit when(wakeUpByIQOH.asUInt.orR) { 352af4bd265SzhanglyGit dataSourceOut.value := DataSource.forward 353af4bd265SzhanglyGit }.elsewhen(wakeUpAll) { 354af4bd265SzhanglyGit dataSourceOut.value := DataSource.reg 355af4bd265SzhanglyGit }.otherwise { 356af4bd265SzhanglyGit dataSourceOut.value := dataSource.value 357af4bd265SzhanglyGit } 358af4bd265SzhanglyGit } 359af4bd265SzhanglyGit if (params.hasIQWakeUp) { 360*aa2b5219Ssinsanction 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 } 368*aa2b5219Ssinsanction io.srcWakeUpL1ExuOH.get := Mux(canIssueBypass && !canIssue, srcWakeUpL1ExuOHOut.get, currentStatus.srcWakeUpL1ExuOH.get) 369af4bd265SzhanglyGit } 3705db4956bSzhanglyGit io.transEntry.valid := validReg && io.transSel && !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 379*aa2b5219Ssinsanction io.entry.bits.status := currentStatus 380*aa2b5219Ssinsanction 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 4702d270511Ssinsanction} 4712d270511Ssinsanction 4722d270511Ssinsanctionclass EnqEntryVecMemData()(implicit p: Parameters, params: IssueBlockParams) extends EnqEntry 4732d270511Ssinsanction with HasCircularQueuePtrHelper { 4742d270511Ssinsanction 4752d270511Ssinsanction require(params.isVecStDataIQ, "EnqEntryVecMemData can only be instance of VecMemData IQ") 4762d270511Ssinsanction 4772d270511Ssinsanction val vecMemStatus = entryReg.status.vecMem.get 4782d270511Ssinsanction val vecMemStatusNext = entryRegNext.status.vecMem.get 4792d270511Ssinsanction val vecMemStatusUpdate = entryUpdate.status.vecMem.get 4802d270511Ssinsanction val fromLsq = io.fromLsq.get 4812d270511Ssinsanction 4822d270511Ssinsanction when (io.enq.valid && enqReady) { 4832d270511Ssinsanction vecMemStatusNext.sqIdx := io.enq.bits.status.vecMem.get.sqIdx 4842d270511Ssinsanction vecMemStatusNext.lqIdx := io.enq.bits.status.vecMem.get.lqIdx 4852d270511Ssinsanction }.otherwise { 4862d270511Ssinsanction vecMemStatusNext := vecMemStatusUpdate 4872d270511Ssinsanction } 4882d270511Ssinsanction vecMemStatusUpdate := vecMemStatus 4892d270511Ssinsanction 4902d270511Ssinsanction val isLsqHead = entryRegNext.status.vecMem.get.sqIdx.value === fromLsq.sqDeqPtr.value 4912d270511Ssinsanction 4922d270511Ssinsanction entryRegNext.status.blocked := !isLsqHead 4932d270511Ssinsanction entryUpdate.status.blocked := !isLsqHead 4942d270511Ssinsanction} 4952d270511Ssinsanction 4965db4956bSzhanglyGitobject EnqEntry { 4975db4956bSzhanglyGit def apply(implicit p: Parameters, iqParams: IssueBlockParams): EnqEntry = { 4985db4956bSzhanglyGit iqParams.schdType match { 4995db4956bSzhanglyGit case IntScheduler() => new EnqEntry() 5005db4956bSzhanglyGit case MemScheduler() => 50197b279b9SXuan Hu if (iqParams.isLdAddrIQ || iqParams.isStAddrIQ || iqParams.isHyAddrIQ) new EnqEntryMem() 5022d270511Ssinsanction else if (iqParams.isVecMemAddrIQ) new EnqEntryVecMemAddr() 5032d270511Ssinsanction else if (iqParams.isVecStDataIQ) new EnqEntryVecMemData() 5045db4956bSzhanglyGit else new EnqEntry() 5055db4956bSzhanglyGit case VfScheduler() => new EnqEntry() 5065db4956bSzhanglyGit case _ => null 5075db4956bSzhanglyGit } 5085db4956bSzhanglyGit } 5095db4956bSzhanglyGit}