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)) 255db4956bSzhanglyGit val deqSel = Input(Bool()) 265db4956bSzhanglyGit val deqPortIdxWrite = Input(UInt(1.W)) 275db4956bSzhanglyGit val transSel = Input(Bool()) 285db4956bSzhanglyGit val issueResp = Flipped(ValidIO(new EntryDeqRespBundle)) 295db4956bSzhanglyGit //output 305db4956bSzhanglyGit val valid = Output(Bool()) 315db4956bSzhanglyGit val canIssue = Output(Bool()) 325db4956bSzhanglyGit val clear = Output(Bool()) 335db4956bSzhanglyGit val fuType = Output(FuType()) 345db4956bSzhanglyGit val dataSource = Output(Vec(params.numRegSrc, DataSource())) 357a96cc7fSHaojin Tang val srcWakeUpL1ExuOH = OptionWrapper(params.hasIQWakeUp, Output(Vec(params.numRegSrc, ExuOH()))) 365db4956bSzhanglyGit val srcTimer = OptionWrapper(params.hasIQWakeUp, Output(Vec(params.numRegSrc, UInt(3.W)))) 375db4956bSzhanglyGit val transEntry = ValidIO(new EntryBundle) 385db4956bSzhanglyGit val isFirstIssue = Output(Bool()) 395db4956bSzhanglyGit val entry = ValidIO(new EntryBundle) 405db4956bSzhanglyGit val robIdx = Output(new RobPtr) 412d270511Ssinsanction val uopIdx = OptionWrapper(params.isVecMemIQ, Output(UopIdx())) 425db4956bSzhanglyGit val deqPortIdxRead = Output(UInt(1.W)) 435db4956bSzhanglyGit val issueTimerRead = Output(UInt(2.W)) 445db4956bSzhanglyGit // mem only 455db4956bSzhanglyGit val fromMem = if(params.isMemAddrIQ) Some(new Bundle { 465db4956bSzhanglyGit val stIssuePtr = Input(new SqPtr) 475db4956bSzhanglyGit val memWaitUpdateReq = Flipped(new MemWaitUpdateReq) 485db4956bSzhanglyGit }) else None 492d270511Ssinsanction // vector mem only 502d270511Ssinsanction val fromLsq = OptionWrapper(params.isVecMemIQ, new Bundle { 512d270511Ssinsanction val sqDeqPtr = Input(new SqPtr) 522d270511Ssinsanction val lqDeqPtr = Input(new LqPtr) 532d270511Ssinsanction }) 5489740385Ssinsanction // debug 5589740385Ssinsanction val cancel = OptionWrapper(params.hasIQWakeUp, Output(Bool())) 565db4956bSzhanglyGit 575db4956bSzhanglyGit def wakeup = wakeUpFromWB ++ wakeUpFromIQ 585db4956bSzhanglyGit} 595db4956bSzhanglyGit 605db4956bSzhanglyGitclass EnqEntry(implicit p: Parameters, params: IssueBlockParams) extends XSModule { 615db4956bSzhanglyGit val io = IO(new EnqEntryIO) 625db4956bSzhanglyGit 635db4956bSzhanglyGit val validReg = RegInit(false.B) 645db4956bSzhanglyGit val entryReg = Reg(new EntryBundle) 655db4956bSzhanglyGit 665db4956bSzhanglyGit val validRegNext = Wire(Bool()) 675db4956bSzhanglyGit val entryRegNext = Wire(new EntryBundle) 685db4956bSzhanglyGit val entryUpdate = Wire(new EntryBundle) 695db4956bSzhanglyGit val enqReady = Wire(Bool()) 705db4956bSzhanglyGit val clear = Wire(Bool()) 715db4956bSzhanglyGit val flushed = Wire(Bool()) 725db4956bSzhanglyGit val deqSuccess = Wire(Bool()) 735db4956bSzhanglyGit val srcWakeUp = Wire(Vec(params.numRegSrc, Bool())) 74af4bd265SzhanglyGit val srcWakeUpByWB = Wire(Vec(params.numRegSrc, Bool())) 755db4956bSzhanglyGit val srcCancelVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numRegSrc, Bool()))) 760f55a0d3SHaojin Tang val srcLoadCancelVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numRegSrc, Bool()))) 775db4956bSzhanglyGit val srcWakeUpByIQVec = Wire(Vec(params.numRegSrc, Vec(params.numWakeupFromIQ, Bool()))) 78af4bd265SzhanglyGit val srcWakeUpByIQWithoutCancel = Wire(Vec(params.numRegSrc, Vec(params.numWakeupFromIQ, Bool()))) 79af4bd265SzhanglyGit val srcWakeUpButCancel = Wire(Vec(params.numRegSrc, Vec(params.numWakeupFromIQ, Bool()))) 80af4bd265SzhanglyGit val srcWakeUpL1ExuOHOut = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numRegSrc, ExuOH()))) 81af4bd265SzhanglyGit val srcLoadDependencyOut = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numRegSrc, Vec(LoadPipelineWidth, UInt(3.W))))) 820f55a0d3SHaojin Tang val wakeupLoadDependencyByIQVec = Wire(Vec(params.numWakeupFromIQ, Vec(LoadPipelineWidth, UInt(3.W)))) 830f55a0d3SHaojin Tang val shiftedWakeupLoadDependencyByIQVec = Wire(Vec(params.numWakeupFromIQ, Vec(LoadPipelineWidth, UInt(3.W)))) 84af4bd265SzhanglyGit val shiftedWakeupLoadDependencyByIQBypassVec = Wire(Vec(params.numWakeupFromIQ, Vec(LoadPipelineWidth, UInt(3.W)))) 8589740385Ssinsanction val cancelVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numRegSrc, Bool()))) 865db4956bSzhanglyGit 875db4956bSzhanglyGit //Reg 885db4956bSzhanglyGit validReg := validRegNext 895db4956bSzhanglyGit entryReg := entryRegNext 905db4956bSzhanglyGit 915db4956bSzhanglyGit //Wire 925db4956bSzhanglyGit when(io.enq.valid && enqReady) { 935db4956bSzhanglyGit validRegNext := true.B 945db4956bSzhanglyGit }.elsewhen(clear) { 955db4956bSzhanglyGit validRegNext := false.B 965db4956bSzhanglyGit }.otherwise { 975db4956bSzhanglyGit validRegNext := validReg 985db4956bSzhanglyGit } 995db4956bSzhanglyGit 1005db4956bSzhanglyGit when(io.enq.valid && enqReady) { 1015db4956bSzhanglyGit entryRegNext := io.enq.bits 1025db4956bSzhanglyGit }.otherwise { 1035db4956bSzhanglyGit entryRegNext := entryUpdate 1045db4956bSzhanglyGit } 1055db4956bSzhanglyGit 1065db4956bSzhanglyGit enqReady := !validReg || clear 1075db4956bSzhanglyGit clear := flushed || io.transSel || deqSuccess 1085db4956bSzhanglyGit flushed := entryReg.status.robIdx.needFlush(io.flush) 1090f55a0d3SHaojin Tang deqSuccess := io.issueResp.valid && io.issueResp.bits.respType === RSFeedbackType.fuIdle && !srcLoadCancelVec.map(_.reduce(_ || _)).getOrElse(false.B) 110af4bd265SzhanglyGit 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 111af4bd265SzhanglyGit srcWakeUp := srcWakeUpByWB.zip(srcWakeUpByIQVec).map { case (x, y) => x || y.asUInt.orR } 1125db4956bSzhanglyGit 1130f55a0d3SHaojin Tang shiftedWakeupLoadDependencyByIQVec 1140f55a0d3SHaojin Tang .zip(wakeupLoadDependencyByIQVec) 1150f55a0d3SHaojin Tang .zip(params.wakeUpInExuSources.map(_.name)).foreach { 1160f55a0d3SHaojin Tang case ((deps, originalDeps), name) => deps.zip(originalDeps).zipWithIndex.foreach { 1170f55a0d3SHaojin Tang case ((dep, originalDep), deqPortIdx) => 118a9ffe60aSHaojin Tang if (params.backendParam.getLdExuIdx(params.backendParam.allExuParams.find(_.name == name).get) == deqPortIdx) 119af4bd265SzhanglyGit dep := (originalDep << 2).asUInt | 2.U 1200f55a0d3SHaojin Tang else 1210f55a0d3SHaojin Tang dep := originalDep << 1 1220f55a0d3SHaojin Tang } 1230f55a0d3SHaojin Tang } 124af4bd265SzhanglyGit shiftedWakeupLoadDependencyByIQBypassVec 125af4bd265SzhanglyGit .zip(wakeupLoadDependencyByIQVec) 126af4bd265SzhanglyGit .zip(params.wakeUpInExuSources.map(_.name)).foreach { 127af4bd265SzhanglyGit case ((deps, originalDeps), name) => deps.zip(originalDeps).zipWithIndex.foreach { 128af4bd265SzhanglyGit case ((dep, originalDep), deqPortIdx) => 129af4bd265SzhanglyGit if (name.contains("LDU") && name.replace("LDU", "").toInt == deqPortIdx) 130af4bd265SzhanglyGit dep := (originalDep << 1).asUInt | 1.U 131af4bd265SzhanglyGit else 132af4bd265SzhanglyGit dep := originalDep 133af4bd265SzhanglyGit } 134af4bd265SzhanglyGit } 1350f55a0d3SHaojin Tang 1365db4956bSzhanglyGit if (params.hasIQWakeUp) { 1370f55a0d3SHaojin Tang srcCancelVec.get.zip(srcLoadCancelVec.get).zip(srcWakeUpByIQVec).zipWithIndex.foreach { case (((srcCancel, srcLoadCancel), wakeUpByIQVec), srcIdx) => 1380f55a0d3SHaojin Tang val ldTransCancel = Mux( 1390f55a0d3SHaojin Tang wakeUpByIQVec.asUInt.orR, 1400f55a0d3SHaojin Tang Mux1H(wakeUpByIQVec, wakeupLoadDependencyByIQVec.map(dep => LoadShouldCancel(Some(dep), io.ldCancel))), 1410f55a0d3SHaojin Tang false.B 1420f55a0d3SHaojin Tang ) 1430f55a0d3SHaojin Tang srcLoadCancel := LoadShouldCancel(entryReg.status.srcLoadDependency.map(_(srcIdx)), io.ldCancel) 144af4bd265SzhanglyGit srcCancel := srcLoadCancel || ldTransCancel 1455db4956bSzhanglyGit } 1465db4956bSzhanglyGit } 1475db4956bSzhanglyGit 1485db4956bSzhanglyGit if (io.wakeUpFromIQ.isEmpty) { 1495db4956bSzhanglyGit srcWakeUpByIQVec := 0.U.asTypeOf(srcWakeUpByIQVec) 1500f55a0d3SHaojin Tang wakeupLoadDependencyByIQVec := 0.U.asTypeOf(wakeupLoadDependencyByIQVec) 1515db4956bSzhanglyGit } else { 1525db4956bSzhanglyGit val wakeupVec: IndexedSeq[IndexedSeq[Bool]] = io.wakeUpFromIQ.map((bundle: ValidIO[IssueQueueIQWakeUpBundle]) => 1535db4956bSzhanglyGit bundle.bits.wakeUp(entryReg.status.psrc zip entryReg.status.srcType, bundle.valid) 15483ba63b3SXuan Hu ).toIndexedSeq.transpose 155af4bd265SzhanglyGit val cancelSel = io.wakeUpFromIQ.map(x => x.bits.exuIdx).map(x => io.og0Cancel(x)) 156af4bd265SzhanglyGit srcWakeUpByIQVec := wakeupVec.map(x => VecInit(x.zip(cancelSel).map { case (wakeup, cancel) => wakeup && !cancel })) 157af4bd265SzhanglyGit srcWakeUpButCancel := wakeupVec.map(x => VecInit(x.zip(cancelSel).map { case (wakeup, cancel) => wakeup && cancel })) 158af4bd265SzhanglyGit srcWakeUpByIQWithoutCancel := wakeupVec.map(x => VecInit(x)) 15983ba63b3SXuan Hu wakeupLoadDependencyByIQVec := io.wakeUpFromIQ.map(_.bits.loadDependency).toSeq 1605db4956bSzhanglyGit } 1615db4956bSzhanglyGit 1625db4956bSzhanglyGit //entryUpdate 1635db4956bSzhanglyGit entryUpdate.status.srcState.zip(entryReg.status.srcState).zip(srcWakeUp).zipWithIndex.foreach { case (((stateNext, state), wakeup), srcIdx) => 1645db4956bSzhanglyGit val cancel = srcCancelVec.map(_ (srcIdx)).getOrElse(false.B) 1655db4956bSzhanglyGit stateNext := Mux(cancel, false.B, wakeup | state) 16689740385Ssinsanction if (params.hasIQWakeUp) { 16789740385Ssinsanction cancelVec.get(srcIdx) := cancel 16889740385Ssinsanction } 1695db4956bSzhanglyGit } 1705db4956bSzhanglyGit entryUpdate.status.dataSources.zip(entryReg.status.dataSources).zip(srcWakeUpByIQVec).foreach { 1715db4956bSzhanglyGit case ((dataSourceNext: DataSource, dataSource: DataSource), wakeUpByIQOH: Vec[Bool]) => 1725db4956bSzhanglyGit when(wakeUpByIQOH.asUInt.orR) { 1735db4956bSzhanglyGit dataSourceNext.value := DataSource.bypass 1745db4956bSzhanglyGit }.otherwise { 1755db4956bSzhanglyGit dataSourceNext.value := DataSource.reg 1765db4956bSzhanglyGit } 1775db4956bSzhanglyGit } 1785db4956bSzhanglyGit if (params.hasIQWakeUp) { 1790f55a0d3SHaojin Tang entryUpdate.status.srcWakeUpL1ExuOH.get.zip(srcWakeUpByIQVec).zip(srcWakeUp).zipWithIndex.foreach { 1807a96cc7fSHaojin Tang case (((exuOH: UInt, wakeUpByIQOH: Vec[Bool]), wakeUp: Bool), srcIdx) => 1815db4956bSzhanglyGit when(wakeUpByIQOH.asUInt.orR) { 1827a96cc7fSHaojin Tang exuOH := Mux1H(wakeUpByIQOH, io.wakeUpFromIQ.toSeq.map(x => MathUtils.IntToOH(x.bits.exuIdx).U(backendParams.numExu.W))) 1830f55a0d3SHaojin Tang }.elsewhen(wakeUp) { 1840f55a0d3SHaojin Tang exuOH := 0.U.asTypeOf(exuOH) 1855db4956bSzhanglyGit }.otherwise { 1865db4956bSzhanglyGit exuOH := entryReg.status.srcWakeUpL1ExuOH.get(srcIdx) 1875db4956bSzhanglyGit } 1885db4956bSzhanglyGit } 189af4bd265SzhanglyGit srcWakeUpL1ExuOHOut.get.zip(srcWakeUpByIQWithoutCancel).zip(srcWakeUp).zipWithIndex.foreach { 190af4bd265SzhanglyGit case (((exuOH: UInt, wakeUpByIQOH: Vec[Bool]), wakeUp: Bool), srcIdx) => 191af4bd265SzhanglyGit when(wakeUpByIQOH.asUInt.orR) { 192af4bd265SzhanglyGit exuOH := Mux1H(wakeUpByIQOH, io.wakeUpFromIQ.map(x => MathUtils.IntToOH(x.bits.exuIdx).U(backendParams.numExu.W)).toSeq) 193af4bd265SzhanglyGit }.elsewhen(wakeUp) { 194af4bd265SzhanglyGit exuOH := 0.U.asTypeOf(exuOH) 195af4bd265SzhanglyGit }.otherwise { 196af4bd265SzhanglyGit exuOH := entryReg.status.srcWakeUpL1ExuOH.get(srcIdx) 197af4bd265SzhanglyGit } 198af4bd265SzhanglyGit } 1995db4956bSzhanglyGit entryUpdate.status.srcTimer.get.zip(entryReg.status.srcTimer.get).zip(srcWakeUpByIQVec).zipWithIndex.foreach { 2005db4956bSzhanglyGit case (((srcIssuedTimerNext, srcIssuedTimer), wakeUpByIQOH: Vec[Bool]), srcIdx) => 201af4bd265SzhanglyGit srcIssuedTimerNext := MuxCase(3.U, Seq( 2025db4956bSzhanglyGit // T0: waked up by IQ, T1: reset timer as 1 203af4bd265SzhanglyGit wakeUpByIQOH.asUInt.orR -> 2.U, 2045db4956bSzhanglyGit // do not overflow 2055db4956bSzhanglyGit srcIssuedTimer.andR -> srcIssuedTimer, 2060f55a0d3SHaojin Tang // T2+: increase if the entry is valid, the src is ready, and the src is woken up by iq 2075db4956bSzhanglyGit (validReg && SrcState.isReady(entryReg.status.srcState(srcIdx)) && entryReg.status.srcWakeUpL1ExuOH.get.asUInt.orR) -> (srcIssuedTimer + 1.U) 2085db4956bSzhanglyGit )) 2095db4956bSzhanglyGit } 2100f55a0d3SHaojin Tang entryUpdate.status.srcLoadDependency.get.zip(entryReg.status.srcLoadDependency.get).zip(srcWakeUpByIQVec).zip(srcWakeUp).foreach { 2110f55a0d3SHaojin Tang case (((loadDependencyNext, loadDependency), wakeUpByIQVec), wakeup) => 2120f55a0d3SHaojin Tang loadDependencyNext := 2130f55a0d3SHaojin Tang Mux(wakeup, 2140f55a0d3SHaojin Tang Mux(wakeUpByIQVec.asUInt.orR, Mux1H(wakeUpByIQVec, shiftedWakeupLoadDependencyByIQVec), 0.U.asTypeOf(loadDependency)), 2150f55a0d3SHaojin Tang Mux(validReg && loadDependency.asUInt.orR, VecInit(loadDependency.map(i => i(i.getWidth - 2, 0) << 1)), loadDependency) 2160f55a0d3SHaojin Tang ) 2170f55a0d3SHaojin Tang } 218af4bd265SzhanglyGit srcLoadDependencyOut.get.zip(entryReg.status.srcLoadDependency.get).zip(srcWakeUpByIQVec).zip(srcWakeUp).foreach { 219af4bd265SzhanglyGit case (((loadDependencyOut, loadDependency), wakeUpByIQVec), wakeup) => 220af4bd265SzhanglyGit loadDependencyOut := 221af4bd265SzhanglyGit Mux(wakeup, 222af4bd265SzhanglyGit Mux(wakeUpByIQVec.asUInt.orR, Mux1H(wakeUpByIQVec, shiftedWakeupLoadDependencyByIQBypassVec), 0.U.asTypeOf(loadDependency)), 223af4bd265SzhanglyGit loadDependency 224af4bd265SzhanglyGit ) 225af4bd265SzhanglyGit } 2265db4956bSzhanglyGit } 227ea159d42Ssinsanction entryUpdate.status.issueTimer := "b10".U //otherwise 2285db4956bSzhanglyGit entryUpdate.status.deqPortIdx := 0.U //otherwise 2295db4956bSzhanglyGit when(io.deqSel) { 230ea159d42Ssinsanction entryUpdate.status.issueTimer := 0.U 2315db4956bSzhanglyGit entryUpdate.status.deqPortIdx := io.deqPortIdxWrite 2325db4956bSzhanglyGit }.elsewhen(entryReg.status.issued){ 2335db4956bSzhanglyGit entryUpdate.status.issueTimer := entryReg.status.issueTimer + 1.U 2345db4956bSzhanglyGit entryUpdate.status.deqPortIdx := entryReg.status.deqPortIdx 2355db4956bSzhanglyGit } 2365db4956bSzhanglyGit entryUpdate.status.psrc := entryReg.status.psrc 2375db4956bSzhanglyGit entryUpdate.status.srcType := entryReg.status.srcType 2385db4956bSzhanglyGit entryUpdate.status.fuType := entryReg.status.fuType 2395db4956bSzhanglyGit entryUpdate.status.robIdx := entryReg.status.robIdx 2402d270511Ssinsanction entryUpdate.status.uopIdx.foreach(_ := entryReg.status.uopIdx.get) 2415db4956bSzhanglyGit entryUpdate.status.issued := entryReg.status.issued // otherwise 242af4bd265SzhanglyGit when(srcLoadCancelVec.map(_.reduce(_ || _)).getOrElse(false.B) || srcWakeUpButCancel.map(_.fold(false.B)(_ || _)).fold(false.B)(_ || _)) { 2430f55a0d3SHaojin Tang entryUpdate.status.issued := false.B 244ea159d42Ssinsanction }.elsewhen(io.deqSel) { 2455db4956bSzhanglyGit entryUpdate.status.issued := true.B 246ea159d42Ssinsanction }.elsewhen(io.issueResp.valid && RSFeedbackType.isBlocked(io.issueResp.bits.respType)) { 2475db4956bSzhanglyGit entryUpdate.status.issued := false.B 248af4bd265SzhanglyGit }.elsewhen(!entryReg.status.srcReady) { 249af4bd265SzhanglyGit entryUpdate.status.issued := false.B 2505db4956bSzhanglyGit } 2515db4956bSzhanglyGit entryUpdate.status.firstIssue := io.deqSel || entryReg.status.firstIssue 2525db4956bSzhanglyGit entryUpdate.status.blocked := false.B //todo 2535db4956bSzhanglyGit //remain imm and payload 2545db4956bSzhanglyGit entryUpdate.imm := entryReg.imm 2555db4956bSzhanglyGit entryUpdate.payload := entryReg.payload 2565db4956bSzhanglyGit if(params.needPc) { 2575db4956bSzhanglyGit entryUpdate.status.pc.get := entryReg.status.pc.get 2585db4956bSzhanglyGit } 259af4bd265SzhanglyGit val canIssue = entryReg.status.canIssue && validReg && !srcCancelVec.getOrElse(false.B).asUInt.orR 260af4bd265SzhanglyGit val canIssueBypass = validReg && !entryReg.status.issued && !entryReg.status.blocked && 261af4bd265SzhanglyGit VecInit(entryReg.status.srcState.zip(srcWakeUpByIQWithoutCancel).zipWithIndex.map { case ((state, wakeupVec), srcIdx) => 262af4bd265SzhanglyGit val cancel = srcCancelVec.map(_ (srcIdx)).getOrElse(false.B) 263af4bd265SzhanglyGit Mux(cancel, false.B, wakeupVec.asUInt.orR | state) 264af4bd265SzhanglyGit }).asUInt.andR 265af4bd265SzhanglyGit io.dataSource.zip(entryReg.status.dataSources).zip(srcWakeUpByIQVec).zip(srcWakeUp).foreach { 266af4bd265SzhanglyGit case (((dataSourceOut: DataSource, dataSource: DataSource), wakeUpByIQOH: Vec[Bool]), wakeUpAll) => 267af4bd265SzhanglyGit when(wakeUpByIQOH.asUInt.orR) { 268af4bd265SzhanglyGit dataSourceOut.value := DataSource.forward 269af4bd265SzhanglyGit }.elsewhen(wakeUpAll) { 270af4bd265SzhanglyGit dataSourceOut.value := DataSource.reg 271af4bd265SzhanglyGit }.otherwise { 272af4bd265SzhanglyGit dataSourceOut.value := dataSource.value 273af4bd265SzhanglyGit } 274af4bd265SzhanglyGit } 275af4bd265SzhanglyGit if (params.hasIQWakeUp) { 276af4bd265SzhanglyGit io.srcTimer.get.zip(entryReg.status.srcTimer.get).zip(srcWakeUpByIQWithoutCancel).zip(srcWakeUp).foreach { 277af4bd265SzhanglyGit case (((srcTimerOut, srcTimer), wakeUpByIQOH: Vec[Bool]), wakeUpAll) => 278af4bd265SzhanglyGit when(wakeUpByIQOH.asUInt.orR) { 279af4bd265SzhanglyGit srcTimerOut := 1.U 280af4bd265SzhanglyGit }.otherwise { 281af4bd265SzhanglyGit srcTimerOut := srcTimer 282af4bd265SzhanglyGit } 283af4bd265SzhanglyGit } 284af4bd265SzhanglyGit } 2855db4956bSzhanglyGit 2865db4956bSzhanglyGit //output 2875db4956bSzhanglyGit io.transEntry.valid := validReg && io.transSel && !flushed && !deqSuccess 2885db4956bSzhanglyGit io.transEntry.bits := entryUpdate 289*59f958d4SzhanglyGit io.canIssue := (canIssue || canIssueBypass) && !flushed 2905db4956bSzhanglyGit io.clear := clear 2915db4956bSzhanglyGit io.fuType := entryReg.status.fuType 292af4bd265SzhanglyGit io.srcWakeUpL1ExuOH.foreach(_ := Mux(canIssueBypass && !canIssue, srcWakeUpL1ExuOHOut.get, entryReg.status.srcWakeUpL1ExuOH.get)) 2935db4956bSzhanglyGit io.valid := validReg 2945db4956bSzhanglyGit io.isFirstIssue := !entryReg.status.firstIssue 2955db4956bSzhanglyGit io.entry.valid := validReg 2965db4956bSzhanglyGit io.entry.bits := entryReg 297af4bd265SzhanglyGit io.entry.bits.status.srcLoadDependency.foreach(_ := Mux(canIssueBypass && !canIssue, srcLoadDependencyOut.get, entryReg.status.srcLoadDependency.get)) 2985db4956bSzhanglyGit io.robIdx := entryReg.status.robIdx 2992d270511Ssinsanction io.uopIdx.foreach(_ := entryReg.status.uopIdx.get) 300ea159d42Ssinsanction io.issueTimerRead := entryReg.status.issueTimer 301ea159d42Ssinsanction io.deqPortIdxRead := entryReg.status.deqPortIdx 30289740385Ssinsanction io.cancel.foreach(_ := cancelVec.get.asUInt.orR) 3035db4956bSzhanglyGit} 3045db4956bSzhanglyGit 3055db4956bSzhanglyGitclass EnqEntryMem()(implicit p: Parameters, params: IssueBlockParams) extends EnqEntry 3065db4956bSzhanglyGit with HasCircularQueuePtrHelper { 3075db4956bSzhanglyGit val fromMem = io.fromMem.get 3085db4956bSzhanglyGit 3095db4956bSzhanglyGit val memStatus = entryReg.status.mem.get 3105db4956bSzhanglyGit println("memStatus" + memStatus) 3115db4956bSzhanglyGit val memStatusNext = entryRegNext.status.mem.get 3125db4956bSzhanglyGit val memStatusUpdate = entryUpdate.status.mem.get 3135db4956bSzhanglyGit 3145db4956bSzhanglyGit // load cannot be issued before older store, unless meet some condition 3155db4956bSzhanglyGit val blockedByOlderStore = isAfter(memStatusNext.sqIdx, fromMem.stIssuePtr) 3165db4956bSzhanglyGit 3175db4956bSzhanglyGit val deqFailedForStdInvalid = io.issueResp.valid && io.issueResp.bits.respType === RSFeedbackType.dataInvalid 3185db4956bSzhanglyGit 3195db4956bSzhanglyGit val staWaitedReleased = Cat( 32006083203SHaojin Tang fromMem.memWaitUpdateReq.robIdx.map(x => x.valid && x.bits.value === memStatusNext.waitForRobIdx.value) 3215db4956bSzhanglyGit ).orR 3225db4956bSzhanglyGit val stdWaitedReleased = Cat( 32306083203SHaojin Tang fromMem.memWaitUpdateReq.sqIdx.map(x => x.valid && x.bits.value === memStatusNext.waitForSqIdx.value) 3245db4956bSzhanglyGit ).orR 3255db4956bSzhanglyGit val olderStaNotViolate = staWaitedReleased && !memStatusNext.strictWait 3265db4956bSzhanglyGit val olderStdReady = stdWaitedReleased && memStatusNext.waitForStd 3275db4956bSzhanglyGit val waitStd = !olderStdReady 3285db4956bSzhanglyGit val waitSta = !olderStaNotViolate 3295db4956bSzhanglyGit 3305db4956bSzhanglyGit when (io.enq.valid && enqReady) { 3315db4956bSzhanglyGit memStatusNext.waitForSqIdx := io.enq.bits.status.mem.get.waitForSqIdx 3325db4956bSzhanglyGit // update by lfst at dispatch stage 3335db4956bSzhanglyGit memStatusNext.waitForRobIdx := io.enq.bits.status.mem.get.waitForRobIdx 3345db4956bSzhanglyGit // new load inst don't known if it is blocked by store data ahead of it 3355db4956bSzhanglyGit memStatusNext.waitForStd := false.B 3365db4956bSzhanglyGit // update by ssit at rename stage 3375db4956bSzhanglyGit memStatusNext.strictWait := io.enq.bits.status.mem.get.strictWait 3385db4956bSzhanglyGit memStatusNext.sqIdx := io.enq.bits.status.mem.get.sqIdx 3395db4956bSzhanglyGit }.otherwise { 3405db4956bSzhanglyGit memStatusNext := memStatusUpdate 3415db4956bSzhanglyGit } 3425db4956bSzhanglyGit 3435db4956bSzhanglyGit when(deqFailedForStdInvalid) { 3445db4956bSzhanglyGit memStatusUpdate.waitForSqIdx := io.issueResp.bits.dataInvalidSqIdx 3455db4956bSzhanglyGit memStatusUpdate.waitForRobIdx := memStatus.waitForRobIdx 3465db4956bSzhanglyGit memStatusUpdate.waitForStd := true.B 3475db4956bSzhanglyGit memStatusUpdate.strictWait := memStatus.strictWait 3485db4956bSzhanglyGit memStatusUpdate.sqIdx := memStatus.sqIdx 3495db4956bSzhanglyGit }.otherwise { 3505db4956bSzhanglyGit memStatusUpdate := memStatus 3515db4956bSzhanglyGit } 3525db4956bSzhanglyGit 3535db4956bSzhanglyGit val shouldBlock = Mux(io.enq.valid && enqReady, io.enq.bits.status.blocked, entryReg.status.blocked) 3545db4956bSzhanglyGit val blockNotReleased = waitStd || waitSta 3555db4956bSzhanglyGit val respBlock = deqFailedForStdInvalid 3565db4956bSzhanglyGit entryRegNext.status.blocked := shouldBlock && blockNotReleased && blockedByOlderStore || respBlock 3575db4956bSzhanglyGit entryUpdate.status.blocked := shouldBlock && blockNotReleased && blockedByOlderStore || respBlock 3585db4956bSzhanglyGit 3595db4956bSzhanglyGit} 3605db4956bSzhanglyGit 3612d270511Ssinsanctionclass EnqEntryVecMemAddr()(implicit p: Parameters, params: IssueBlockParams) extends EnqEntryMem { 3622d270511Ssinsanction 3632d270511Ssinsanction require(params.isVecMemAddrIQ, "EnqEntryVecMemAddr can only be instance of VecMemAddr IQ") 3642d270511Ssinsanction 3652d270511Ssinsanction val vecMemStatus = entryReg.status.vecMem.get 3662d270511Ssinsanction val vecMemStatusNext = entryRegNext.status.vecMem.get 3672d270511Ssinsanction val vecMemStatusUpdate = entryUpdate.status.vecMem.get 3682d270511Ssinsanction val fromLsq = io.fromLsq.get 3692d270511Ssinsanction 3702d270511Ssinsanction when (io.enq.valid && enqReady) { 3712d270511Ssinsanction vecMemStatusNext.sqIdx := io.enq.bits.status.vecMem.get.sqIdx 3722d270511Ssinsanction vecMemStatusNext.lqIdx := io.enq.bits.status.vecMem.get.lqIdx 3732d270511Ssinsanction }.otherwise { 3742d270511Ssinsanction vecMemStatusNext := vecMemStatusUpdate 3752d270511Ssinsanction } 3762d270511Ssinsanction vecMemStatusUpdate := vecMemStatus 3772d270511Ssinsanction 3782d270511Ssinsanction val isLsqHead = { 37929b863e5Szhanglinjuan // if (params.isVecLdAddrIQ) 38031c1fcd8Szhanglinjuan entryRegNext.status.vecMem.get.lqIdx <= fromLsq.lqDeqPtr && 38129b863e5Szhanglinjuan // else 38231c1fcd8Szhanglinjuan entryRegNext.status.vecMem.get.sqIdx <= fromLsq.sqDeqPtr 3832d270511Ssinsanction } 3842d270511Ssinsanction 3852d270511Ssinsanction entryRegNext.status.blocked := shouldBlock && blockNotReleased && blockedByOlderStore || respBlock || !isLsqHead 3862d270511Ssinsanction entryUpdate.status.blocked := shouldBlock && blockNotReleased && blockedByOlderStore || respBlock || !isLsqHead 3872d270511Ssinsanction} 3882d270511Ssinsanction 3892d270511Ssinsanctionclass EnqEntryVecMemData()(implicit p: Parameters, params: IssueBlockParams) extends EnqEntry 3902d270511Ssinsanction with HasCircularQueuePtrHelper { 3912d270511Ssinsanction 3922d270511Ssinsanction require(params.isVecStDataIQ, "EnqEntryVecMemData can only be instance of VecMemData IQ") 3932d270511Ssinsanction 3942d270511Ssinsanction val vecMemStatus = entryReg.status.vecMem.get 3952d270511Ssinsanction val vecMemStatusNext = entryRegNext.status.vecMem.get 3962d270511Ssinsanction val vecMemStatusUpdate = entryUpdate.status.vecMem.get 3972d270511Ssinsanction val fromLsq = io.fromLsq.get 3982d270511Ssinsanction 3992d270511Ssinsanction when (io.enq.valid && enqReady) { 4002d270511Ssinsanction vecMemStatusNext.sqIdx := io.enq.bits.status.vecMem.get.sqIdx 4012d270511Ssinsanction vecMemStatusNext.lqIdx := io.enq.bits.status.vecMem.get.lqIdx 4022d270511Ssinsanction }.otherwise { 4032d270511Ssinsanction vecMemStatusNext := vecMemStatusUpdate 4042d270511Ssinsanction } 4052d270511Ssinsanction vecMemStatusUpdate := vecMemStatus 4062d270511Ssinsanction 4072d270511Ssinsanction val isLsqHead = entryRegNext.status.vecMem.get.sqIdx.value === fromLsq.sqDeqPtr.value 4082d270511Ssinsanction 4092d270511Ssinsanction entryRegNext.status.blocked := !isLsqHead 4102d270511Ssinsanction entryUpdate.status.blocked := !isLsqHead 4112d270511Ssinsanction} 4122d270511Ssinsanction 4135db4956bSzhanglyGitobject EnqEntry { 4145db4956bSzhanglyGit def apply(implicit p: Parameters, iqParams: IssueBlockParams): EnqEntry = { 4155db4956bSzhanglyGit iqParams.schdType match { 4165db4956bSzhanglyGit case IntScheduler() => new EnqEntry() 4175db4956bSzhanglyGit case MemScheduler() => 41897b279b9SXuan Hu if (iqParams.isLdAddrIQ || iqParams.isStAddrIQ || iqParams.isHyAddrIQ) new EnqEntryMem() 4192d270511Ssinsanction else if (iqParams.isVecMemAddrIQ) new EnqEntryVecMemAddr() 4202d270511Ssinsanction else if (iqParams.isVecStDataIQ) new EnqEntryVecMemData() 4215db4956bSzhanglyGit else new EnqEntry() 4225db4956bSzhanglyGit case VfScheduler() => new EnqEntry() 4235db4956bSzhanglyGit case _ => null 4245db4956bSzhanglyGit } 4255db4956bSzhanglyGit } 4265db4956bSzhanglyGit}