Skip to content

Commit 0296289

Browse files
fix:FTB do not train immJump because predecode predirect corect (#307)
1 parent 30275a2 commit 0296289

File tree

1 file changed

+8
-3
lines changed

1 file changed

+8
-3
lines changed

src/src/frontend/bpu/BPU.scala

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import frontend.bpu.bundles._
66
import frontend.bpu.components.Bundles.FtbEntryNdPort
77
import frontend.bpu.components.FTB
88
import frontend.bundles.{BpuFtqPort, FtqBlockBundle}
9+
import spec.Param.BPU.BranchType
910
import spec._
1011

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

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

181182
val ftbUpdateValid = if (Param.isFTBupdateRet) {
182183
WireDefault(
183-
io.bpuFtqPort.ftqTrainMeta.valid && ((directionPredictError && (!io.bpuFtqPort.ftqTrainMeta.ftbHit)) || io.bpuFtqPort.ftqTrainMeta.ftbDirty)
184+
io.bpuFtqPort.ftqTrainMeta.valid &&
185+
(((directionPredictError || io.bpuFtqPort.ftqTrainMeta.branchType === BranchType.call || io.bpuFtqPort.ftqTrainMeta.branchType === BranchType.uncond) && (!io.bpuFtqPort.ftqTrainMeta.ftbHit))
186+
|| io.bpuFtqPort.ftqTrainMeta.ftbDirty)
184187
)
185188
// all kinds of target error can update
186189
} else {
187190
WireDefault(
188-
io.bpuFtqPort.ftqTrainMeta.valid && ((directionPredictError && (!io.bpuFtqPort.ftqTrainMeta.ftbHit)) || (io.bpuFtqPort.ftqTrainMeta.ftbDirty && io.bpuFtqPort.ftqTrainMeta.ftbHit))
191+
io.bpuFtqPort.ftqTrainMeta.valid &&
192+
(((directionPredictError || io.bpuFtqPort.ftqTrainMeta.branchType === BranchType.call || io.bpuFtqPort.ftqTrainMeta.branchType === BranchType.uncond) && (!io.bpuFtqPort.ftqTrainMeta.ftbHit)) ||
193+
(io.bpuFtqPort.ftqTrainMeta.ftbDirty && io.bpuFtqPort.ftqTrainMeta.ftbHit))
189194
)
190195
// case 1: the first time of a branch inst taken ( include conditon branch, indirect jump that hasn't been predicted taken),
191196
// case 2: hit and dirty

0 commit comments

Comments
 (0)