15db4956bSzhanglyGitpackage xiangshan.backend.issue 25db4956bSzhanglyGit 35db4956bSzhanglyGitimport chipsalliance.rocketchip.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)) 24*0f55a0d3SHaojin 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 485db4956bSzhanglyGit 495db4956bSzhanglyGit def wakeup = wakeUpFromWB ++ wakeUpFromIQ 505db4956bSzhanglyGit} 515db4956bSzhanglyGit 525db4956bSzhanglyGitclass EnqEntry(implicit p: Parameters, params: IssueBlockParams) extends XSModule { 535db4956bSzhanglyGit val io = IO(new EnqEntryIO) 545db4956bSzhanglyGit 555db4956bSzhanglyGit val validReg = RegInit(false.B) 565db4956bSzhanglyGit val entryReg = Reg(new EntryBundle) 575db4956bSzhanglyGit 585db4956bSzhanglyGit val validRegNext = Wire(Bool()) 595db4956bSzhanglyGit val entryRegNext = Wire(new EntryBundle) 605db4956bSzhanglyGit val entryUpdate = Wire(new EntryBundle) 615db4956bSzhanglyGit val enqReady = Wire(Bool()) 625db4956bSzhanglyGit val clear = Wire(Bool()) 635db4956bSzhanglyGit val flushed = Wire(Bool()) 645db4956bSzhanglyGit val deqSuccess = Wire(Bool()) 655db4956bSzhanglyGit val srcWakeUp = Wire(Vec(params.numRegSrc, Bool())) 665db4956bSzhanglyGit val srcCancelVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numRegSrc, Bool()))) 67*0f55a0d3SHaojin Tang val srcLoadCancelVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numRegSrc, Bool()))) 685db4956bSzhanglyGit val srcWakeUpByIQVec = Wire(Vec(params.numRegSrc, Vec(params.numWakeupFromIQ, Bool()))) 69*0f55a0d3SHaojin Tang val wakeupLoadDependencyByIQVec = Wire(Vec(params.numWakeupFromIQ, Vec(LoadPipelineWidth, UInt(3.W)))) 70*0f55a0d3SHaojin Tang val shiftedWakeupLoadDependencyByIQVec = Wire(Vec(params.numWakeupFromIQ, Vec(LoadPipelineWidth, UInt(3.W)))) 715db4956bSzhanglyGit 725db4956bSzhanglyGit //Reg 735db4956bSzhanglyGit validReg := validRegNext 745db4956bSzhanglyGit entryReg := entryRegNext 755db4956bSzhanglyGit 765db4956bSzhanglyGit //Wire 775db4956bSzhanglyGit when(io.enq.valid && enqReady) { 785db4956bSzhanglyGit validRegNext := true.B 795db4956bSzhanglyGit }.elsewhen(clear) { 805db4956bSzhanglyGit validRegNext := false.B 815db4956bSzhanglyGit }.otherwise { 825db4956bSzhanglyGit validRegNext := validReg 835db4956bSzhanglyGit } 845db4956bSzhanglyGit 855db4956bSzhanglyGit when(io.enq.valid && enqReady) { 865db4956bSzhanglyGit entryRegNext := io.enq.bits 875db4956bSzhanglyGit }.otherwise { 885db4956bSzhanglyGit entryRegNext := entryUpdate 895db4956bSzhanglyGit } 905db4956bSzhanglyGit 915db4956bSzhanglyGit enqReady := !validReg || clear 925db4956bSzhanglyGit clear := flushed || io.transSel || deqSuccess 935db4956bSzhanglyGit flushed := entryReg.status.robIdx.needFlush(io.flush) 94*0f55a0d3SHaojin Tang deqSuccess := io.issueResp.valid && io.issueResp.bits.respType === RSFeedbackType.fuIdle && !srcLoadCancelVec.map(_.reduce(_ || _)).getOrElse(false.B) 955db4956bSzhanglyGit srcWakeUp := io.wakeup.map(bundle => bundle.bits.wakeUp(entryReg.status.psrc zip entryReg.status.srcType, bundle.valid)).transpose.map(VecInit(_).asUInt.orR) 965db4956bSzhanglyGit 97*0f55a0d3SHaojin Tang shiftedWakeupLoadDependencyByIQVec 98*0f55a0d3SHaojin Tang .zip(wakeupLoadDependencyByIQVec) 99*0f55a0d3SHaojin Tang .zip(params.wakeUpInExuSources.map(_.name)).foreach { 100*0f55a0d3SHaojin Tang case ((deps, originalDeps), name) => deps.zip(originalDeps).zipWithIndex.foreach { 101*0f55a0d3SHaojin Tang case ((dep, originalDep), deqPortIdx) => 102*0f55a0d3SHaojin Tang if (name.contains("LDU") && name.replace("LDU", "").toInt == deqPortIdx) 103*0f55a0d3SHaojin Tang dep := originalDep << 1 | 1.U 104*0f55a0d3SHaojin Tang else 105*0f55a0d3SHaojin Tang dep := originalDep << 1 106*0f55a0d3SHaojin Tang } 107*0f55a0d3SHaojin Tang } 108*0f55a0d3SHaojin Tang 1095db4956bSzhanglyGit if (params.hasIQWakeUp) { 110*0f55a0d3SHaojin Tang srcCancelVec.get.zip(srcLoadCancelVec.get).zip(srcWakeUpByIQVec).zipWithIndex.foreach { case (((srcCancel, srcLoadCancel), wakeUpByIQVec), srcIdx) => 1115db4956bSzhanglyGit // level1 cancel: A(s)->C, A(s) are the level1 cancel 1125db4956bSzhanglyGit val l1Cancel = (io.og0Cancel.asUInt & entryReg.status.srcWakeUpL1ExuOH.get(srcIdx).asUInt).orR && 1135db4956bSzhanglyGit entryReg.status.srcTimer.get(srcIdx) === 1.U 114*0f55a0d3SHaojin Tang val ldTransCancel = Mux( 115*0f55a0d3SHaojin Tang wakeUpByIQVec.asUInt.orR, 116*0f55a0d3SHaojin Tang Mux1H(wakeUpByIQVec, wakeupLoadDependencyByIQVec.map(dep => LoadShouldCancel(Some(dep), io.ldCancel))), 117*0f55a0d3SHaojin Tang false.B 118*0f55a0d3SHaojin Tang ) 119*0f55a0d3SHaojin Tang srcLoadCancel := LoadShouldCancel(entryReg.status.srcLoadDependency.map(_(srcIdx)), io.ldCancel) 120*0f55a0d3SHaojin Tang srcCancel := l1Cancel || srcLoadCancel || ldTransCancel 1215db4956bSzhanglyGit } 1225db4956bSzhanglyGit } 1235db4956bSzhanglyGit 1245db4956bSzhanglyGit if (io.wakeUpFromIQ.isEmpty) { 1255db4956bSzhanglyGit srcWakeUpByIQVec := 0.U.asTypeOf(srcWakeUpByIQVec) 126*0f55a0d3SHaojin Tang wakeupLoadDependencyByIQVec := 0.U.asTypeOf(wakeupLoadDependencyByIQVec) 1275db4956bSzhanglyGit } else { 1285db4956bSzhanglyGit val wakeupVec: IndexedSeq[IndexedSeq[Bool]] = io.wakeUpFromIQ.map((bundle: ValidIO[IssueQueueIQWakeUpBundle]) => 1295db4956bSzhanglyGit bundle.bits.wakeUp(entryReg.status.psrc zip entryReg.status.srcType, bundle.valid) 1305db4956bSzhanglyGit ).transpose 1315db4956bSzhanglyGit srcWakeUpByIQVec := wakeupVec.map(x => VecInit(x)) 132*0f55a0d3SHaojin Tang wakeupLoadDependencyByIQVec := io.wakeUpFromIQ.map(_.bits.loadDependency) 1335db4956bSzhanglyGit } 1345db4956bSzhanglyGit 1355db4956bSzhanglyGit //entryUpdate 1365db4956bSzhanglyGit entryUpdate.status.srcState.zip(entryReg.status.srcState).zip(srcWakeUp).zipWithIndex.foreach { case (((stateNext, state), wakeup), srcIdx) => 1375db4956bSzhanglyGit val cancel = srcCancelVec.map(_ (srcIdx)).getOrElse(false.B) 1385db4956bSzhanglyGit stateNext := Mux(cancel, false.B, wakeup | state) 1395db4956bSzhanglyGit } 1405db4956bSzhanglyGit entryUpdate.status.dataSources.zip(entryReg.status.dataSources).zip(srcWakeUpByIQVec).foreach { 1415db4956bSzhanglyGit case ((dataSourceNext: DataSource, dataSource: DataSource), wakeUpByIQOH: Vec[Bool]) => 1425db4956bSzhanglyGit when(wakeUpByIQOH.asUInt.orR) { 1435db4956bSzhanglyGit dataSourceNext.value := DataSource.forward 1445db4956bSzhanglyGit }.elsewhen(dataSource.value === DataSource.forward) { 1455db4956bSzhanglyGit dataSourceNext.value := DataSource.bypass 1465db4956bSzhanglyGit }.otherwise { 1475db4956bSzhanglyGit dataSourceNext.value := DataSource.reg 1485db4956bSzhanglyGit } 1495db4956bSzhanglyGit } 1505db4956bSzhanglyGit if (params.hasIQWakeUp) { 151*0f55a0d3SHaojin Tang entryUpdate.status.srcWakeUpL1ExuOH.get.zip(srcWakeUpByIQVec).zip(srcWakeUp).zipWithIndex.foreach { 152*0f55a0d3SHaojin Tang case (((exuOH: Vec[Bool], wakeUpByIQOH: Vec[Bool]), wakeUp: Bool), srcIdx) => 1535db4956bSzhanglyGit when(wakeUpByIQOH.asUInt.orR) { 1545db4956bSzhanglyGit exuOH := Mux1H(wakeUpByIQOH, io.wakeUpFromIQ.map(x => MathUtils.IntToOH(x.bits.exuIdx).U(backendParams.numExu.W))).asBools 155*0f55a0d3SHaojin Tang }.elsewhen(wakeUp) { 156*0f55a0d3SHaojin Tang exuOH := 0.U.asTypeOf(exuOH) 1575db4956bSzhanglyGit }.otherwise { 1585db4956bSzhanglyGit exuOH := entryReg.status.srcWakeUpL1ExuOH.get(srcIdx) 1595db4956bSzhanglyGit } 1605db4956bSzhanglyGit } 1615db4956bSzhanglyGit entryUpdate.status.srcTimer.get.zip(entryReg.status.srcTimer.get).zip(srcWakeUpByIQVec).zipWithIndex.foreach { 1625db4956bSzhanglyGit case (((srcIssuedTimerNext, srcIssuedTimer), wakeUpByIQOH: Vec[Bool]), srcIdx) => 1635db4956bSzhanglyGit srcIssuedTimerNext := MuxCase(0.U, Seq( 1645db4956bSzhanglyGit // T0: waked up by IQ, T1: reset timer as 1 1655db4956bSzhanglyGit wakeUpByIQOH.asUInt.orR -> 1.U, 1665db4956bSzhanglyGit // do not overflow 1675db4956bSzhanglyGit srcIssuedTimer.andR -> srcIssuedTimer, 168*0f55a0d3SHaojin Tang // T2+: increase if the entry is valid, the src is ready, and the src is woken up by iq 1695db4956bSzhanglyGit (validReg && SrcState.isReady(entryReg.status.srcState(srcIdx)) && entryReg.status.srcWakeUpL1ExuOH.get.asUInt.orR) -> (srcIssuedTimer + 1.U) 1705db4956bSzhanglyGit )) 1715db4956bSzhanglyGit } 172*0f55a0d3SHaojin Tang entryUpdate.status.srcLoadDependency.get.zip(entryReg.status.srcLoadDependency.get).zip(srcWakeUpByIQVec).zip(srcWakeUp).foreach { 173*0f55a0d3SHaojin Tang case (((loadDependencyNext, loadDependency), wakeUpByIQVec), wakeup) => 174*0f55a0d3SHaojin Tang loadDependencyNext := 175*0f55a0d3SHaojin Tang Mux(wakeup, 176*0f55a0d3SHaojin Tang Mux(wakeUpByIQVec.asUInt.orR, Mux1H(wakeUpByIQVec, shiftedWakeupLoadDependencyByIQVec), 0.U.asTypeOf(loadDependency)), 177*0f55a0d3SHaojin Tang Mux(validReg && loadDependency.asUInt.orR, VecInit(loadDependency.map(i => i(i.getWidth - 2, 0) << 1)), loadDependency) 178*0f55a0d3SHaojin Tang ) 179*0f55a0d3SHaojin Tang } 1805db4956bSzhanglyGit } 1815db4956bSzhanglyGit entryUpdate.status.issueTimer := "b11".U //otherwise 1825db4956bSzhanglyGit entryUpdate.status.deqPortIdx := 0.U //otherwise 1835db4956bSzhanglyGit when(io.deqSel) { 1845db4956bSzhanglyGit entryUpdate.status.issueTimer := 1.U 1855db4956bSzhanglyGit entryUpdate.status.deqPortIdx := io.deqPortIdxWrite 1865db4956bSzhanglyGit }.elsewhen(entryReg.status.issued){ 1875db4956bSzhanglyGit entryUpdate.status.issueTimer := entryReg.status.issueTimer + 1.U 1885db4956bSzhanglyGit entryUpdate.status.deqPortIdx := entryReg.status.deqPortIdx 1895db4956bSzhanglyGit } 1905db4956bSzhanglyGit entryUpdate.status.psrc := entryReg.status.psrc 1915db4956bSzhanglyGit entryUpdate.status.srcType := entryReg.status.srcType 1925db4956bSzhanglyGit entryUpdate.status.fuType := entryReg.status.fuType 1935db4956bSzhanglyGit entryUpdate.status.robIdx := entryReg.status.robIdx 1945db4956bSzhanglyGit entryUpdate.status.issued := entryReg.status.issued // otherwise 1955db4956bSzhanglyGit when(!entryReg.status.srcReady){ 1965db4956bSzhanglyGit entryUpdate.status.issued := false.B 197*0f55a0d3SHaojin Tang }.elsewhen(srcLoadCancelVec.map(_.reduce(_ || _)).getOrElse(false.B)) { 198*0f55a0d3SHaojin Tang entryUpdate.status.issued := false.B 1995db4956bSzhanglyGit }.elsewhen(io.issueResp.valid) { 2005db4956bSzhanglyGit when(RSFeedbackType.isStageSuccess(io.issueResp.bits.respType)) { 2015db4956bSzhanglyGit entryUpdate.status.issued := true.B 2025db4956bSzhanglyGit }.elsewhen(RSFeedbackType.isBlocked(io.issueResp.bits.respType)) { 2035db4956bSzhanglyGit entryUpdate.status.issued := false.B 2045db4956bSzhanglyGit } 2055db4956bSzhanglyGit } 2065db4956bSzhanglyGit entryUpdate.status.firstIssue := io.deqSel || entryReg.status.firstIssue 2075db4956bSzhanglyGit entryUpdate.status.blocked := false.B //todo 2085db4956bSzhanglyGit //remain imm and payload 2095db4956bSzhanglyGit entryUpdate.imm := entryReg.imm 2105db4956bSzhanglyGit entryUpdate.payload := entryReg.payload 2115db4956bSzhanglyGit if(params.needPc) { 2125db4956bSzhanglyGit entryUpdate.status.pc.get := entryReg.status.pc.get 2135db4956bSzhanglyGit entryUpdate.status.target.get := entryReg.status.target.get 2145db4956bSzhanglyGit } 2155db4956bSzhanglyGit 2165db4956bSzhanglyGit //output 2175db4956bSzhanglyGit io.transEntry.valid := validReg && io.transSel && !flushed && !deqSuccess 2185db4956bSzhanglyGit io.transEntry.bits := entryUpdate 2195db4956bSzhanglyGit io.canIssue := entryReg.status.canIssue && validReg 2205db4956bSzhanglyGit io.clear := clear 2215db4956bSzhanglyGit io.fuType := entryReg.status.fuType 2225db4956bSzhanglyGit io.dataSource := entryReg.status.dataSources 2235db4956bSzhanglyGit io.srcWakeUpL1ExuOH.foreach(_ := entryReg.status.srcWakeUpL1ExuOH.get) 2245db4956bSzhanglyGit io.srcTimer.foreach(_ := entryReg.status.srcTimer.get) 2255db4956bSzhanglyGit io.valid := validReg 2265db4956bSzhanglyGit io.isFirstIssue := !entryReg.status.firstIssue 2275db4956bSzhanglyGit io.entry.valid := validReg 2285db4956bSzhanglyGit io.entry.bits := entryReg 2295db4956bSzhanglyGit io.robIdx := entryReg.status.robIdx 2305db4956bSzhanglyGit io.issueTimerRead := Mux(io.deqSel, 0.U, entryReg.status.issueTimer) 2315db4956bSzhanglyGit io.deqPortIdxRead := Mux(io.deqSel, io.deqPortIdxWrite, entryReg.status.deqPortIdx) 2325db4956bSzhanglyGit} 2335db4956bSzhanglyGit 2345db4956bSzhanglyGitclass EnqEntryMem()(implicit p: Parameters, params: IssueBlockParams) extends EnqEntry 2355db4956bSzhanglyGit with HasCircularQueuePtrHelper { 2365db4956bSzhanglyGit val fromMem = io.fromMem.get 2375db4956bSzhanglyGit 2385db4956bSzhanglyGit val memStatus = entryReg.status.mem.get 2395db4956bSzhanglyGit println("memStatus" + memStatus) 2405db4956bSzhanglyGit val memStatusNext = entryRegNext.status.mem.get 2415db4956bSzhanglyGit val memStatusUpdate = entryUpdate.status.mem.get 2425db4956bSzhanglyGit 2435db4956bSzhanglyGit // load cannot be issued before older store, unless meet some condition 2445db4956bSzhanglyGit val blockedByOlderStore = isAfter(memStatusNext.sqIdx, fromMem.stIssuePtr) 2455db4956bSzhanglyGit 2465db4956bSzhanglyGit val deqFailedForStdInvalid = io.issueResp.valid && io.issueResp.bits.respType === RSFeedbackType.dataInvalid 2475db4956bSzhanglyGit 2485db4956bSzhanglyGit val staWaitedReleased = Cat( 2495db4956bSzhanglyGit fromMem.memWaitUpdateReq.staIssue.map(x => x.valid && x.bits.uop.robIdx.value === memStatusNext.waitForRobIdx.value) 2505db4956bSzhanglyGit ).orR 2515db4956bSzhanglyGit val stdWaitedReleased = Cat( 2525db4956bSzhanglyGit fromMem.memWaitUpdateReq.stdIssue.map(x => x.valid && x.bits.uop.sqIdx.value === memStatusNext.waitForSqIdx.value) 2535db4956bSzhanglyGit ).orR 2545db4956bSzhanglyGit val olderStaNotViolate = staWaitedReleased && !memStatusNext.strictWait 2555db4956bSzhanglyGit val olderStdReady = stdWaitedReleased && memStatusNext.waitForStd 2565db4956bSzhanglyGit val waitStd = !olderStdReady 2575db4956bSzhanglyGit val waitSta = !olderStaNotViolate 2585db4956bSzhanglyGit 2595db4956bSzhanglyGit when (io.enq.valid && enqReady) { 2605db4956bSzhanglyGit memStatusNext.waitForSqIdx := io.enq.bits.status.mem.get.waitForSqIdx 2615db4956bSzhanglyGit // update by lfst at dispatch stage 2625db4956bSzhanglyGit memStatusNext.waitForRobIdx := io.enq.bits.status.mem.get.waitForRobIdx 2635db4956bSzhanglyGit // new load inst don't known if it is blocked by store data ahead of it 2645db4956bSzhanglyGit memStatusNext.waitForStd := false.B 2655db4956bSzhanglyGit // update by ssit at rename stage 2665db4956bSzhanglyGit memStatusNext.strictWait := io.enq.bits.status.mem.get.strictWait 2675db4956bSzhanglyGit memStatusNext.sqIdx := io.enq.bits.status.mem.get.sqIdx 2685db4956bSzhanglyGit }.otherwise { 2695db4956bSzhanglyGit memStatusNext := memStatusUpdate 2705db4956bSzhanglyGit } 2715db4956bSzhanglyGit 2725db4956bSzhanglyGit when(deqFailedForStdInvalid) { 2735db4956bSzhanglyGit memStatusUpdate.waitForSqIdx := io.issueResp.bits.dataInvalidSqIdx 2745db4956bSzhanglyGit memStatusUpdate.waitForRobIdx := memStatus.waitForRobIdx 2755db4956bSzhanglyGit memStatusUpdate.waitForStd := true.B 2765db4956bSzhanglyGit memStatusUpdate.strictWait := memStatus.strictWait 2775db4956bSzhanglyGit memStatusUpdate.sqIdx := memStatus.sqIdx 2785db4956bSzhanglyGit }.otherwise { 2795db4956bSzhanglyGit memStatusUpdate := memStatus 2805db4956bSzhanglyGit } 2815db4956bSzhanglyGit 2825db4956bSzhanglyGit val shouldBlock = Mux(io.enq.valid && enqReady, io.enq.bits.status.blocked, entryReg.status.blocked) 2835db4956bSzhanglyGit val blockNotReleased = waitStd || waitSta 2845db4956bSzhanglyGit val respBlock = deqFailedForStdInvalid 2855db4956bSzhanglyGit entryRegNext.status.blocked := shouldBlock && blockNotReleased && blockedByOlderStore || respBlock 2865db4956bSzhanglyGit entryUpdate.status.blocked := shouldBlock && blockNotReleased && blockedByOlderStore || respBlock 2875db4956bSzhanglyGit 2885db4956bSzhanglyGit} 2895db4956bSzhanglyGit 2905db4956bSzhanglyGitobject EnqEntry { 2915db4956bSzhanglyGit def apply(implicit p: Parameters, iqParams: IssueBlockParams): EnqEntry = { 2925db4956bSzhanglyGit iqParams.schdType match { 2935db4956bSzhanglyGit case IntScheduler() => new EnqEntry() 2945db4956bSzhanglyGit case MemScheduler() => 2955db4956bSzhanglyGit if (iqParams.StdCnt == 0) new EnqEntryMem() 2965db4956bSzhanglyGit else new EnqEntry() 2975db4956bSzhanglyGit case VfScheduler() => new EnqEntry() 2985db4956bSzhanglyGit case _ => null 2995db4956bSzhanglyGit } 3005db4956bSzhanglyGit } 3015db4956bSzhanglyGit}