fix(resolve): flush entries that have been redirected by backend (#5085)
EMU Test / Changes Detection (push) Has been cancelled Details
EMU Test / Generate Verilog (push) Has been cancelled Details
EMU Test / EMU - Basics (push) Has been cancelled Details
EMU Test / EMU - CHI (push) Has been cancelled Details
EMU Test / Docker Build (push) Has been cancelled Details
EMU Test / EMU - Performance (push) Has been cancelled Details
EMU Test / EMU - SimFrontend (push) Has been cancelled Details
EMU Test / EMU - MC (push) Has been cancelled Details
EMU Test / SIMV - Basics (push) Has been cancelled Details
EMU Test / Upload Artifacts (push) Has been cancelled Details
EMU Test / Check Submodules (push) Has been cancelled Details
EMU Test / Check Format (push) Has been cancelled Details

Meta of entries that have been redirected by backend may be overwritten
by BPU already while they remain in resolve queue. In this case, FTQ
will send BPU wrong meta.
This commit is contained in:
Muzi 2025-09-30 11:12:35 +08:00 committed by GitHub
parent 7b86c35840
commit 6b4ab11c1e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 18 additions and 5 deletions

View File

@ -37,6 +37,7 @@ class MetaEntry(implicit p: Parameters) extends FtqBundle {
class ResolveEntry(implicit p: Parameters) extends FtqBundle { class ResolveEntry(implicit p: Parameters) extends FtqBundle {
val ftqIdx: FtqPtr = new FtqPtr val ftqIdx: FtqPtr = new FtqPtr
val flushed: Bool = Bool()
val startVAddr: PrunedAddr = PrunedAddr(VAddrBits) val startVAddr: PrunedAddr = PrunedAddr(VAddrBits)
// TODO: Reconsider branch number // TODO: Reconsider branch number
val branches: Vec[Valid[BranchInfo]] = Vec(ResolveEntryBranchNumber, Valid(new BranchInfo)) val branches: Vec[Valid[BranchInfo]] = Vec(ResolveEntryBranchNumber, Valid(new BranchInfo))

View File

@ -23,6 +23,7 @@ package xiangshan.frontend.ftq
import chisel3._ import chisel3._
import chisel3.util._ import chisel3.util._
import org.chipsalliance.cde.config.Parameters import org.chipsalliance.cde.config.Parameters
import utility.DelayN
import utility.HasCircularQueuePtrHelper import utility.HasCircularQueuePtrHelper
import utility.HasPerfEvents import utility.HasPerfEvents
import utility.ParallelPriorityMux import utility.ParallelPriorityMux
@ -290,15 +291,19 @@ class Ftq(implicit p: Parameters) extends FtqModule
io.toBpu.redirect.bits.speculationMeta := speculationQueue(redirect.bits.ftqIdx.value) io.toBpu.redirect.bits.speculationMeta := speculationQueue(redirect.bits.ftqIdx.value)
io.toBpu.redirectFromIFU := ifuRedirect.valid io.toBpu.redirectFromIFU := ifuRedirect.valid
resolveQueue.io.backendRedirect := DelayN(backendRedirect.valid, 2)
resolveQueue.io.backendRedirectPtr := DelayN(backendRedirect.bits.ftqIdx, 2)
// -------------------------------------------------------------------------------- // --------------------------------------------------------------------------------
// Resolve and train BPU // Resolve and train BPU
// -------------------------------------------------------------------------------- // --------------------------------------------------------------------------------
resolveQueue.io.backendResolve := io.fromBackend.resolve resolveQueue.io.backendResolve := io.fromBackend.resolve
metaQueue.io.ren := resolveQueue.io.bpuTrain.valid metaQueue.io.ren := resolveQueue.io.bpuTrain.valid && !resolveQueue.io.bpuTrain.bits.flushed
metaQueue.io.raddr := resolveQueue.io.bpuTrain.bits.ftqIdx.value metaQueue.io.raddr := resolveQueue.io.bpuTrain.bits.ftqIdx.value
io.toBpu.train.valid := RegNext(resolveQueue.io.bpuTrain.valid) io.toBpu.train.valid := RegNext(resolveQueue.io.bpuTrain.valid && !resolveQueue.io.bpuTrain.bits.flushed)
io.toBpu.train.bits.meta := metaQueue.io.rdata.meta io.toBpu.train.bits.meta := metaQueue.io.rdata.meta
io.toBpu.train.bits.startVAddr := RegEnable(resolveQueue.io.bpuTrain.bits.startVAddr, resolveQueue.io.bpuTrain.valid) io.toBpu.train.bits.startVAddr := RegEnable(resolveQueue.io.bpuTrain.bits.startVAddr, resolveQueue.io.bpuTrain.valid)
io.toBpu.train.bits.branches := RegEnable(resolveQueue.io.bpuTrain.bits.branches, resolveQueue.io.bpuTrain.valid) io.toBpu.train.bits.branches := RegEnable(resolveQueue.io.bpuTrain.bits.branches, resolveQueue.io.bpuTrain.valid)

View File

@ -26,6 +26,8 @@ class ResolveQueue(implicit p: Parameters) extends FtqModule with HalfAlignHelpe
class ResolveQueueIO extends Bundle { class ResolveQueueIO extends Bundle {
val backendResolve: Vec[Valid[Resolve]] = Input(Vec(backendParams.BrhCnt, Valid(new Resolve))) val backendResolve: Vec[Valid[Resolve]] = Input(Vec(backendParams.BrhCnt, Valid(new Resolve)))
val backendRedirect: Bool = Input(Bool())
val backendRedirectPtr: FtqPtr = Input(new FtqPtr)
val bpuTrain: Valid[ResolveEntry] = Output(Valid(new ResolveEntry)) val bpuTrain: Valid[ResolveEntry] = Output(Valid(new ResolveEntry))
} }
@ -79,6 +81,10 @@ class ResolveQueue(implicit p: Parameters) extends FtqModule with HalfAlignHelpe
} }
} }
when(io.backendRedirect) {
mem.foreach(entry => entry.bits.flushed := entry.bits.ftqIdx > io.backendRedirectPtr)
}
private val deqValid = mem(deqPtr.value).valid && !io.backendResolve.map(branch => private val deqValid = mem(deqPtr.value).valid && !io.backendResolve.map(branch =>
branch.valid && branch.bits.ftqIdx === mem(deqPtr.value).bits.ftqIdx branch.valid && branch.bits.ftqIdx === mem(deqPtr.value).bits.ftqIdx
).reduce(_ || _) ).reduce(_ || _)
@ -90,6 +96,7 @@ class ResolveQueue(implicit p: Parameters) extends FtqModule with HalfAlignHelpe
deqPtr := deqPtr + 1.U deqPtr := deqPtr + 1.U
mem(deqPtr.value).valid := false.B mem(deqPtr.value).valid := false.B
mem(deqPtr.value).bits.flushed := false.B
mem(deqPtr.value).bits.branches.foreach(_.valid := false.B) mem(deqPtr.value).bits.branches.foreach(_.valid := false.B)
} }