Add fenceiGenAsAJump into BranchPlugin

This commit is contained in:
Dolu1990 2018-10-10 21:13:21 +02:00
parent 68f1ff3222
commit 40d85b8c70
1 changed files with 30 additions and 11 deletions

View File

@ -48,8 +48,11 @@ trait PredictionInterface{
def askDecodePrediction() : DecodePredictionBus def askDecodePrediction() : DecodePredictionBus
} }
class BranchPlugin(earlyBranch : Boolean, class BranchPlugin(earlyBranch : Boolean,
catchAddressMisaligned : Boolean = false) extends Plugin[VexRiscv] with PredictionInterface{ catchAddressMisaligned : Boolean = false,
fenceiGenAsAJump : Boolean = false) extends Plugin[VexRiscv] with PredictionInterface{
lazy val branchStage = if(earlyBranch) pipeline.execute else pipeline.memory lazy val branchStage = if(earlyBranch) pipeline.execute else pipeline.memory
@ -57,7 +60,7 @@ class BranchPlugin(earlyBranch : Boolean,
object BRANCH_CALC extends Stageable(UInt(32 bits)) object BRANCH_CALC extends Stageable(UInt(32 bits))
object BRANCH_DO extends Stageable(Bool) object BRANCH_DO extends Stageable(Bool)
object BRANCH_COND_RESULT extends Stageable(Bool) object BRANCH_COND_RESULT extends Stageable(Bool)
// object PREDICTION_HAD_BRANCHED extends Stageable(Bool) object IS_FENCEI extends Stageable(Bool)
var jumpInterface : Flow[UInt] = null var jumpInterface : Flow[UInt] = null
var predictionJumpInterface : Flow[UInt] = null var predictionJumpInterface : Flow[UInt] = null
@ -82,8 +85,7 @@ class BranchPlugin(earlyBranch : Boolean,
override def setup(pipeline: VexRiscv): Unit = { override def setup(pipeline: VexRiscv): Unit = {
import Riscv._ import Riscv._
import pipeline.config._ import pipeline.config._
import IntAluPlugin._
val decoderService = pipeline.service(classOf[DecoderService])
val bActions = List[(Stageable[_ <: BaseType],Any)]( val bActions = List[(Stageable[_ <: BaseType],Any)](
SRC1_CTRL -> Src1CtrlEnum.RS, SRC1_CTRL -> Src1CtrlEnum.RS,
@ -102,7 +104,8 @@ class BranchPlugin(earlyBranch : Boolean,
HAS_SIDE_EFFECT -> True HAS_SIDE_EFFECT -> True
) )
import IntAluPlugin._ val decoderService = pipeline.service(classOf[DecoderService])
decoderService.addDefault(BRANCH_CTRL, BranchCtrlEnum.INC) decoderService.addDefault(BRANCH_CTRL, BranchCtrlEnum.INC)
val rvc = pipeline(RVC_GEN) val rvc = pipeline(RVC_GEN)
@ -117,6 +120,13 @@ class BranchPlugin(earlyBranch : Boolean,
BGEU(rvc) -> (bActions ++ List(BRANCH_CTRL -> BranchCtrlEnum.B, SRC_LESS_UNSIGNED -> True)) BGEU(rvc) -> (bActions ++ List(BRANCH_CTRL -> BranchCtrlEnum.B, SRC_LESS_UNSIGNED -> True))
)) ))
if(fenceiGenAsAJump) {
decoderService.addDefault(IS_FENCEI, False)
decoderService.add(List(
FENCEI -> (List(IS_FENCEI -> True,HAS_SIDE_EFFECT -> True, BRANCH_CTRL -> BranchCtrlEnum.JAL))
))
}
val pcManagerService = pipeline.service(classOf[JumpService]) val pcManagerService = pipeline.service(classOf[JumpService])
jumpInterface = pcManagerService.createJumpInterface(branchStage) jumpInterface = pcManagerService.createJumpInterface(branchStage)
@ -127,12 +137,21 @@ class BranchPlugin(earlyBranch : Boolean,
} }
} }
override def build(pipeline: VexRiscv): Unit = (fetchPrediction,decodePrediction) match { override def build(pipeline: VexRiscv): Unit = {
case (null, null) => buildWithoutPrediction(pipeline) (fetchPrediction,decodePrediction) match {
case (_ , null) => buildFetchPrediction(pipeline) case (null, null) => buildWithoutPrediction(pipeline)
case (null, _) => buildDecodePrediction(pipeline) case (_ , null) => buildFetchPrediction(pipeline)
// case `DYNAMIC` => buildWithPrediction(pipeline) case (null, _) => buildDecodePrediction(pipeline)
// case `DYNAMIC_TARGET` => buildDynamicTargetPrediction(pipeline) }
if(fenceiGenAsAJump) {
import pipeline._
import pipeline.config._
when(decode.input(IS_FENCEI)) {
decode.output(INSTRUCTION)(12) := False
decode.output(INSTRUCTION)(22) := True
}
execute.arbitration.haltByOther setWhen(execute.arbitration.isValid && execute.input(IS_FENCEI) && List(memory,writeBack).map(_.arbitration.isValid).orR)
}
} }
def buildWithoutPrediction(pipeline: VexRiscv): Unit = { def buildWithoutPrediction(pipeline: VexRiscv): Unit = {