xref: /XiangShan/src/main/scala/xiangshan/backend/fu/NewCSR/CSREvents/TrapEntryDEvent.scala (revision a751b11ae755be85ef2b74c2951705b349cc1eb2)
1a7a6d0a6Schengguanghuipackage xiangshan.backend.fu.NewCSR.CSREvents
2a7a6d0a6Schengguanghui
3a7a6d0a6Schengguanghuiimport chisel3._
47e0f64b0SGuanghui Chengimport chisel3.util._
5a7a6d0a6Schengguanghuiimport org.chipsalliance.cde.config.Parameters
6a7a6d0a6Schengguanghuiimport utility.{SignExt, ZeroExt}
77e0f64b0SGuanghui Chengimport xiangshan.{ExceptionNO, HasXSParameter, TriggerAction}
8a7a6d0a6Schengguanghuiimport xiangshan.ExceptionNO._
9a7a6d0a6Schengguanghuiimport xiangshan.backend.fu.NewCSR
10a7a6d0a6Schengguanghuiimport xiangshan.backend.fu.NewCSR.CSRBundles.{CauseBundle, OneFieldBundle, PrivState}
11a7a6d0a6Schengguanghuiimport xiangshan.backend.fu.NewCSR.CSRConfig.{VaddrMaxWidth, XLEN}
12a7a6d0a6Schengguanghuiimport xiangshan.backend.fu.NewCSR.CSRDefines.SatpMode
13a7a6d0a6Schengguanghuiimport xiangshan.backend.fu.NewCSR._
14a7a6d0a6Schengguanghui
15a7a6d0a6Schengguanghui
16a7a6d0a6Schengguanghuiclass TrapEntryDEventOutput extends Bundle with EventUpdatePrivStateOutput with EventOutputBase {
171734111cSchengguanghui  val dcsr            = ValidIO((new DcsrBundle).addInEvent(_.CAUSE, _.V, _.PRV))
180f9a14c6Schengguanghui  val dpc             = ValidIO((new Epc       ).addInEvent(_.epc))
19c1b28b66STang Haojin  val targetPc        = ValidIO(new TargetPCBundle)
20a7a6d0a6Schengguanghui  val debugMode       = ValidIO(Bool())
21a7a6d0a6Schengguanghui  val debugIntrEnable = ValidIO(Bool())
22a7a6d0a6Schengguanghui}
23a7a6d0a6Schengguanghui
24a7a6d0a6Schengguanghuiclass TrapEntryDEventInput(implicit override val p: Parameters) extends TrapEntryEventInput{
25a7a6d0a6Schengguanghui  val hasTrap                      = Input(Bool())
26a7a6d0a6Schengguanghui  val debugMode                    = Input(Bool())
27a7a6d0a6Schengguanghui  val hasDebugIntr                 = Input(Bool())
287e0f64b0SGuanghui Cheng  val triggerEnterDebugMode        = Input(Bool())
29a7a6d0a6Schengguanghui  val hasDebugEbreakException      = Input(Bool())
30a7a6d0a6Schengguanghui  val hasSingleStep                = Input(Bool())
31a7a6d0a6Schengguanghui  val breakPoint                   = Input(Bool())
32*a751b11aSchengguanghui  val criticalErrorStateEnterDebug = Input(Bool())
33a7a6d0a6Schengguanghui}
34a7a6d0a6Schengguanghui
35a7a6d0a6Schengguanghuiclass TrapEntryDEventModule(implicit val p: Parameters) extends Module with CSREventBase with DebugMMIO {
36a7a6d0a6Schengguanghui  val in = IO(new TrapEntryDEventInput)
37a7a6d0a6Schengguanghui  val out = IO(new TrapEntryDEventOutput)
38a7a6d0a6Schengguanghui
39a7a6d0a6Schengguanghui  private val current = in
400f9a14c6Schengguanghui  private val iMode   = current.iMode
410f9a14c6Schengguanghui  private val satp    = current.satp
420f9a14c6Schengguanghui  private val vsatp   = current.vsatp
430f9a14c6Schengguanghui  private val hgatp   = current.hgatp
440f9a14c6Schengguanghui
45a7a6d0a6Schengguanghui  private val hasTrap                      = in.hasTrap
46a7a6d0a6Schengguanghui  private val debugMode                    = in.debugMode
47a7a6d0a6Schengguanghui  private val hasDebugIntr                 = in.hasDebugIntr
48a7a6d0a6Schengguanghui  private val breakPoint                   = in.breakPoint
497e0f64b0SGuanghui Cheng  private val triggerEnterDebugMode        = in.triggerEnterDebugMode
50a7a6d0a6Schengguanghui  private val hasDebugEbreakException      = in.hasDebugEbreakException
51a7a6d0a6Schengguanghui  private val hasSingleStep                = in.hasSingleStep
52*a751b11aSchengguanghui  private val criticalErrorStateEnterDebug = in.criticalErrorStateEnterDebug
53a7a6d0a6Schengguanghui
54a7a6d0a6Schengguanghui  private val hasExceptionInDmode = debugMode && hasTrap
55a7a6d0a6Schengguanghui  val causeIntr = DcsrCause.Haltreq.asUInt
56*a751b11aSchengguanghui  val causeExp = MuxCase(DcsrCause.None.asUInt, Seq(
57*a751b11aSchengguanghui    criticalErrorStateEnterDebug -> DcsrCause.Other.asUInt,
587e0f64b0SGuanghui Cheng    triggerEnterDebugMode        -> DcsrCause.Trigger.asUInt,
59a7a6d0a6Schengguanghui    hasDebugEbreakException      -> DcsrCause.Ebreak.asUInt,
60a7a6d0a6Schengguanghui    hasSingleStep                -> DcsrCause.Step.asUInt
61a7a6d0a6Schengguanghui  ))
62a7a6d0a6Schengguanghui
630f9a14c6Schengguanghui  private val trapPC = genTrapVA(
640f9a14c6Schengguanghui    iMode,
650f9a14c6Schengguanghui    satp,
660f9a14c6Schengguanghui    vsatp,
670f9a14c6Schengguanghui    hgatp,
680f9a14c6Schengguanghui    in.trapPc,
690f9a14c6Schengguanghui  )
70a7a6d0a6Schengguanghui
71a7a6d0a6Schengguanghui  // ebreak jump debugEntry not debugException in dmode
72a7a6d0a6Schengguanghui  // debug rom make hart write 0 to DebugMMIO.EXCEPTION when exception happened in debugMode.
73a7a6d0a6Schengguanghui  // let debug module known hart got an exception.
74657432e4Schengguanghui  // note: Need't know exception number in debugMode.
75657432e4Schengguanghui  //       exception(EX_BP) must be ebreak here!
76a7a6d0a6Schengguanghui  val debugPc = Mux(hasExceptionInDmode && !breakPoint, DebugException.U, DebugEntry.U)
77a7a6d0a6Schengguanghui
78a7a6d0a6Schengguanghui  out := DontCare
79a7a6d0a6Schengguanghui  // output
80a7a6d0a6Schengguanghui  out.dcsr.valid              := valid
81a7a6d0a6Schengguanghui  out.dpc.valid               := valid
82a7a6d0a6Schengguanghui  // !debugMode trap || debugMode hasExp
83a7a6d0a6Schengguanghui  out.targetPc.valid          := valid || hasExceptionInDmode
84a7a6d0a6Schengguanghui  out.debugMode.valid         := valid
85a7a6d0a6Schengguanghui  out.privState.valid         := valid
86a7a6d0a6Schengguanghui  out.debugIntrEnable.valid   := valid
87a7a6d0a6Schengguanghui
881734111cSchengguanghui  out.dcsr.bits.V             := current.privState.V.asUInt
89a7a6d0a6Schengguanghui  out.dcsr.bits.PRV           := current.privState.PRVM.asUInt
90a7a6d0a6Schengguanghui  out.dcsr.bits.CAUSE         := Mux(hasDebugIntr, causeIntr, causeExp)
913e8a0170SXuan Hu  out.dpc.bits.epc            := trapPC(63, 1)
92a7a6d0a6Schengguanghui
93c1b28b66STang Haojin  out.targetPc.bits.pc        := debugPc
94c1b28b66STang Haojin  out.targetPc.bits.raiseIPF  := false.B
95c1b28b66STang Haojin  out.targetPc.bits.raiseIAF  := false.B
96c1b28b66STang Haojin  out.targetPc.bits.raiseIGPF := false.B
97a7a6d0a6Schengguanghui  out.debugMode.bits          := true.B
98a7a6d0a6Schengguanghui  out.privState.bits          := PrivState.ModeM
99a7a6d0a6Schengguanghui  out.debugIntrEnable.bits    := false.B
100a7a6d0a6Schengguanghui
101a7a6d0a6Schengguanghui}
102a7a6d0a6Schengguanghui
103cb36ac0fSXuan Hutrait TrapEntryDEventSinkBundle extends EventSinkBundle { self: CSRModule[_ <: CSRBundle] =>
104a7a6d0a6Schengguanghui  val trapToD = IO(Flipped(new TrapEntryDEventOutput))
105a7a6d0a6Schengguanghui
106cb36ac0fSXuan Hu  addUpdateBundleInCSREnumType(trapToD.getBundleByName(self.modName.toLowerCase()))
107a7a6d0a6Schengguanghui
108cb36ac0fSXuan Hu  reconnectReg()
109a7a6d0a6Schengguanghui}
110