@@ -6,6 +6,7 @@ import frontend.bpu.bundles._
66import frontend .bpu .components .Bundles .FtbEntryNdPort
77import frontend .bpu .components .FTB
88import frontend .bundles .{BpuFtqPort , FtqBlockBundle }
9+ import spec .Param .BPU .BranchType
910import 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