xref: /XiangShan/src/main/scala/xiangshan/backend/fu/NewCSR/CSREvents/TrapEntryMNEvent.scala (revision cb36ac0f37d64c496ebf443ea86082c516f12938)
1c2a2229dSlewislzhpackage xiangshan.backend.fu.NewCSR.CSREvents
2c2a2229dSlewislzh
3c2a2229dSlewislzhimport chisel3._
4c2a2229dSlewislzhimport chisel3.util._
5c2a2229dSlewislzhimport org.chipsalliance.cde.config.Parameters
6c2a2229dSlewislzhimport utility.SignExt
7c2a2229dSlewislzhimport xiangshan.ExceptionNO
8c2a2229dSlewislzhimport xiangshan.backend.fu.NewCSR.CSRBundles.{CauseBundle, OneFieldBundle, PrivState}
9c2a2229dSlewislzhimport xiangshan.backend.fu.NewCSR.CSRConfig.{VaddrMaxWidth, XLEN}
10c2a2229dSlewislzhimport xiangshan.backend.fu.NewCSR._
11c1b28b66STang Haojinimport xiangshan.AddrTransType
12c2a2229dSlewislzh
13c2a2229dSlewislzhclass TrapEntryMNEventOutput extends Bundle with EventUpdatePrivStateOutput with EventOutputBase  {
14c2a2229dSlewislzh  val mnstatus = ValidIO((new MnstatusBundle ).addInEvent(_.MNPP, _.MNPV, _.NMIE))
15c2a2229dSlewislzh  val mnepc    = ValidIO((new Epc           ).addInEvent(_.epc))
16c2a2229dSlewislzh  val mncause  = ValidIO((new CauseBundle   ).addInEvent(_.Interrupt, _.ExceptionCode))
17c1b28b66STang Haojin  val targetPc = ValidIO(new TargetPCBundle)
18c2a2229dSlewislzh}
19c2a2229dSlewislzh
20c2a2229dSlewislzhclass TrapEntryMNEventModule(implicit val p: Parameters) extends Module with CSREventBase {
21c2a2229dSlewislzh  val in = IO(new TrapEntryEventInput)
22c2a2229dSlewislzh  val out = IO(new TrapEntryMNEventOutput)
23c2a2229dSlewislzh
24c2a2229dSlewislzh  private val current = in
25c2a2229dSlewislzh  private val iMode = current.iMode
26c2a2229dSlewislzh  private val satp  = current.satp
27c2a2229dSlewislzh  private val vsatp = current.vsatp
28c2a2229dSlewislzh  private val hgatp = current.hgatp
29c2a2229dSlewislzh
30c2a2229dSlewislzh  private val highPrioTrapNO = in.causeNO.ExceptionCode.asUInt
31c2a2229dSlewislzh  private val isInterrupt = in.causeNO.Interrupt.asBool
32c2a2229dSlewislzh
33c1b28b66STang Haojin  private val isFetchMalAddr = in.isFetchMalAddr
34c1b28b66STang Haojin
35c2a2229dSlewislzh  private val trapPC = genTrapVA(
36c2a2229dSlewislzh    iMode,
37c2a2229dSlewislzh    satp,
38c2a2229dSlewislzh    vsatp,
39c2a2229dSlewislzh    hgatp,
40c2a2229dSlewislzh    in.trapPc,
41c2a2229dSlewislzh  )
42c2a2229dSlewislzh  out := DontCare
43c2a2229dSlewislzh
44c2a2229dSlewislzh  out.privState.valid := valid
45c2a2229dSlewislzh  out.mnstatus.valid  := valid
46c2a2229dSlewislzh  out.mnepc.valid     := valid
47c2a2229dSlewislzh  out.mncause.valid   := valid
48c2a2229dSlewislzh  out.targetPc.valid  := valid
49c2a2229dSlewislzh
50c2a2229dSlewislzh  out.privState.bits             := PrivState.ModeM
51c2a2229dSlewislzh  out.mnstatus.bits.MNPP         := current.privState.PRVM
52c2a2229dSlewislzh  out.mnstatus.bits.MNPV         := current.privState.V
53c2a2229dSlewislzh  out.mnstatus.bits.NMIE         := 0.U
54c1b28b66STang Haojin  out.mnepc.bits.epc             := Mux(isFetchMalAddr, in.fetchMalTval(63, 1), trapPC(63, 1))
55c2a2229dSlewislzh  out.mncause.bits.Interrupt     := isInterrupt
56c2a2229dSlewislzh  out.mncause.bits.ExceptionCode := highPrioTrapNO
57c1b28b66STang Haojin  out.targetPc.bits.pc           := in.pcFromXtvec
58c1b28b66STang Haojin  out.targetPc.bits.raiseIPF     := false.B
59c1b28b66STang Haojin  out.targetPc.bits.raiseIAF     := AddrTransType(bare = true).checkAccessFault(in.pcFromXtvec)
60c1b28b66STang Haojin  out.targetPc.bits.raiseIGPF    := false.B
61c2a2229dSlewislzh
62c2a2229dSlewislzh}
63c2a2229dSlewislzh
64*cb36ac0fSXuan Hutrait TrapEntryMNEventSinkBundle extends EventSinkBundle { self: CSRModule[_ <: CSRBundle] =>
65c2a2229dSlewislzh  val trapToMN = IO(Flipped(new TrapEntryMNEventOutput))
66c2a2229dSlewislzh
67*cb36ac0fSXuan Hu  addUpdateBundleInCSREnumType(trapToMN.getBundleByName(self.modName.toLowerCase()))
68c2a2229dSlewislzh
69*cb36ac0fSXuan Hu  reconnectReg()
70c2a2229dSlewislzh}
71