Let user of CSRFile decide when to set tval
I also renamed badaddr to tval (the correct name).
This commit is contained in:
parent
a59fc3bdaa
commit
efc6c9cbd3
@ -196,7 +196,7 @@ class CSRFileIO(implicit p: Parameters) extends CoreBundle
|
|||||||
val retire = UInt(INPUT, log2Up(1+retireWidth))
|
val retire = UInt(INPUT, log2Up(1+retireWidth))
|
||||||
val cause = UInt(INPUT, xLen)
|
val cause = UInt(INPUT, xLen)
|
||||||
val pc = UInt(INPUT, vaddrBitsExtended)
|
val pc = UInt(INPUT, vaddrBitsExtended)
|
||||||
val badaddr = UInt(INPUT, vaddrBitsExtended)
|
val tval = UInt(INPUT, vaddrBitsExtended)
|
||||||
val time = UInt(OUTPUT, xLen)
|
val time = UInt(OUTPUT, xLen)
|
||||||
val fcsr_rm = Bits(OUTPUT, FPConstants.RM_SZ)
|
val fcsr_rm = Bits(OUTPUT, FPConstants.RM_SZ)
|
||||||
val fcsr_flags = Valid(Bits(width = FPConstants.FLAGS_SZ)).flip
|
val fcsr_flags = Valid(Bits(width = FPConstants.FLAGS_SZ)).flip
|
||||||
@ -527,12 +527,6 @@ class CSRFile(perfEventSets: EventSets = new EventSets(Seq()))(implicit p: Param
|
|||||||
assert(!reg_singleStepped || io.retire === UInt(0))
|
assert(!reg_singleStepped || io.retire === UInt(0))
|
||||||
|
|
||||||
val epc = formEPC(io.pc)
|
val epc = formEPC(io.pc)
|
||||||
val write_badaddr = exception && cause.isOneOf(Causes.illegal_instruction, Causes.breakpoint,
|
|
||||||
Causes.misaligned_load, Causes.misaligned_store,
|
|
||||||
Causes.load_access, Causes.store_access, Causes.fetch_access,
|
|
||||||
Causes.load_page_fault, Causes.store_page_fault, Causes.fetch_page_fault)
|
|
||||||
val badaddr_value = Mux(write_badaddr, io.badaddr, 0.U)
|
|
||||||
|
|
||||||
val noCause :: mCause :: hCause :: sCause :: uCause :: Nil = Enum(5)
|
val noCause :: mCause :: hCause :: sCause :: uCause :: Nil = Enum(5)
|
||||||
val xcause_dest = Wire(init = noCause)
|
val xcause_dest = Wire(init = noCause)
|
||||||
|
|
||||||
@ -549,7 +543,7 @@ class CSRFile(perfEventSets: EventSets = new EventSets(Seq()))(implicit p: Param
|
|||||||
reg_sepc := epc
|
reg_sepc := epc
|
||||||
reg_scause := cause
|
reg_scause := cause
|
||||||
xcause_dest := sCause
|
xcause_dest := sCause
|
||||||
reg_sbadaddr := badaddr_value
|
reg_sbadaddr := io.tval
|
||||||
reg_mstatus.spie := reg_mstatus.sie
|
reg_mstatus.spie := reg_mstatus.sie
|
||||||
reg_mstatus.spp := reg_mstatus.prv
|
reg_mstatus.spp := reg_mstatus.prv
|
||||||
reg_mstatus.sie := false
|
reg_mstatus.sie := false
|
||||||
@ -558,7 +552,7 @@ class CSRFile(perfEventSets: EventSets = new EventSets(Seq()))(implicit p: Param
|
|||||||
reg_mepc := epc
|
reg_mepc := epc
|
||||||
reg_mcause := cause
|
reg_mcause := cause
|
||||||
xcause_dest := mCause
|
xcause_dest := mCause
|
||||||
reg_mbadaddr := badaddr_value
|
reg_mbadaddr := io.tval
|
||||||
reg_mstatus.mpie := reg_mstatus.mie
|
reg_mstatus.mpie := reg_mstatus.mie
|
||||||
reg_mstatus.mpp := trimPrivilege(reg_mstatus.prv)
|
reg_mstatus.mpp := trimPrivilege(reg_mstatus.prv)
|
||||||
reg_mstatus.mie := false
|
reg_mstatus.mie := false
|
||||||
@ -808,7 +802,7 @@ class CSRFile(perfEventSets: EventSets = new EventSets(Seq()))(implicit p: Param
|
|||||||
t.priv := Cat(reg_debug, reg_mstatus.prv)
|
t.priv := Cat(reg_debug, reg_mstatus.prv)
|
||||||
t.cause := cause
|
t.cause := cause
|
||||||
t.interrupt := cause(xLen-1)
|
t.interrupt := cause(xLen-1)
|
||||||
t.tval := badaddr_value
|
t.tval := io.tval
|
||||||
}
|
}
|
||||||
|
|
||||||
def chooseInterrupt(masksIn: Seq[UInt]): (Bool, UInt) = {
|
def chooseInterrupt(masksIn: Seq[UInt]): (Bool, UInt) = {
|
||||||
|
@ -545,7 +545,11 @@ class Rocket(implicit p: Parameters) extends CoreModule()(p)
|
|||||||
csr.io.fcsr_flags := io.fpu.fcsr_flags
|
csr.io.fcsr_flags := io.fpu.fcsr_flags
|
||||||
csr.io.rocc_interrupt := io.rocc.interrupt
|
csr.io.rocc_interrupt := io.rocc.interrupt
|
||||||
csr.io.pc := wb_reg_pc
|
csr.io.pc := wb_reg_pc
|
||||||
csr.io.badaddr := encodeVirtualAddress(wb_reg_wdata, wb_reg_wdata)
|
val tval_valid = wb_xcpt && wb_cause.isOneOf(Causes.illegal_instruction, Causes.breakpoint,
|
||||||
|
Causes.misaligned_load, Causes.misaligned_store,
|
||||||
|
Causes.load_access, Causes.store_access, Causes.fetch_access,
|
||||||
|
Causes.load_page_fault, Causes.store_page_fault, Causes.fetch_page_fault)
|
||||||
|
csr.io.tval := Mux(tval_valid, encodeVirtualAddress(wb_reg_wdata, wb_reg_wdata), 0.U)
|
||||||
io.ptw.ptbr := csr.io.ptbr
|
io.ptw.ptbr := csr.io.ptbr
|
||||||
io.ptw.status := csr.io.status
|
io.ptw.status := csr.io.status
|
||||||
io.ptw.pmp := csr.io.pmp
|
io.ptw.pmp := csr.io.pmp
|
||||||
|
Loading…
Reference in New Issue
Block a user