15db4956bSzhanglyGitpackage xiangshan.backend.issue 25db4956bSzhanglyGit 3*83ba63b3SXuan 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 135db4956bSzhanglyGitimport xiangshan.mem.{MemWaitUpdateReq, SqPtr} 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) 225db4956bSzhanglyGit val og0Cancel = Input(ExuVec(backendParams.numExu)) 235db4956bSzhanglyGit val og1Cancel = Input(ExuVec(backendParams.numExu)) 240f55a0d3SHaojin Tang val ldCancel = Vec(backendParams.LduCnt, 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())) 355db4956bSzhanglyGit val srcWakeUpL1ExuOH = OptionWrapper(params.hasIQWakeUp, Output(Vec(params.numRegSrc, ExuVec()))) 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) 415db4956bSzhanglyGit val deqPortIdxRead = Output(UInt(1.W)) 425db4956bSzhanglyGit val issueTimerRead = Output(UInt(2.W)) 435db4956bSzhanglyGit // mem only 445db4956bSzhanglyGit val fromMem = if(params.isMemAddrIQ) Some(new Bundle { 455db4956bSzhanglyGit val stIssuePtr = Input(new SqPtr) 465db4956bSzhanglyGit val memWaitUpdateReq = Flipped(new MemWaitUpdateReq) 475db4956bSzhanglyGit }) else None 4889740385Ssinsanction // debug 4989740385Ssinsanction val cancel = OptionWrapper(params.hasIQWakeUp, Output(Bool())) 505db4956bSzhanglyGit 515db4956bSzhanglyGit def wakeup = wakeUpFromWB ++ wakeUpFromIQ 525db4956bSzhanglyGit} 535db4956bSzhanglyGit 545db4956bSzhanglyGitclass EnqEntry(implicit p: Parameters, params: IssueBlockParams) extends XSModule { 555db4956bSzhanglyGit val io = IO(new EnqEntryIO) 565db4956bSzhanglyGit 575db4956bSzhanglyGit val validReg = RegInit(false.B) 585db4956bSzhanglyGit val entryReg = Reg(new EntryBundle) 595db4956bSzhanglyGit 605db4956bSzhanglyGit val validRegNext = Wire(Bool()) 615db4956bSzhanglyGit val entryRegNext = Wire(new EntryBundle) 625db4956bSzhanglyGit val entryUpdate = Wire(new EntryBundle) 635db4956bSzhanglyGit val enqReady = Wire(Bool()) 645db4956bSzhanglyGit val clear = Wire(Bool()) 655db4956bSzhanglyGit val flushed = Wire(Bool()) 665db4956bSzhanglyGit val deqSuccess = Wire(Bool()) 675db4956bSzhanglyGit val srcWakeUp = Wire(Vec(params.numRegSrc, Bool())) 685db4956bSzhanglyGit val srcCancelVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numRegSrc, Bool()))) 690f55a0d3SHaojin Tang val srcLoadCancelVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numRegSrc, Bool()))) 705db4956bSzhanglyGit val srcWakeUpByIQVec = Wire(Vec(params.numRegSrc, Vec(params.numWakeupFromIQ, Bool()))) 710f55a0d3SHaojin Tang val wakeupLoadDependencyByIQVec = Wire(Vec(params.numWakeupFromIQ, Vec(LoadPipelineWidth, UInt(3.W)))) 720f55a0d3SHaojin Tang val shiftedWakeupLoadDependencyByIQVec = Wire(Vec(params.numWakeupFromIQ, Vec(LoadPipelineWidth, UInt(3.W)))) 7389740385Ssinsanction val cancelVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numRegSrc, Bool()))) 745db4956bSzhanglyGit 755db4956bSzhanglyGit //Reg 765db4956bSzhanglyGit validReg := validRegNext 775db4956bSzhanglyGit entryReg := entryRegNext 785db4956bSzhanglyGit 795db4956bSzhanglyGit //Wire 805db4956bSzhanglyGit when(io.enq.valid && enqReady) { 815db4956bSzhanglyGit validRegNext := true.B 825db4956bSzhanglyGit }.elsewhen(clear) { 835db4956bSzhanglyGit validRegNext := false.B 845db4956bSzhanglyGit }.otherwise { 855db4956bSzhanglyGit validRegNext := validReg 865db4956bSzhanglyGit } 875db4956bSzhanglyGit 885db4956bSzhanglyGit when(io.enq.valid && enqReady) { 895db4956bSzhanglyGit entryRegNext := io.enq.bits 905db4956bSzhanglyGit }.otherwise { 915db4956bSzhanglyGit entryRegNext := entryUpdate 925db4956bSzhanglyGit } 935db4956bSzhanglyGit 945db4956bSzhanglyGit enqReady := !validReg || clear 955db4956bSzhanglyGit clear := flushed || io.transSel || deqSuccess 965db4956bSzhanglyGit flushed := entryReg.status.robIdx.needFlush(io.flush) 970f55a0d3SHaojin Tang deqSuccess := io.issueResp.valid && io.issueResp.bits.respType === RSFeedbackType.fuIdle && !srcLoadCancelVec.map(_.reduce(_ || _)).getOrElse(false.B) 98*83ba63b3SXuan Hu srcWakeUp := io.wakeup.map(bundle => bundle.bits.wakeUp(entryReg.status.psrc zip entryReg.status.srcType, bundle.valid)).transpose.map(x => VecInit(x.toSeq).asUInt.orR).toSeq 995db4956bSzhanglyGit 1000f55a0d3SHaojin Tang shiftedWakeupLoadDependencyByIQVec 1010f55a0d3SHaojin Tang .zip(wakeupLoadDependencyByIQVec) 1020f55a0d3SHaojin Tang .zip(params.wakeUpInExuSources.map(_.name)).foreach { 1030f55a0d3SHaojin Tang case ((deps, originalDeps), name) => deps.zip(originalDeps).zipWithIndex.foreach { 1040f55a0d3SHaojin Tang case ((dep, originalDep), deqPortIdx) => 1050f55a0d3SHaojin Tang if (name.contains("LDU") && name.replace("LDU", "").toInt == deqPortIdx) 106*83ba63b3SXuan Hu dep := (originalDep << 1).asUInt | 1.U 1070f55a0d3SHaojin Tang else 1080f55a0d3SHaojin Tang dep := originalDep << 1 1090f55a0d3SHaojin Tang } 1100f55a0d3SHaojin Tang } 1110f55a0d3SHaojin Tang 1125db4956bSzhanglyGit if (params.hasIQWakeUp) { 1130f55a0d3SHaojin Tang srcCancelVec.get.zip(srcLoadCancelVec.get).zip(srcWakeUpByIQVec).zipWithIndex.foreach { case (((srcCancel, srcLoadCancel), wakeUpByIQVec), srcIdx) => 1145db4956bSzhanglyGit // level1 cancel: A(s)->C, A(s) are the level1 cancel 1155db4956bSzhanglyGit val l1Cancel = (io.og0Cancel.asUInt & entryReg.status.srcWakeUpL1ExuOH.get(srcIdx).asUInt).orR && 1165db4956bSzhanglyGit entryReg.status.srcTimer.get(srcIdx) === 1.U 1170f55a0d3SHaojin Tang val ldTransCancel = Mux( 1180f55a0d3SHaojin Tang wakeUpByIQVec.asUInt.orR, 1190f55a0d3SHaojin Tang Mux1H(wakeUpByIQVec, wakeupLoadDependencyByIQVec.map(dep => LoadShouldCancel(Some(dep), io.ldCancel))), 1200f55a0d3SHaojin Tang false.B 1210f55a0d3SHaojin Tang ) 1220f55a0d3SHaojin Tang srcLoadCancel := LoadShouldCancel(entryReg.status.srcLoadDependency.map(_(srcIdx)), io.ldCancel) 1230f55a0d3SHaojin Tang srcCancel := l1Cancel || srcLoadCancel || ldTransCancel 1245db4956bSzhanglyGit } 1255db4956bSzhanglyGit } 1265db4956bSzhanglyGit 1275db4956bSzhanglyGit if (io.wakeUpFromIQ.isEmpty) { 1285db4956bSzhanglyGit srcWakeUpByIQVec := 0.U.asTypeOf(srcWakeUpByIQVec) 1290f55a0d3SHaojin Tang wakeupLoadDependencyByIQVec := 0.U.asTypeOf(wakeupLoadDependencyByIQVec) 1305db4956bSzhanglyGit } else { 1315db4956bSzhanglyGit val wakeupVec: IndexedSeq[IndexedSeq[Bool]] = io.wakeUpFromIQ.map((bundle: ValidIO[IssueQueueIQWakeUpBundle]) => 1325db4956bSzhanglyGit bundle.bits.wakeUp(entryReg.status.psrc zip entryReg.status.srcType, bundle.valid) 133*83ba63b3SXuan Hu ).toIndexedSeq.transpose 1345db4956bSzhanglyGit srcWakeUpByIQVec := wakeupVec.map(x => VecInit(x)) 135*83ba63b3SXuan Hu wakeupLoadDependencyByIQVec := io.wakeUpFromIQ.map(_.bits.loadDependency).toSeq 1365db4956bSzhanglyGit } 1375db4956bSzhanglyGit 1385db4956bSzhanglyGit //entryUpdate 1395db4956bSzhanglyGit entryUpdate.status.srcState.zip(entryReg.status.srcState).zip(srcWakeUp).zipWithIndex.foreach { case (((stateNext, state), wakeup), srcIdx) => 1405db4956bSzhanglyGit val cancel = srcCancelVec.map(_ (srcIdx)).getOrElse(false.B) 1415db4956bSzhanglyGit stateNext := Mux(cancel, false.B, wakeup | state) 14289740385Ssinsanction if (params.hasIQWakeUp) { 14389740385Ssinsanction cancelVec.get(srcIdx) := cancel 14489740385Ssinsanction } 1455db4956bSzhanglyGit } 1465db4956bSzhanglyGit entryUpdate.status.dataSources.zip(entryReg.status.dataSources).zip(srcWakeUpByIQVec).foreach { 1475db4956bSzhanglyGit case ((dataSourceNext: DataSource, dataSource: DataSource), wakeUpByIQOH: Vec[Bool]) => 1485db4956bSzhanglyGit when(wakeUpByIQOH.asUInt.orR) { 1495db4956bSzhanglyGit dataSourceNext.value := DataSource.forward 1505db4956bSzhanglyGit }.elsewhen(dataSource.value === DataSource.forward) { 1515db4956bSzhanglyGit dataSourceNext.value := DataSource.bypass 1525db4956bSzhanglyGit }.otherwise { 1535db4956bSzhanglyGit dataSourceNext.value := DataSource.reg 1545db4956bSzhanglyGit } 1555db4956bSzhanglyGit } 1565db4956bSzhanglyGit if (params.hasIQWakeUp) { 1570f55a0d3SHaojin Tang entryUpdate.status.srcWakeUpL1ExuOH.get.zip(srcWakeUpByIQVec).zip(srcWakeUp).zipWithIndex.foreach { 1580f55a0d3SHaojin Tang case (((exuOH: Vec[Bool], wakeUpByIQOH: Vec[Bool]), wakeUp: Bool), srcIdx) => 1595db4956bSzhanglyGit when(wakeUpByIQOH.asUInt.orR) { 160*83ba63b3SXuan Hu exuOH := Mux1H(wakeUpByIQOH, io.wakeUpFromIQ.map(x => MathUtils.IntToOH(x.bits.exuIdx).U(backendParams.numExu.W)).toSeq).asBools 1610f55a0d3SHaojin Tang }.elsewhen(wakeUp) { 1620f55a0d3SHaojin Tang exuOH := 0.U.asTypeOf(exuOH) 1635db4956bSzhanglyGit }.otherwise { 1645db4956bSzhanglyGit exuOH := entryReg.status.srcWakeUpL1ExuOH.get(srcIdx) 1655db4956bSzhanglyGit } 1665db4956bSzhanglyGit } 1675db4956bSzhanglyGit entryUpdate.status.srcTimer.get.zip(entryReg.status.srcTimer.get).zip(srcWakeUpByIQVec).zipWithIndex.foreach { 1685db4956bSzhanglyGit case (((srcIssuedTimerNext, srcIssuedTimer), wakeUpByIQOH: Vec[Bool]), srcIdx) => 1695db4956bSzhanglyGit srcIssuedTimerNext := MuxCase(0.U, Seq( 1705db4956bSzhanglyGit // T0: waked up by IQ, T1: reset timer as 1 1715db4956bSzhanglyGit wakeUpByIQOH.asUInt.orR -> 1.U, 1725db4956bSzhanglyGit // do not overflow 1735db4956bSzhanglyGit srcIssuedTimer.andR -> srcIssuedTimer, 1740f55a0d3SHaojin Tang // T2+: increase if the entry is valid, the src is ready, and the src is woken up by iq 1755db4956bSzhanglyGit (validReg && SrcState.isReady(entryReg.status.srcState(srcIdx)) && entryReg.status.srcWakeUpL1ExuOH.get.asUInt.orR) -> (srcIssuedTimer + 1.U) 1765db4956bSzhanglyGit )) 1775db4956bSzhanglyGit } 1780f55a0d3SHaojin Tang entryUpdate.status.srcLoadDependency.get.zip(entryReg.status.srcLoadDependency.get).zip(srcWakeUpByIQVec).zip(srcWakeUp).foreach { 1790f55a0d3SHaojin Tang case (((loadDependencyNext, loadDependency), wakeUpByIQVec), wakeup) => 1800f55a0d3SHaojin Tang loadDependencyNext := 1810f55a0d3SHaojin Tang Mux(wakeup, 1820f55a0d3SHaojin Tang Mux(wakeUpByIQVec.asUInt.orR, Mux1H(wakeUpByIQVec, shiftedWakeupLoadDependencyByIQVec), 0.U.asTypeOf(loadDependency)), 1830f55a0d3SHaojin Tang Mux(validReg && loadDependency.asUInt.orR, VecInit(loadDependency.map(i => i(i.getWidth - 2, 0) << 1)), loadDependency) 1840f55a0d3SHaojin Tang ) 1850f55a0d3SHaojin Tang } 1865db4956bSzhanglyGit } 1875db4956bSzhanglyGit entryUpdate.status.issueTimer := "b11".U //otherwise 1885db4956bSzhanglyGit entryUpdate.status.deqPortIdx := 0.U //otherwise 1895db4956bSzhanglyGit when(io.deqSel) { 1905db4956bSzhanglyGit entryUpdate.status.issueTimer := 1.U 1915db4956bSzhanglyGit entryUpdate.status.deqPortIdx := io.deqPortIdxWrite 1925db4956bSzhanglyGit }.elsewhen(entryReg.status.issued){ 1935db4956bSzhanglyGit entryUpdate.status.issueTimer := entryReg.status.issueTimer + 1.U 1945db4956bSzhanglyGit entryUpdate.status.deqPortIdx := entryReg.status.deqPortIdx 1955db4956bSzhanglyGit } 1965db4956bSzhanglyGit entryUpdate.status.psrc := entryReg.status.psrc 1975db4956bSzhanglyGit entryUpdate.status.srcType := entryReg.status.srcType 1985db4956bSzhanglyGit entryUpdate.status.fuType := entryReg.status.fuType 1995db4956bSzhanglyGit entryUpdate.status.robIdx := entryReg.status.robIdx 2005db4956bSzhanglyGit entryUpdate.status.issued := entryReg.status.issued // otherwise 2015db4956bSzhanglyGit when(!entryReg.status.srcReady){ 2025db4956bSzhanglyGit entryUpdate.status.issued := false.B 2030f55a0d3SHaojin Tang }.elsewhen(srcLoadCancelVec.map(_.reduce(_ || _)).getOrElse(false.B)) { 2040f55a0d3SHaojin Tang entryUpdate.status.issued := false.B 2055db4956bSzhanglyGit }.elsewhen(io.issueResp.valid) { 2065db4956bSzhanglyGit when(RSFeedbackType.isStageSuccess(io.issueResp.bits.respType)) { 2075db4956bSzhanglyGit entryUpdate.status.issued := true.B 2085db4956bSzhanglyGit }.elsewhen(RSFeedbackType.isBlocked(io.issueResp.bits.respType)) { 2095db4956bSzhanglyGit entryUpdate.status.issued := false.B 2105db4956bSzhanglyGit } 2115db4956bSzhanglyGit } 2125db4956bSzhanglyGit entryUpdate.status.firstIssue := io.deqSel || entryReg.status.firstIssue 2135db4956bSzhanglyGit entryUpdate.status.blocked := false.B //todo 2145db4956bSzhanglyGit //remain imm and payload 2155db4956bSzhanglyGit entryUpdate.imm := entryReg.imm 2165db4956bSzhanglyGit entryUpdate.payload := entryReg.payload 2175db4956bSzhanglyGit if(params.needPc) { 2185db4956bSzhanglyGit entryUpdate.status.pc.get := entryReg.status.pc.get 2195db4956bSzhanglyGit } 2205db4956bSzhanglyGit 2215db4956bSzhanglyGit //output 2225db4956bSzhanglyGit io.transEntry.valid := validReg && io.transSel && !flushed && !deqSuccess 2235db4956bSzhanglyGit io.transEntry.bits := entryUpdate 2245db4956bSzhanglyGit io.canIssue := entryReg.status.canIssue && validReg 2255db4956bSzhanglyGit io.clear := clear 2265db4956bSzhanglyGit io.fuType := entryReg.status.fuType 2275db4956bSzhanglyGit io.dataSource := entryReg.status.dataSources 2285db4956bSzhanglyGit io.srcWakeUpL1ExuOH.foreach(_ := entryReg.status.srcWakeUpL1ExuOH.get) 2295db4956bSzhanglyGit io.srcTimer.foreach(_ := entryReg.status.srcTimer.get) 2305db4956bSzhanglyGit io.valid := validReg 2315db4956bSzhanglyGit io.isFirstIssue := !entryReg.status.firstIssue 2325db4956bSzhanglyGit io.entry.valid := validReg 2335db4956bSzhanglyGit io.entry.bits := entryReg 2345db4956bSzhanglyGit io.robIdx := entryReg.status.robIdx 2355db4956bSzhanglyGit io.issueTimerRead := Mux(io.deqSel, 0.U, entryReg.status.issueTimer) 2365db4956bSzhanglyGit io.deqPortIdxRead := Mux(io.deqSel, io.deqPortIdxWrite, entryReg.status.deqPortIdx) 23789740385Ssinsanction io.cancel.foreach(_ := cancelVec.get.asUInt.orR) 2385db4956bSzhanglyGit} 2395db4956bSzhanglyGit 2405db4956bSzhanglyGitclass EnqEntryMem()(implicit p: Parameters, params: IssueBlockParams) extends EnqEntry 2415db4956bSzhanglyGit with HasCircularQueuePtrHelper { 2425db4956bSzhanglyGit val fromMem = io.fromMem.get 2435db4956bSzhanglyGit 2445db4956bSzhanglyGit val memStatus = entryReg.status.mem.get 2455db4956bSzhanglyGit println("memStatus" + memStatus) 2465db4956bSzhanglyGit val memStatusNext = entryRegNext.status.mem.get 2475db4956bSzhanglyGit val memStatusUpdate = entryUpdate.status.mem.get 2485db4956bSzhanglyGit 2495db4956bSzhanglyGit // load cannot be issued before older store, unless meet some condition 2505db4956bSzhanglyGit val blockedByOlderStore = isAfter(memStatusNext.sqIdx, fromMem.stIssuePtr) 2515db4956bSzhanglyGit 2525db4956bSzhanglyGit val deqFailedForStdInvalid = io.issueResp.valid && io.issueResp.bits.respType === RSFeedbackType.dataInvalid 2535db4956bSzhanglyGit 2545db4956bSzhanglyGit val staWaitedReleased = Cat( 25506083203SHaojin Tang fromMem.memWaitUpdateReq.robIdx.map(x => x.valid && x.bits.value === memStatusNext.waitForRobIdx.value) 2565db4956bSzhanglyGit ).orR 2575db4956bSzhanglyGit val stdWaitedReleased = Cat( 25806083203SHaojin Tang fromMem.memWaitUpdateReq.sqIdx.map(x => x.valid && x.bits.value === memStatusNext.waitForSqIdx.value) 2595db4956bSzhanglyGit ).orR 2605db4956bSzhanglyGit val olderStaNotViolate = staWaitedReleased && !memStatusNext.strictWait 2615db4956bSzhanglyGit val olderStdReady = stdWaitedReleased && memStatusNext.waitForStd 2625db4956bSzhanglyGit val waitStd = !olderStdReady 2635db4956bSzhanglyGit val waitSta = !olderStaNotViolate 2645db4956bSzhanglyGit 2655db4956bSzhanglyGit when (io.enq.valid && enqReady) { 2665db4956bSzhanglyGit memStatusNext.waitForSqIdx := io.enq.bits.status.mem.get.waitForSqIdx 2675db4956bSzhanglyGit // update by lfst at dispatch stage 2685db4956bSzhanglyGit memStatusNext.waitForRobIdx := io.enq.bits.status.mem.get.waitForRobIdx 2695db4956bSzhanglyGit // new load inst don't known if it is blocked by store data ahead of it 2705db4956bSzhanglyGit memStatusNext.waitForStd := false.B 2715db4956bSzhanglyGit // update by ssit at rename stage 2725db4956bSzhanglyGit memStatusNext.strictWait := io.enq.bits.status.mem.get.strictWait 2735db4956bSzhanglyGit memStatusNext.sqIdx := io.enq.bits.status.mem.get.sqIdx 2745db4956bSzhanglyGit }.otherwise { 2755db4956bSzhanglyGit memStatusNext := memStatusUpdate 2765db4956bSzhanglyGit } 2775db4956bSzhanglyGit 2785db4956bSzhanglyGit when(deqFailedForStdInvalid) { 2795db4956bSzhanglyGit memStatusUpdate.waitForSqIdx := io.issueResp.bits.dataInvalidSqIdx 2805db4956bSzhanglyGit memStatusUpdate.waitForRobIdx := memStatus.waitForRobIdx 2815db4956bSzhanglyGit memStatusUpdate.waitForStd := true.B 2825db4956bSzhanglyGit memStatusUpdate.strictWait := memStatus.strictWait 2835db4956bSzhanglyGit memStatusUpdate.sqIdx := memStatus.sqIdx 2845db4956bSzhanglyGit }.otherwise { 2855db4956bSzhanglyGit memStatusUpdate := memStatus 2865db4956bSzhanglyGit } 2875db4956bSzhanglyGit 2885db4956bSzhanglyGit val shouldBlock = Mux(io.enq.valid && enqReady, io.enq.bits.status.blocked, entryReg.status.blocked) 2895db4956bSzhanglyGit val blockNotReleased = waitStd || waitSta 2905db4956bSzhanglyGit val respBlock = deqFailedForStdInvalid 2915db4956bSzhanglyGit entryRegNext.status.blocked := shouldBlock && blockNotReleased && blockedByOlderStore || respBlock 2925db4956bSzhanglyGit entryUpdate.status.blocked := shouldBlock && blockNotReleased && blockedByOlderStore || respBlock 2935db4956bSzhanglyGit 2945db4956bSzhanglyGit} 2955db4956bSzhanglyGit 2965db4956bSzhanglyGitobject EnqEntry { 2975db4956bSzhanglyGit def apply(implicit p: Parameters, iqParams: IssueBlockParams): EnqEntry = { 2985db4956bSzhanglyGit iqParams.schdType match { 2995db4956bSzhanglyGit case IntScheduler() => new EnqEntry() 3005db4956bSzhanglyGit case MemScheduler() => 3015db4956bSzhanglyGit if (iqParams.StdCnt == 0) new EnqEntryMem() 3025db4956bSzhanglyGit else new EnqEntry() 3035db4956bSzhanglyGit case VfScheduler() => new EnqEntry() 3045db4956bSzhanglyGit case _ => null 3055db4956bSzhanglyGit } 3065db4956bSzhanglyGit } 3075db4956bSzhanglyGit}