Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 8 additions & 3 deletions src/src/frontend/bpu/BPU.scala
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import frontend.bpu.bundles._
import frontend.bpu.components.Bundles.FtbEntryNdPort
import frontend.bpu.components.FTB
import frontend.bundles.{BpuFtqPort, FtqBlockBundle}
import spec.Param.BPU.BranchType
import spec._

// BPU is the Branch Predicting Unit
Expand Down Expand Up @@ -172,20 +173,24 @@ class BPU(
val ftbUpdateEntry = Wire(new FtbEntryNdPort)

// Only following conditions will trigger a FTB update:
// 1. This is a conditional branch
// 1. This is a conditional branch or the first time of direct Immediately Jump
// 2. First time a branch jumped
// 3. A FTB pollution is detected
// dirty case 1: target error || fallThroughAddr error;
// 2:At the same addr, original branch inst become nonBranch inst after cacop or change program

val ftbUpdateValid = if (Param.isFTBupdateRet) {
WireDefault(
io.bpuFtqPort.ftqTrainMeta.valid && ((directionPredictError && (!io.bpuFtqPort.ftqTrainMeta.ftbHit)) || io.bpuFtqPort.ftqTrainMeta.ftbDirty)
io.bpuFtqPort.ftqTrainMeta.valid &&
(((directionPredictError || io.bpuFtqPort.ftqTrainMeta.branchType === BranchType.call || io.bpuFtqPort.ftqTrainMeta.branchType === BranchType.uncond) && (!io.bpuFtqPort.ftqTrainMeta.ftbHit))
|| io.bpuFtqPort.ftqTrainMeta.ftbDirty)
)
// all kinds of target error can update
} else {
WireDefault(
io.bpuFtqPort.ftqTrainMeta.valid && ((directionPredictError && (!io.bpuFtqPort.ftqTrainMeta.ftbHit)) || (io.bpuFtqPort.ftqTrainMeta.ftbDirty && io.bpuFtqPort.ftqTrainMeta.ftbHit))
io.bpuFtqPort.ftqTrainMeta.valid &&
(((directionPredictError || io.bpuFtqPort.ftqTrainMeta.branchType === BranchType.call || io.bpuFtqPort.ftqTrainMeta.branchType === BranchType.uncond) && (!io.bpuFtqPort.ftqTrainMeta.ftbHit)) ||
(io.bpuFtqPort.ftqTrainMeta.ftbDirty && io.bpuFtqPort.ftqTrainMeta.ftbHit))
)
// case 1: the first time of a branch inst taken ( include conditon branch, indirect jump that hasn't been predicted taken),
// case 2: hit and dirty
Expand Down