id级增加更多例外

This commit is contained in:
Liphen 2023-11-22 14:48:00 +08:00
parent e909de6dfb
commit cc842aff6e
3 changed files with 39 additions and 13 deletions

View File

@ -9,7 +9,8 @@ import cpu.CpuConfig
class ExceptionInfo extends Bundle { class ExceptionInfo extends Bundle {
val flush_req = Bool() val flush_req = Bool()
val excode = Vec(EXCODE_WID, Bool()) val excode = Vec(EXCODE_WID, Bool())
val int = Vec(INT_WID, Bool()) val interrupt = Vec(INT_WID, Bool())
val tval = UInt(XLEN.W)
} }
class SrcInfo extends Bundle { class SrcInfo extends Bundle {

View File

@ -25,7 +25,7 @@ class DataForwardToDecoderUnit extends Bundle {
val mem = new RegWrite() val mem = new RegWrite()
} }
class DecoderUnit(implicit val config: CpuConfig) extends Module with HasExceptionNO { class DecoderUnit(implicit val config: CpuConfig) extends Module with HasExceptionNO with HasCSRConst {
val io = IO(new Bundle { val io = IO(new Bundle {
// 输入 // 输入
val instFifo = new InstFifoDecoderUnit() val instFifo = new InstFifoDecoderUnit()
@ -104,6 +104,7 @@ class DecoderUnit(implicit val config: CpuConfig) extends Module with HasExcepti
val pc = io.instFifo.inst.map(_.pc) val pc = io.instFifo.inst.map(_.pc)
val inst = io.instFifo.inst.map(_.inst) val inst = io.instFifo.inst.map(_.inst)
val inst_info = decoder.map(_.io.out.inst_info) val inst_info = decoder.map(_.io.out.inst_info)
val priv_mode = io.csr.priv_mode
for (i <- 0 until (config.decoderNum)) { for (i <- 0 until (config.decoderNum)) {
decoder(i).io.in.inst := inst(i) decoder(i).io.in.inst := inst(i)
@ -111,8 +112,7 @@ class DecoderUnit(implicit val config: CpuConfig) extends Module with HasExcepti
val int = WireInit(0.U(INT_WID.W)) val int = WireInit(0.U(INT_WID.W))
BoringUtils.addSink(int, "intDecoderUnit") BoringUtils.addSink(int, "intDecoderUnit")
io.executeStage.inst0.ex.int.zip(int.asBools).map { case (x, y) => x := y } io.executeStage.inst0.ex.interrupt.zip(int.asBools).map { case (x, y) => x := y }
val hasInt = int.orR
io.executeStage.inst0.valid := !io.instFifo.info.empty io.executeStage.inst0.valid := !io.instFifo.info.empty
io.executeStage.inst0.pc := pc(0) io.executeStage.inst0.pc := pc(0)
@ -129,10 +129,24 @@ class DecoderUnit(implicit val config: CpuConfig) extends Module with HasExcepti
) )
io.executeStage.inst0.ex.flush_req := io.executeStage.inst0.ex.excode.asUInt.orR io.executeStage.inst0.ex.flush_req := io.executeStage.inst0.ex.excode.asUInt.orR
io.executeStage.inst0.ex.excode.map(_ := false.B) io.executeStage.inst0.ex.excode.map(_ := false.B)
io.executeStage.inst0.ex.excode(illegalInstr) := !decoder(0).io.out.inst_info.inst_valid &&
!hasInt && !io.instFifo.info.empty io.executeStage.inst0.ex.excode(illegalInstr) := !inst_info(0).inst_valid
io.executeStage.inst0.ex.excode(instrAccessFault) := io.instFifo.inst(0).acc_err io.executeStage.inst0.ex.excode(instrAccessFault) := io.instFifo.inst(0).acc_err
io.executeStage.inst0.ex.excode(instrAddrMisaligned) := io.instFifo.inst(0).addr_err io.executeStage.inst0.ex.excode(instrAddrMisaligned) := io.instFifo.inst(0).addr_err
io.executeStage.inst0.ex.excode(breakPoint) := inst_info(0).inst(31, 20) === privEbreak &&
inst_info(0).op === CSROpType.jmp
io.executeStage.inst0.ex.excode(ecallM) := inst_info(0).inst(31, 20) === privEcall &&
inst_info(0).op === CSROpType.jmp && priv_mode === ModeM
io.executeStage.inst0.ex.excode(ecallS) := inst_info(0).inst(31, 20) === privEcall &&
inst_info(0).op === CSROpType.jmp && priv_mode === ModeS
io.executeStage.inst0.ex.excode(ecallU) := inst_info(0).inst(31, 20) === privEcall &&
inst_info(0).op === CSROpType.jmp && priv_mode === ModeU
io.executeStage.inst0.ex.tval := Mux(
io.executeStage.inst0.ex.excode(instrAccessFault) || io.executeStage.inst0.ex.excode(instrAddrMisaligned),
io.instFifo.inst(0).pc,
0.U
)
io.executeStage.inst0.jb_info.jump_regiser := jumpCtrl.out.jump_register io.executeStage.inst0.jb_info.jump_regiser := jumpCtrl.out.jump_register
io.executeStage.inst0.jb_info.branch_inst := io.bpu.branch_inst io.executeStage.inst0.jb_info.branch_inst := io.bpu.branch_inst
@ -153,11 +167,26 @@ class DecoderUnit(implicit val config: CpuConfig) extends Module with HasExcepti
forwardCtrl.out.inst(1).src2.rdata, forwardCtrl.out.inst(1).src2.rdata,
decoder(1).io.out.inst_info.imm decoder(1).io.out.inst_info.imm
) )
io.executeStage.inst1.ex.flush_req := io.executeStage.inst1.ex.excode.asUInt.orR
io.executeStage.inst1.ex.excode.map(_ := false.B) io.executeStage.inst1.ex.excode.map(_ := false.B)
io.executeStage.inst1.ex.excode(illegalInstr) := !decoder(1).io.out.inst_info.inst_valid &&
!hasInt && !io.instFifo.info.almost_empty io.executeStage.inst1.ex.excode(illegalInstr) := !inst_info(1).inst_valid
io.executeStage.inst1.ex.excode(instrAccessFault) := io.instFifo.inst(1).acc_err io.executeStage.inst1.ex.excode(instrAccessFault) := io.instFifo.inst(1).acc_err
io.executeStage.inst1.ex.excode(instrAddrMisaligned) := io.instFifo.inst(1).addr_err io.executeStage.inst1.ex.excode(instrAddrMisaligned) := io.instFifo.inst(1).addr_err
io.executeStage.inst1.ex.excode(breakPoint) := inst_info(1).inst(31, 20) === privEbreak &&
inst_info(1).op === CSROpType.jmp
io.executeStage.inst1.ex.excode(ecallM) := inst_info(1).inst(31, 20) === privEcall &&
inst_info(1).op === CSROpType.jmp && priv_mode === ModeM
io.executeStage.inst1.ex.excode(ecallS) := inst_info(1).inst(31, 20) === privEcall &&
inst_info(1).op === CSROpType.jmp && priv_mode === ModeS
io.executeStage.inst1.ex.excode(ecallU) := inst_info(1).inst(31, 20) === privEcall &&
inst_info(1).op === CSROpType.jmp && priv_mode === ModeU
io.executeStage.inst1.ex.tval := Mux(
io.executeStage.inst1.ex.excode(instrAccessFault) || io.executeStage.inst1.ex.excode(instrAddrMisaligned),
io.instFifo.inst(1).pc,
0.U
)
} else { } else {
io.executeStage.inst1 := DontCare io.executeStage.inst1 := DontCare
} }

View File

@ -82,11 +82,7 @@ class MemoryUnit(implicit val config: CpuConfig) extends Module {
io.csr.in.inst(1).pc := io.writeBackStage.inst1.pc io.csr.in.inst(1).pc := io.writeBackStage.inst1.pc
io.csr.in.inst(1).ex := io.writeBackStage.inst1.ex io.csr.in.inst(1).ex := io.writeBackStage.inst1.ex
io.fetchUnit.flush := Mux( io.fetchUnit.flush := io.csr.out.flush
io.csr.out.flush,
io.csr.out.flush,
io.writeBackStage.inst0.inst_info.op === EXE_MTC0 && io.ctrl.allow_to_go
)
io.fetchUnit.flush_pc := Mux(io.csr.out.flush, io.csr.out.flush_pc, io.writeBackStage.inst0.pc + 4.U) io.fetchUnit.flush_pc := Mux(io.csr.out.flush, io.csr.out.flush_pc, io.writeBackStage.inst0.pc + 4.U)
io.ctrl.flush_req := io.fetchUnit.flush io.ctrl.flush_req := io.fetchUnit.flush