fix: mem有例外时,exe不应当读写csr

This commit is contained in:
Liphen 2023-12-09 17:53:56 +08:00
parent 86add2c2c8
commit 2ff3d1c000
1 changed files with 8 additions and 7 deletions

View File

@ -239,8 +239,12 @@ class Csr(implicit val config: CpuConfig) extends Module with HasCSRConst {
val mem_inst = mem_inst_info.inst val mem_inst = mem_inst_info.inst
val mem_valid = mem_inst_info.valid val mem_valid = mem_inst_info.valid
val mem_addr = mem_inst(31, 20) val mem_addr = mem_inst(31, 20)
val has_exception = mem_ex.exception.asUInt.orR
val has_interrupt = mem_ex.interrupt.asUInt.orR
val has_exc_int = has_exception || has_interrupt
// 不带前缀的信号为exe阶段的信号 // 不带前缀的信号为exe阶段的信号
val valid = io.executeUnit.in.valid val valid = io.executeUnit.in.valid && !has_exc_int
val info = io.executeUnit.in.info val info = io.executeUnit.in.info
val op = io.executeUnit.in.info.op val op = io.executeUnit.in.info.op
val fusel = io.executeUnit.in.info.fusel val fusel = io.executeUnit.in.info.fusel
@ -288,9 +292,6 @@ class Csr(implicit val config: CpuConfig) extends Module with HasCSRConst {
mem_addr === privUret && mem_inst_info.op === CSROpType.jmp && mem_inst_info.fusel === FuType.csr && mem_valid mem_addr === privUret && mem_inst_info.op === CSROpType.jmp && mem_inst_info.fusel === FuType.csr && mem_valid
ret := isMret || isSret || isUret ret := isMret || isSret || isUret
val has_exception = mem_ex.exception.asUInt.orR
val has_interrupt = mem_ex.interrupt.asUInt.orR
val has_exc_int = has_exception || has_interrupt
val exceptionNO = ExcPriority.foldRight(0.U)((i: Int, sum: UInt) => Mux(mem_ex.exception(i), i.U, sum)) val exceptionNO = ExcPriority.foldRight(0.U)((i: Int, sum: UInt) => Mux(mem_ex.exception(i), i.U, sum))
val interruptNO = IntPriority.foldRight(0.U)((i: Int, sum: UInt) => Mux(mem_ex.interrupt(i), i.U, sum)) val interruptNO = IntPriority.foldRight(0.U)((i: Int, sum: UInt) => Mux(mem_ex.interrupt(i), i.U, sum))
val causeNO = (has_interrupt << (XLEN - 1)) | Mux(has_interrupt, interruptNO, exceptionNO) val causeNO = (has_interrupt << (XLEN - 1)) | Mux(has_interrupt, interruptNO, exceptionNO)