xref: /XiangShan/src/main/scala/xiangshan/backend/fu/NewCSR/CSREvents/DretEvent.scala (revision e50a46ea7cd69edf32b220abd5fd54b1630b8b0f)
11e7040baSsinceforYypackage xiangshan.backend.fu.NewCSR.CSREvents
21e7040baSsinceforYy
31e7040baSsinceforYyimport chisel3._
41e7040baSsinceforYyimport chisel3.util._
5c1b28b66STang Haojinimport org.chipsalliance.cde.config.Parameters
61e7040baSsinceforYyimport xiangshan.backend.fu.NewCSR.CSRConfig.VaddrMaxWidth
7b6cec436SGuanghui Chengimport xiangshan.backend.fu.NewCSR.CSRDefines.{HgatpMode, PrivMode, SatpMode, VirtMode}
81e7040baSsinceforYyimport xiangshan.backend.fu.NewCSR._
9c1b28b66STang Haojinimport xiangshan.AddrTransType
101e7040baSsinceforYy
111e7040baSsinceforYy
121e7040baSsinceforYyclass DretEventOutput extends Bundle with EventUpdatePrivStateOutput with EventOutputBase {
131e7040baSsinceforYy  val dcsr = ValidIO((new DcsrBundle).addInEvent(_.V, _.PRV))
14*e50a46eaSGuanghui Cheng  val mstatus = ValidIO((new MstatusBundle).addInEvent(_.MPRV, _.MDT, _.SDT))
15*e50a46eaSGuanghui Cheng  val vsstatus = ValidIO((new SstatusBundle).addInEvent(_.SDT))
166057352aSXuan Hu  val debugMode = ValidIO(Bool())
17a7a6d0a6Schengguanghui  val debugIntrEnable = ValidIO(Bool())
18c1b28b66STang Haojin  val targetPc = ValidIO(new TargetPCBundle)
191e7040baSsinceforYy}
201e7040baSsinceforYy
211e7040baSsinceforYyclass DretEventInput extends Bundle {
221e7040baSsinceforYy  val dcsr = Input(new DcsrBundle)
230f9a14c6Schengguanghui  val dpc = Input(new Epc)
241e7040baSsinceforYy  val mstatus = Input(new MstatusBundle)
25*e50a46eaSGuanghui Cheng  val vsstatus = Input(new SstatusBundle)
26c1b28b66STang Haojin  val satp = Input(new SatpBundle)
27c1b28b66STang Haojin  val vsatp = Input(new SatpBundle)
28c1b28b66STang Haojin  val hgatp = Input(new HgatpBundle)
291e7040baSsinceforYy}
301e7040baSsinceforYy
31c1b28b66STang Haojinclass DretEventModule(implicit p: Parameters) extends Module with CSREventBase {
321e7040baSsinceforYy  val in = IO(new DretEventInput)
331e7040baSsinceforYy  val out = IO(new DretEventOutput)
341e7040baSsinceforYy
35c1b28b66STang Haojin  private val satp = in.satp
36c1b28b66STang Haojin  private val vsatp = in.vsatp
37c1b28b66STang Haojin  private val hgatp = in.hgatp
38c1b28b66STang Haojin  private val nextPrivState = out.privState.bits
39c1b28b66STang Haojin
40c1b28b66STang Haojin  private val instrAddrTransType = AddrTransType(
41c1b28b66STang Haojin    bare = nextPrivState.isModeM ||
42c1b28b66STang Haojin           (!nextPrivState.isVirtual && satp.MODE === SatpMode.Bare) ||
43c1b28b66STang Haojin           (nextPrivState.isVirtual && vsatp.MODE === SatpMode.Bare && hgatp.MODE === HgatpMode.Bare),
44c1b28b66STang Haojin    sv39 = !nextPrivState.isModeM && !nextPrivState.isVirtual && satp.MODE === SatpMode.Sv39 ||
45c1b28b66STang Haojin           nextPrivState.isVirtual && vsatp.MODE === SatpMode.Sv39,
46c1b28b66STang Haojin    sv48 = !nextPrivState.isModeM && !nextPrivState.isVirtual && satp.MODE === SatpMode.Sv48 ||
47c1b28b66STang Haojin           nextPrivState.isVirtual && vsatp.MODE === SatpMode.Sv48,
48c1b28b66STang Haojin    sv39x4 = nextPrivState.isVirtual && vsatp.MODE === SatpMode.Bare && hgatp.MODE === HgatpMode.Sv39x4,
49c1b28b66STang Haojin    sv48x4 = nextPrivState.isVirtual && vsatp.MODE === SatpMode.Bare && hgatp.MODE === HgatpMode.Sv48x4
50c1b28b66STang Haojin  )
51c1b28b66STang Haojin
521e7040baSsinceforYy  out := DontCare
531e7040baSsinceforYy
546057352aSXuan Hu  out.debugMode.valid       := valid
551e7040baSsinceforYy  out.privState.valid       := valid
561e7040baSsinceforYy  out.dcsr.valid            := valid
571e7040baSsinceforYy  out.mstatus.valid         := valid
58*e50a46eaSGuanghui Cheng  out.vsstatus.valid        := valid
59a7a6d0a6Schengguanghui  out.debugIntrEnable.valid := valid
601e7040baSsinceforYy  out.targetPc.valid        := valid
611e7040baSsinceforYy
6294c2cc17SsinceforYy  out.privState.bits.PRVM     := in.dcsr.PRV.asUInt
63b6cec436SGuanghui Cheng  out.privState.bits.V        := Mux(in.dcsr.PRV === PrivMode.M, VirtMode.Off.asUInt, in.dcsr.V.asUInt)
641734111cSchengguanghui  out.mstatus.bits.MPRV       := Mux(!out.privState.bits.isModeM, 0.U, in.mstatus.MPRV.asUInt)
65*e50a46eaSGuanghui Cheng  out.mstatus.bits.MDT        := Mux(!out.privState.bits.isModeM, 0.U, in.mstatus.MDT.asBool)
66*e50a46eaSGuanghui Cheng  out.mstatus.bits.SDT        := Mux(out.privState.bits.isVirtual || out.privState.bits.isModeHU, 0.U, in.mstatus.SDT.asBool)
67*e50a46eaSGuanghui Cheng  out.vsstatus.bits.SDT       := Mux(out.privState.bits.isModeVU, 0.U, in.vsstatus.SDT.asBool)
688419d406SXuan Hu  out.debugMode.bits          := false.B
69a7a6d0a6Schengguanghui  out.debugIntrEnable.bits    := true.B
70c1b28b66STang Haojin  out.targetPc.bits.pc        := in.dpc.asUInt
71c1b28b66STang Haojin  out.targetPc.bits.raiseIPF  := instrAddrTransType.checkPageFault(in.dpc.asUInt)
72c1b28b66STang Haojin  out.targetPc.bits.raiseIAF  := instrAddrTransType.checkAccessFault(in.dpc.asUInt)
73c1b28b66STang Haojin  out.targetPc.bits.raiseIGPF := instrAddrTransType.checkGuestPageFault(in.dpc.asUInt)
741e7040baSsinceforYy}
751e7040baSsinceforYy
76cb36ac0fSXuan Hutrait DretEventSinkBundle extends EventSinkBundle { self: CSRModule[_ <: CSRBundle] =>
771e7040baSsinceforYy  val retFromD = IO(Flipped(new DretEventOutput))
781e7040baSsinceforYy
79cb36ac0fSXuan Hu  addUpdateBundleInCSREnumType(retFromD.getBundleByName(self.modName.toLowerCase()))
801e7040baSsinceforYy
81cb36ac0fSXuan Hu  reconnectReg()
821e7040baSsinceforYy}
83