Don't register interrupts in CSRFile
They are usually registered outside the tile in a CDC.
This commit is contained in:
parent
5cfe070932
commit
2786e42d99
@ -222,7 +222,6 @@ class CSRFile(perfEventSets: EventSets = new EventSets(Seq()))(implicit p: Param
|
||||
reset_dcsr.xdebugver := 1
|
||||
reset_dcsr.prv := PRV.M
|
||||
val reg_dcsr = Reg(init=reset_dcsr)
|
||||
val reg_debugint = Reg(Bool())
|
||||
|
||||
val (supported_interrupts, delegable_interrupts) = {
|
||||
val sup = Wire(new MIP)
|
||||
@ -304,13 +303,17 @@ class CSRFile(perfEventSets: EventSets = new EventSets(Seq()))(implicit p: Param
|
||||
val hpm_mask = reg_mcounteren & Mux((!usingVM).B || reg_mstatus.prv === PRV.S, delegable_counters.U, reg_scounteren)
|
||||
|
||||
val mip = Wire(init=reg_mip)
|
||||
mip.lip := (io.interrupts.lip: Seq[Bool])
|
||||
mip.mtip := io.interrupts.mtip
|
||||
mip.msip := io.interrupts.msip
|
||||
mip.meip := io.interrupts.meip
|
||||
// seip is the OR of reg_mip.seip and the actual line from the PLIC
|
||||
io.interrupts.seip.foreach { mip.seip := reg_mip.seip || RegNext(_) }
|
||||
mip.rocc := io.rocc_interrupt
|
||||
val read_mip = mip.asUInt & supported_interrupts
|
||||
|
||||
val pending_interrupts = read_mip & reg_mie
|
||||
val d_interrupts = reg_debugint << CSR.debugIntCause
|
||||
val d_interrupts = io.interrupts.debug << CSR.debugIntCause
|
||||
val m_interrupts = Mux(reg_mstatus.prv <= PRV.S || (reg_mstatus.prv === PRV.M && reg_mstatus.mie), pending_interrupts & ~reg_mideleg, UInt(0))
|
||||
val s_interrupts = Mux(reg_mstatus.prv < PRV.S || (reg_mstatus.prv === PRV.S && reg_mstatus.sie), pending_interrupts & reg_mideleg, UInt(0))
|
||||
val (anyInterrupt, whichInterrupt) = chooseInterrupt(Seq(s_interrupts, m_interrupts, d_interrupts))
|
||||
@ -506,7 +509,7 @@ class CSRFile(perfEventSets: EventSets = new EventSets(Seq()))(implicit p: Param
|
||||
assert(PopCount(insn_ret :: insn_call :: insn_break :: io.exception :: Nil) <= 1, "these conditions must be mutually exclusive")
|
||||
|
||||
when (insn_wfi && !io.singleStep && !reg_debug) { reg_wfi := true }
|
||||
when (pending_interrupts.orR || exception || reg_debugint) { reg_wfi := false }
|
||||
when (pending_interrupts.orR || exception || io.interrupts.debug) { reg_wfi := false }
|
||||
assert(!reg_wfi || io.retire === UInt(0))
|
||||
|
||||
when (io.retire(0) || exception) { reg_singleStepped := true }
|
||||
@ -719,12 +722,6 @@ class CSRFile(perfEventSets: EventSets = new EventSets(Seq()))(implicit p: Param
|
||||
}
|
||||
}
|
||||
|
||||
reg_mip.lip := (io.interrupts.lip: Seq[Bool])
|
||||
reg_mip.mtip := io.interrupts.mtip
|
||||
reg_mip.msip := io.interrupts.msip
|
||||
reg_mip.meip := io.interrupts.meip
|
||||
reg_debugint := io.interrupts.debug
|
||||
|
||||
if (!usingVM) {
|
||||
reg_mideleg := 0
|
||||
reg_medeleg := 0
|
||||
|
Loading…
Reference in New Issue
Block a user