Fix #69 discoverd fmax issue with decode stage branch predictions
This commit is contained in:
parent
fdd2194c8f
commit
63cd5f42af
|
@ -268,7 +268,7 @@ class BranchPlugin(earlyBranch : Boolean,
|
||||||
default{
|
default{
|
||||||
branch_src1 := input(PC)
|
branch_src1 := input(PC)
|
||||||
branch_src2 := ((input(BRANCH_CTRL) === BranchCtrlEnum.JAL) ? imm.j_sext | imm.b_sext).asUInt
|
branch_src2 := ((input(BRANCH_CTRL) === BranchCtrlEnum.JAL) ? imm.j_sext | imm.b_sext).asUInt
|
||||||
when(input(PREDICTION_HAD_BRANCHED) && ! missAlignedTarget){
|
when(input(PREDICTION_HAD_BRANCHED)){ //Assume the predictor never predict missaligned stuff, this avoid the need to know if the instruction should branch or not
|
||||||
branch_src2 := (if(pipeline(RVC_GEN)) Mux(input(IS_RVC), B(2), B(4)) else B(4)).asUInt.resized
|
branch_src2 := (if(pipeline(RVC_GEN)) Mux(input(IS_RVC), B(2), B(4)) else B(4)).asUInt.resized
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -488,6 +488,15 @@ abstract class IBusFetcherImpl(val resetVector : BigInt,
|
||||||
|
|
||||||
decodePrediction.cmd.hadBranch := decode.input(BRANCH_CTRL) === BranchCtrlEnum.JAL || (decode.input(BRANCH_CTRL) === BranchCtrlEnum.B && conditionalBranchPrediction)
|
decodePrediction.cmd.hadBranch := decode.input(BRANCH_CTRL) === BranchCtrlEnum.JAL || (decode.input(BRANCH_CTRL) === BranchCtrlEnum.B && conditionalBranchPrediction)
|
||||||
|
|
||||||
|
val noPredictionOnMissaligned = (!pipeline(RVC_GEN)) generate new Area{
|
||||||
|
val missaligned = decode.input(BRANCH_CTRL).mux(
|
||||||
|
BranchCtrlEnum.JALR -> (imm.i_sext(1) ^ decode.input(RS1)(1)),
|
||||||
|
BranchCtrlEnum.JAL -> imm.j_sext(1),
|
||||||
|
default -> imm.b_sext(1)
|
||||||
|
)
|
||||||
|
decodePrediction.cmd.hadBranch clearWhen(missaligned)
|
||||||
|
}
|
||||||
|
|
||||||
predictionJumpInterface.valid := decodePrediction.cmd.hadBranch && decode.arbitration.isFiring //TODO OH Doublon de priorité
|
predictionJumpInterface.valid := decodePrediction.cmd.hadBranch && decode.arbitration.isFiring //TODO OH Doublon de priorité
|
||||||
predictionJumpInterface.payload := decode.input(PC) + ((decode.input(BRANCH_CTRL) === BranchCtrlEnum.JAL) ? imm.j_sext | imm.b_sext).asUInt
|
predictionJumpInterface.payload := decode.input(PC) + ((decode.input(BRANCH_CTRL) === BranchCtrlEnum.JAL) ? imm.j_sext | imm.b_sext).asUInt
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue