fix(cache): sv39高位需要一致
This commit is contained in:
parent
39d5e8e043
commit
7d795f6d80
|
@ -282,7 +282,12 @@ class DCache(cacheConfig: CacheConfig)(implicit cpuConfig: CpuConfig) extends Mo
|
||||||
|
|
||||||
val access_fault = RegInit(false.B)
|
val access_fault = RegInit(false.B)
|
||||||
val page_fault = RegInit(false.B)
|
val page_fault = RegInit(false.B)
|
||||||
val addr_err = io.cpu.addr(XLEN - 1, VADDR_WID).orR
|
// sv39的63-39位需要与第38位相同
|
||||||
|
val addr_err = io.cpu
|
||||||
|
.addr(XLEN - 1, VADDR_WID)
|
||||||
|
.asBools
|
||||||
|
.map(_ =/= io.cpu.addr(VADDR_WID - 1))
|
||||||
|
.reduce(_ || _)
|
||||||
|
|
||||||
io.cpu.access_fault := access_fault
|
io.cpu.access_fault := access_fault
|
||||||
io.cpu.page_fault := page_fault
|
io.cpu.page_fault := page_fault
|
||||||
|
|
|
@ -204,7 +204,13 @@ class ICache(cacheConfig: CacheConfig)(implicit cpuConfig: CpuConfig) extends Mo
|
||||||
|
|
||||||
val access_fault = RegInit(false.B)
|
val access_fault = RegInit(false.B)
|
||||||
val page_fault = RegInit(false.B)
|
val page_fault = RegInit(false.B)
|
||||||
val addr_err = io.cpu.addr(use_next_addr)(XLEN - 1, VADDR_WID).orR
|
// sv39的63-39位需要与第38位相同
|
||||||
|
val addr_err =
|
||||||
|
io.cpu
|
||||||
|
.addr(use_next_addr)(XLEN - 1, VADDR_WID)
|
||||||
|
.asBools
|
||||||
|
.map(_ =/= io.cpu.addr(use_next_addr)(VADDR_WID - 1))
|
||||||
|
.reduce(_ || _)
|
||||||
|
|
||||||
io.cpu.access_fault := access_fault //TODO:实现cached段中的访存response错误
|
io.cpu.access_fault := access_fault //TODO:实现cached段中的访存response错误
|
||||||
io.cpu.page_fault := page_fault
|
io.cpu.page_fault := page_fault
|
||||||
|
|
|
@ -377,12 +377,12 @@ class Csr(implicit val cpuConfig: CpuConfig) extends Module with HasCSRConst {
|
||||||
mstatus := mstatusNew.asUInt
|
mstatus := mstatusNew.asUInt
|
||||||
}
|
}
|
||||||
|
|
||||||
val ret_target = Wire(UInt(VADDR_WID.W))
|
val ret_target = Wire(UInt(XLEN.W))
|
||||||
ret_target := DontCare
|
ret_target := DontCare
|
||||||
|
|
||||||
val trap_target = Wire(UInt(VADDR_WID.W))
|
val trap_target = Wire(UInt(XLEN.W))
|
||||||
val tvec = Mux(delegS, stvec, mtvec)
|
val tvec = Mux(delegS, stvec, mtvec)
|
||||||
trap_target := (tvec(VADDR_WID - 1, 2) << 2) + Mux(
|
trap_target := (tvec(XLEN - 1, 2) << 2) + Mux(
|
||||||
tvec(0) && raise_interrupt,
|
tvec(0) && raise_interrupt,
|
||||||
(causeNO << 2),
|
(causeNO << 2),
|
||||||
0.U
|
0.U
|
||||||
|
|
Loading…
Reference in New Issue