Don't permit vectoring of high interrupts
Send them to the base of the vector to obviate an adder
This commit is contained in:
		@@ -482,7 +482,7 @@ class CSRFile(perfEventSets: EventSets = new EventSets(Seq()))(implicit p: Param
 | 
			
		||||
  val cause =
 | 
			
		||||
    Mux(insn_call, reg_mstatus.prv + Causes.user_ecall,
 | 
			
		||||
    Mux[UInt](insn_break, Causes.breakpoint, io.cause))
 | 
			
		||||
  val cause_lsbs = cause(log2Up(xLen)-1,0)
 | 
			
		||||
  val cause_lsbs = cause(io.trace.head.cause.getWidth-1, 0)
 | 
			
		||||
  val causeIsDebugInt = cause(xLen-1) && cause_lsbs === CSR.debugIntCause
 | 
			
		||||
  val causeIsDebugTrigger = !cause(xLen-1) && cause_lsbs === CSR.debugTriggerCause
 | 
			
		||||
  val causeIsDebugBreak = !cause(xLen-1) && insn_break && Cat(reg_dcsr.ebreakm, reg_dcsr.ebreakh, reg_dcsr.ebreaks, reg_dcsr.ebreaku)(reg_mstatus.prv)
 | 
			
		||||
@@ -495,7 +495,8 @@ class CSRFile(perfEventSets: EventSets = new EventSets(Seq()))(implicit p: Param
 | 
			
		||||
    val base = Mux(delegate, reg_stvec.sextTo(vaddrBitsExtended), reg_mtvec)
 | 
			
		||||
    val interruptOffset = cause(mtvecInterruptAlign-1, 0) << mtvecBaseAlign
 | 
			
		||||
    val interruptVec = Cat(base >> (mtvecInterruptAlign + mtvecBaseAlign), interruptOffset)
 | 
			
		||||
    Mux(base(0) && cause(cause.getWidth-1), interruptVec, base)
 | 
			
		||||
    val doVector = base(0) && cause(cause.getWidth-1) && (cause_lsbs >> mtvecInterruptAlign) === 0
 | 
			
		||||
    Mux(doVector, interruptVec, base)
 | 
			
		||||
  }
 | 
			
		||||
  val tvec = Mux(trapToDebug, debugTVec, notDebugTVec)
 | 
			
		||||
  io.evec := tvec
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user