exception code can now be bigger than 4 bits

This commit is contained in:
Dolu1990 2021-06-08 12:19:08 +02:00
parent 646911a373
commit e1e1be5797
3 changed files with 25 additions and 15 deletions

View File

@ -26,13 +26,20 @@ trait DecoderService{
def addDefault(key : Stageable[_ <: BaseType], value : Any) def addDefault(key : Stageable[_ <: BaseType], value : Any)
} }
case class ExceptionCause() extends Bundle{ case class ExceptionCause(codeWidth : Int) extends Bundle{
val code = UInt(4 bits) val code = UInt(codeWidth bits)
val badAddr = UInt(32 bits) val badAddr = UInt(32 bits)
def resizeCode(width : Int): ExceptionCause ={
val ret = ExceptionCause(width)
ret.badAddr := badAddr
ret.code := code.resized
ret
}
} }
trait ExceptionService{ trait ExceptionService{
def newExceptionPort(stage : Stage, priority : Int = 0) : Flow[ExceptionCause] def newExceptionPort(stage : Stage, priority : Int = 0, codeWidth : Int = 4) : Flow[ExceptionCause]
def isExceptionPending(stage : Stage) : Bool def isExceptionPending(stage : Stage) : Bool
} }

View File

@ -34,7 +34,7 @@ object CsrAccess {
case class ExceptionPortInfo(port : Flow[ExceptionCause],stage : Stage, priority : Int) case class ExceptionPortInfo(port : Flow[ExceptionCause],stage : Stage, priority : Int, codeWidth : Int)
case class CsrPluginConfig( case class CsrPluginConfig(
catchIllegalAccess : Boolean, catchIllegalAccess : Boolean,
mvendorid : BigInt, mvendorid : BigInt,
@ -441,9 +441,9 @@ class CsrPlugin(val config: CsrPluginConfig) extends Plugin[VexRiscv] with Excep
//Mannage ExceptionService calls //Mannage ExceptionService calls
val exceptionPortsInfos = ArrayBuffer[ExceptionPortInfo]() val exceptionPortsInfos = ArrayBuffer[ExceptionPortInfo]()
override def newExceptionPort(stage : Stage, priority : Int = 0) = { override def newExceptionPort(stage : Stage, priority : Int = 0, codeWidth : Int = 4) = {
val interface = Flow(ExceptionCause()) val interface = Flow(ExceptionCause(codeWidth))
exceptionPortsInfos += ExceptionPortInfo(interface,stage,priority) exceptionPortsInfos += ExceptionPortInfo(interface,stage,priority,codeWidth)
interface interface
} }
@ -847,10 +847,11 @@ class CsrPlugin(val config: CsrPluginConfig) extends Plugin[VexRiscv] with Excep
//Aggregate all exception port and remove required instructions //Aggregate all exception port and remove required instructions
val exceptionPortCtrl = exceptionPortsInfos.nonEmpty generate new Area{ val exceptionPortCtrl = exceptionPortsInfos.nonEmpty generate new Area{
val codeWidth = exceptionPortsInfos.map(_.codeWidth).max
val firstStageIndexWithExceptionPort = exceptionPortsInfos.map(i => indexOf(i.stage)).min val firstStageIndexWithExceptionPort = exceptionPortsInfos.map(i => indexOf(i.stage)).min
val exceptionValids = Vec(stages.map(s => Bool().setPartialName(s.getName()))) val exceptionValids = Vec(stages.map(s => Bool().setPartialName(s.getName())))
val exceptionValidsRegs = Vec(stages.map(s => Reg(Bool).init(False).setPartialName(s.getName()))).allowUnsetRegToAvoidLatch val exceptionValidsRegs = Vec(stages.map(s => Reg(Bool).init(False).setPartialName(s.getName()))).allowUnsetRegToAvoidLatch
val exceptionContext = Reg(ExceptionCause()) val exceptionContext = Reg(ExceptionCause(codeWidth))
val exceptionTargetPrivilegeUncapped = U"11" val exceptionTargetPrivilegeUncapped = U"11"
switch(exceptionContext.code){ switch(exceptionContext.code){
@ -876,17 +877,19 @@ class CsrPlugin(val config: CsrPluginConfig) extends Plugin[VexRiscv] with Excep
val groupedByStage = exceptionPortsInfos.map(_.stage).distinct.map(s => { val groupedByStage = exceptionPortsInfos.map(_.stage).distinct.map(s => {
val stagePortsInfos = exceptionPortsInfos.filter(_.stage == s).sortWith(_.priority > _.priority) val stagePortsInfos = exceptionPortsInfos.filter(_.stage == s).sortWith(_.priority > _.priority)
val stagePort = stagePortsInfos.length match{ val stagePort = stagePortsInfos.length match{
case 1 => stagePortsInfos.head.port case 1 => {
stagePortsInfos.head.port.translateWith(stagePortsInfos.head.port.payload.resizeCode(codeWidth))
}
case _ => { case _ => {
val groupedPort = Flow(ExceptionCause()) val groupedPort = Flow(ExceptionCause(codeWidth))
val valids = stagePortsInfos.map(_.port.valid) val valids = stagePortsInfos.map(_.port.valid)
val codes = stagePortsInfos.map(_.port.payload) val codes = stagePortsInfos.map(_.port.payload.resizeCode(codeWidth))
groupedPort.valid := valids.orR groupedPort.valid := valids.orR
groupedPort.payload := MuxOH(OHMasking.first(stagePortsInfos.map(_.port.valid).asBits), codes) groupedPort.payload := MuxOH(OHMasking.first(stagePortsInfos.map(_.port.valid).asBits), codes)
groupedPort groupedPort
} }
} }
ExceptionPortInfo(stagePort,s,0) ExceptionPortInfo(stagePort,s,0, codeWidth)
}) })
val sortedByStage = groupedByStage.sortWith((a, b) => pipeline.indexOf(a.stage) < pipeline.indexOf(b.stage)) val sortedByStage = groupedByStage.sortWith((a, b) => pipeline.indexOf(a.stage) < pipeline.indexOf(b.stage))

View File

@ -16,9 +16,9 @@ class HaltOnExceptionPlugin() extends Plugin[VexRiscv] with ExceptionService {
//Mannage ExceptionService calls //Mannage ExceptionService calls
val exceptionPortsInfos = ArrayBuffer[ExceptionPortInfo]() val exceptionPortsInfos = ArrayBuffer[ExceptionPortInfo]()
def exceptionCodeWidth = 4 def exceptionCodeWidth = 4
override def newExceptionPort(stage : Stage, priority : Int = 0) = { override def newExceptionPort(stage : Stage, priority : Int = 0, codeWidth : Int = 4) = {
val interface = Flow(ExceptionCause()) val interface = Flow(ExceptionCause(4))
exceptionPortsInfos += ExceptionPortInfo(interface,stage,priority) exceptionPortsInfos += ExceptionPortInfo(interface,stage,priority, codeWidth)
interface interface
} }
override def isExceptionPending(stage : Stage): Bool = False override def isExceptionPending(stage : Stage): Bool = False