xref: /XiangShan/src/main/scala/xiangshan/backend/fu/NewCSR/HypervisorLevel.scala (revision 7768a97d1aa1e1d1ce6e8266e8aa1048a6c634a7)
1039cdc35SXuan Hupackage xiangshan.backend.fu.NewCSR
2039cdc35SXuan Hu
3039cdc35SXuan Huimport chisel3._
4039cdc35SXuan Huimport chisel3.util._
52c054816SsinceforYyimport freechips.rocketchip.rocket.CSRs
601cdded8SXuan Huimport org.chipsalliance.cde.config.Parameters
79c0fd28fSXuan Huimport utility.ZeroExt
8039cdc35SXuan Huimport xiangshan.backend.fu.NewCSR.CSRBundles._
9d0b87b97SXuan Huimport xiangshan.backend.fu.NewCSR.CSRConfig._
10d0b87b97SXuan Huimport xiangshan.backend.fu.NewCSR.CSRDefines.{CSRROField => RO, CSRRWField => RW, _}
11d0b87b97SXuan Huimport xiangshan.backend.fu.NewCSR.CSREnumTypeImplicitCast._
12237d4cfdSXuan Huimport xiangshan.backend.fu.NewCSR.CSREvents.{SretEventSinkBundle, TrapEntryHSEventSinkBundle}
13d0b87b97SXuan Huimport xiangshan.backend.fu.NewCSR.CSRFunc._
14d0b87b97SXuan Huimport xiangshan.backend.fu.NewCSR.ChiselRecordForField._
15*7768a97dSTang Haojinimport system.HasSoCParameter
16039cdc35SXuan Hu
17039cdc35SXuan Huimport scala.collection.immutable.SeqMap
18039cdc35SXuan Hu
19039cdc35SXuan Hutrait HypervisorLevel { self: NewCSR =>
20039cdc35SXuan Hu
21039cdc35SXuan Hu  val hstatus = Module(new HstatusModule)
222c054816SsinceforYy    .setAddr(CSRs.hstatus)
23039cdc35SXuan Hu
24039cdc35SXuan Hu  val hedeleg = Module(new CSRModule("Hedeleg", new HedelegBundle))
252c054816SsinceforYy    .setAddr(CSRs.hedeleg)
26039cdc35SXuan Hu
27fc89b31eSlinzhida  val hideleg = Module(new CSRModule("Hideleg", new HidelegBundle)
28fc89b31eSlinzhida    with HasIpIeBundle
29fc89b31eSlinzhida  {
30fc89b31eSlinzhida    regOut := reg & mideleg
31fc89b31eSlinzhida    regOut.getLocal.zip(reg.getLocal).zip(mideleg.getLocal).zip(mvien.getLocal).foreach {
32fc89b31eSlinzhida      case (((regOutLCI, regLCI), midelegLCI), mvienLCI) =>
33fc89b31eSlinzhida        regOutLCI := regLCI && (midelegLCI || mvienLCI)
34fc89b31eSlinzhida    }
35fc89b31eSlinzhida  })
362c054816SsinceforYy    .setAddr(CSRs.hideleg)
37039cdc35SXuan Hu
381d192ad8SXuan Hu  val hie = Module(new CSRModule("Hie", new HieBundle)
391d192ad8SXuan Hu    with HasIpIeBundle
401d192ad8SXuan Hu    with HypervisorBundle
411d192ad8SXuan Hu  {
421d192ad8SXuan Hu    val toMie = IO(new HieToMie)
43039cdc35SXuan Hu
441d192ad8SXuan Hu    val mieIsAlias = mideleg
451d192ad8SXuan Hu
461d192ad8SXuan Hu    bundle.getFields.map(_.lsb).foreach { num =>
471d192ad8SXuan Hu      val wtMie  = toMie.getByNum(num)
481d192ad8SXuan Hu      wtMie.specifyField(
491d192ad8SXuan Hu        _.valid := wen && mieIsAlias(num) && wtMie.bits.isRW.B,
501d192ad8SXuan Hu        _.bits  := wen && mieIsAlias(num) && wtMie.bits.isRW.B &< wdata(num),
511d192ad8SXuan Hu      )
521d192ad8SXuan Hu
531d192ad8SXuan Hu      regOut(num) := mieIsAlias(num) && wtMie.bits.isRW.B &< mie(num)
541d192ad8SXuan Hu    }
55237d4cfdSXuan Hu  })
562c054816SsinceforYy    .setAddr(CSRs.hie)
57039cdc35SXuan Hu
5823767fc3SZhaoyang You  val htimedelta = Module(new CSRModule("Htimedelta", new Htimedelta))
592c054816SsinceforYy    .setAddr(CSRs.htimedelta)
60039cdc35SXuan Hu
61237d4cfdSXuan Hu  val hcounteren = Module(new CSRModule("Hcounteren", new Counteren))
622c054816SsinceforYy    .setAddr(CSRs.hcounteren)
63039cdc35SXuan Hu
64039cdc35SXuan Hu  val hgeie = Module(new CSRModule("Hgeie", new HgeieBundle))
652c054816SsinceforYy    .setAddr(CSRs.hgeie)
66039cdc35SXuan Hu
671d192ad8SXuan Hu  val hvien = Module(new CSRModule("Hvien", new HvienBundle))
682c054816SsinceforYy    .setAddr(CSRs.hvien)
69039cdc35SXuan Hu
704016eee8SsinceforYy  val hvictl = Module(new CSRModule("Hvictl", new HvictlBundle))
712c054816SsinceforYy    .setAddr(CSRs.hvictl)
72039cdc35SXuan Hu
738fafb45aSsinceforYy  val henvcfg = Module(new CSRModule("Henvcfg", new HEnvCfg) with HasHypervisorEnvBundle {
746808b803SZehao Liu    when(!menvcfg.STCE) {
758fafb45aSsinceforYy      regOut.STCE := 0.U
768fafb45aSsinceforYy    }
77dd286b6aSYanqin Li    when(!menvcfg.PBMTE) {
78dd286b6aSYanqin Li      regOut.PBMTE := 0.U
79dd286b6aSYanqin Li    }
806808b803SZehao Liu    when(!menvcfg.DTE) {
816808b803SZehao Liu      regOut.DTE := 0.U
826808b803SZehao Liu    }
836808b803SZehao Liu  }).setAddr(CSRs.henvcfg)
84039cdc35SXuan Hu
85499d09b3SsinceforYy  val htval = Module(new CSRModule("Htval", new XtvalBundle) with TrapEntryHSEventSinkBundle)
862c054816SsinceforYy    .setAddr(CSRs.htval)
87039cdc35SXuan Hu
881d192ad8SXuan Hu  val hip = Module(new CSRModule("Hip", new HipBundle)
891d192ad8SXuan Hu    with HypervisorBundle
901d192ad8SXuan Hu    with HasExternalInterruptBundle
911d192ad8SXuan Hu    with HasIpIeBundle
921d192ad8SXuan Hu  {
93039cdc35SXuan Hu    val toHvip = IO(new HipToHvip)
94039cdc35SXuan Hu
951d192ad8SXuan Hu    // hip.VSEIP is read-only alias of mip.VSEIP, mip.VSEIP := hvip.VSEIP|hgeip(VGEIN)|platIR.VSEIP
961d192ad8SXuan Hu    // hip.VSTIP is read-only alias of mip.VSTIP, mip.VSTIP := hvip.VSTIP|time+htimedelta>=vstimecmp
971d192ad8SXuan Hu    // hip.SGEIP is read-only alias of mip.SGEIP, mip.SGEIP := |(hgeip&hgeie)
981d192ad8SXuan Hu    regOut.VSTIP := mip.VSTIP
991d192ad8SXuan Hu    regOut.VSEIP := mip.VSEIP
1001d192ad8SXuan Hu    regOut.SGEIP := mip.SGEIP
101039cdc35SXuan Hu
1021d192ad8SXuan Hu    // hip.VSSIP is alias of hvip.VSSIP, writable
1031d192ad8SXuan Hu    toHvip.VSSIP.valid := wen
1041d192ad8SXuan Hu    toHvip.VSSIP.bits  := wdata.VSSIP
105e3da8badSTang Haojin    regOut.VSSIP := this.hvip.VSSIP
1061d192ad8SXuan Hu    // vsip.SSIP is alias of hip.VSSIP, so vsip.SSIP is alias of hvip.VSSIP.
1071d192ad8SXuan Hu    // vsip.SSIP write throuth to hvip.VSSIP
108237d4cfdSXuan Hu  })
1092c054816SsinceforYy    .setAddr(CSRs.hip)
110039cdc35SXuan Hu
1111d192ad8SXuan Hu  val hvip = Module(new CSRModule("Hvip", new HvipBundle) {
1121d192ad8SXuan Hu    val fromMip  = IO(Flipped(new MipToHvip))
113039cdc35SXuan Hu    val fromHip  = IO(Flipped(new HipToHvip))
1141d192ad8SXuan Hu    val fromVSip = IO(Flipped(new VSipToHvip))
1151d192ad8SXuan Hu
1161d192ad8SXuan Hu    when (fromMip.VSSIP.valid || fromHip.VSSIP.valid || fromVSip.VSSIP.valid) {
1171d192ad8SXuan Hu      reg.VSSIP := Mux1H(Seq(
1181d192ad8SXuan Hu        fromMip.VSSIP.valid -> fromMip.VSSIP.bits,
1191d192ad8SXuan Hu        fromHip.VSSIP.valid -> fromHip.VSSIP.bits,
1201d192ad8SXuan Hu        fromVSip.VSSIP.valid -> fromVSip.VSSIP.bits,
1211d192ad8SXuan Hu      ))
1221d192ad8SXuan Hu    }
1231d192ad8SXuan Hu
1241d192ad8SXuan Hu    reg.getLocal zip fromVSip.getLocal foreach { case (rLCIP, vsipLCIP) =>
1251d192ad8SXuan Hu      // sip should assert valid when hideleg=0 && hvien=1
1261d192ad8SXuan Hu      when(vsipLCIP.valid) {
1271d192ad8SXuan Hu        rLCIP := vsipLCIP.bits
1281d192ad8SXuan Hu      }
1291d192ad8SXuan Hu    }
130237d4cfdSXuan Hu  })
1312c054816SsinceforYy    .setAddr(CSRs.hvip)
132039cdc35SXuan Hu
1334016eee8SsinceforYy  val hviprio1 = Module(new CSRModule("Hviprio1", new Hviprio1Bundle))
1342c054816SsinceforYy    .setAddr(CSRs.hviprio1)
135039cdc35SXuan Hu
1364016eee8SsinceforYy  val hviprio2 = Module(new CSRModule("Hviprio2", new Hviprio2Bundle))
1372c054816SsinceforYy    .setAddr(CSRs.hviprio2)
138039cdc35SXuan Hu
139499d09b3SsinceforYy  val htinst = Module(new CSRModule("Htinst", new XtinstBundle) with TrapEntryHSEventSinkBundle)
1402c054816SsinceforYy    .setAddr(CSRs.htinst)
141039cdc35SXuan Hu
142f9913d9bSXuan Hu  val hgatp = Module(new CSRModule("Hgatp", new HgatpBundle) {
143039cdc35SXuan Hu    // Ref: 13.2.10. Hypervisor Guest Address Translation and Protection Register (hgatp)
144039cdc35SXuan Hu    // A write to hgatp with an unsupported MODE value is not ignored as it is for satp. Instead, the fields of
145039cdc35SXuan Hu    // hgatp are WARL in the normal way, when so indicated.
1469c0fd28fSXuan Hu
1479c0fd28fSXuan Hu    // The length of ppn is 44 bits.
1489c0fd28fSXuan Hu    // make PPN[1:0] read-only zero.
1499c0fd28fSXuan Hu    val ppnMask = ZeroExt((Fill(PPNLength - 2, 1.U(1.W)) ## 0.U(2.W)).take(PAddrBits - PageOffsetWidth), PPNLength)
1509c0fd28fSXuan Hu
1519c0fd28fSXuan Hu    when (wen) {
152e980ddf1SsinceforYy      reg.VMID := wdata.VMID
1539c0fd28fSXuan Hu      reg.PPN  := wdata.PPN & ppnMask
1549c0fd28fSXuan Hu      when (wdata.MODE.isLegal) {
1559c0fd28fSXuan Hu        reg.MODE := wdata.MODE
1569c0fd28fSXuan Hu      }.otherwise {
1579c0fd28fSXuan Hu        reg.MODE := reg.MODE
1589c0fd28fSXuan Hu      }
159f9913d9bSXuan Hu    }.otherwise {
160f9913d9bSXuan Hu      reg := reg
161f9913d9bSXuan Hu    }
162237d4cfdSXuan Hu  })
1632c054816SsinceforYy    .setAddr(CSRs.hgatp)
164039cdc35SXuan Hu
16589bb2535SXuan Hu  val hgeip = Module(new CSRModule("Hgeip", new HgeipBundle) with HasAIABundle {
16689bb2535SXuan Hu    regOut.ip := aiaToCSR.vseip
16789bb2535SXuan Hu  })
1682c054816SsinceforYy    .setAddr(CSRs.hgeip)
169039cdc35SXuan Hu
17026033c52Schengguanghui  val hstateen0 = Module(new CSRModule("Hstateen", new HstateenBundle0) with HasStateen0Bundle {
17126033c52Schengguanghui    // For every bit in an mstateen CSR that is zero (whether read-only zero or set to zero), the same bit
17226033c52Schengguanghui    // appears as read-only zero in the matching hstateen and sstateen CSRs.
17326033c52Schengguanghui    regOut := reg.asUInt & fromMstateen0.asUInt
17426033c52Schengguanghui  }).setAddr(CSRs.hstateen0)
17526033c52Schengguanghui
176039cdc35SXuan Hu  val hypervisorCSRMods: Seq[CSRModule[_]] = Seq(
177039cdc35SXuan Hu    hstatus,
178039cdc35SXuan Hu    hedeleg,
179039cdc35SXuan Hu    hideleg,
180039cdc35SXuan Hu    hie,
181039cdc35SXuan Hu    htimedelta,
182039cdc35SXuan Hu    hcounteren,
183039cdc35SXuan Hu    hgeie,
184039cdc35SXuan Hu    hvien,
185039cdc35SXuan Hu    hvictl,
186039cdc35SXuan Hu    henvcfg,
187039cdc35SXuan Hu    htval,
188039cdc35SXuan Hu    hip,
189039cdc35SXuan Hu    hvip,
190039cdc35SXuan Hu    hviprio1,
191039cdc35SXuan Hu    hviprio2,
192039cdc35SXuan Hu    htinst,
193039cdc35SXuan Hu    hgatp,
194039cdc35SXuan Hu    hgeip,
19526033c52Schengguanghui    hstateen0,
196039cdc35SXuan Hu  )
197039cdc35SXuan Hu
19894895e77SXuan Hu  val hypervisorCSRMap: SeqMap[Int, (CSRAddrWriteBundle[_], UInt)] = SeqMap.from(
1998aa89407SXuan Hu    hypervisorCSRMods.map(csr => (csr.addr -> (csr.w -> csr.rdata))).iterator
200039cdc35SXuan Hu  )
201e877d8bfSXuan Hu
202e877d8bfSXuan Hu  val hypervisorCSROutMap: SeqMap[Int, UInt] = SeqMap.from(
203e877d8bfSXuan Hu    hypervisorCSRMods.map(csr => (csr.addr -> csr.regOut.asInstanceOf[CSRBundle].asUInt)).iterator
204e877d8bfSXuan Hu  )
205039cdc35SXuan Hu}
206039cdc35SXuan Hu
207039cdc35SXuan Huclass HstatusBundle extends CSRBundle {
208039cdc35SXuan Hu
209039cdc35SXuan Hu  val VSBE  = RO(5).withReset(0.U)
210039cdc35SXuan Hu  val GVA   = RW(6)
211237d4cfdSXuan Hu  val SPV   = VirtMode(7)
212039cdc35SXuan Hu  val SPVP  = RW(8)
213039cdc35SXuan Hu  val HU    = RW(9)
214499d09b3SsinceforYy  val VGEIN = HstatusVgeinField(17, 12, wNoFilter, rNoFilter).withReset(0.U)
215499d09b3SsinceforYy  val VTVM  = RW(20).withReset(0.U)
216499d09b3SsinceforYy  val VTW   = RW(21).withReset(0.U)
217499d09b3SsinceforYy  val VTSR  = RW(22).withReset(0.U)
218039cdc35SXuan Hu  val VSXL  = XLENField(33, 32).withReset(XLENField.XLEN64)
219189833a1SHaoyuan Feng  val HUPMM = EnvPMM(49, 48, wNoEffect).withReset(EnvPMM.Disable) // Ssnpm extension
220039cdc35SXuan Hu
221039cdc35SXuan Hu}
222039cdc35SXuan Hu
223e733b25bSlinzhidaobject HstatusVgeinField extends CSREnum with WLRLApply
224039cdc35SXuan Hu
22501cdded8SXuan Huclass HstatusModule(implicit p: Parameters) extends CSRModule("Hstatus", new HstatusBundle)
226237d4cfdSXuan Hu  with SretEventSinkBundle
227237d4cfdSXuan Hu  with TrapEntryHSEventSinkBundle
228039cdc35SXuan Hu
2291d192ad8SXuan Huclass HvipBundle extends InterruptPendingBundle {
2301d192ad8SXuan Hu  // VSSIP, VSTIP, VSEIP, localIP is writable
2311d192ad8SXuan Hu  this.getVS.foreach(_.setRW().withReset(0.U))
2321d192ad8SXuan Hu  this.getLocal.foreach(_.setRW().withReset(0.U))
233039cdc35SXuan Hu}
234039cdc35SXuan Hu
2351d192ad8SXuan Huclass HieBundle extends InterruptEnableBundle {
2361d192ad8SXuan Hu  // All bits in hie are RO, since all registers implemented in mie.
237039cdc35SXuan Hu}
238039cdc35SXuan Hu
2391d192ad8SXuan Huclass HipBundle extends InterruptPendingBundle {
2401d192ad8SXuan Hu  this.VSSIP.setRW().withReset(0.U) // aliasRW of mip.VSSIP when mideleg=1.
2411d192ad8SXuan Hu  this.VSTIP.setRO().withReset(0.U) // aliasRO of mip.VSTIP when mideleg=1. (hvip.VSTIP | PLIC.VSTIP)
2421d192ad8SXuan Hu  this.VSEIP.setRO().withReset(0.U) // aliasRO of mip.VSEIP when mideleg=1. (hvip.VSEIP | hgeip(hstatus.VGEIN) | PLIC.VSEIP)
2431d192ad8SXuan Hu  this.SGEIP.setRO().withReset(0.U) // aliasRO of mip.SGEIP (|(hgeip & hegie))
2441d192ad8SXuan Hu}
2451d192ad8SXuan Hu
2461d192ad8SXuan Huclass HvienBundle extends InterruptEnableBundle {
2471d192ad8SXuan Hu  // Ref: riscv interrupt spec - 6.3.2 Virtual interrupts for VS level
2481d192ad8SXuan Hu  // Bits 12:0 of hvien are reserved and must be read-only zeros.
2491d192ad8SXuan Hu  // For interrupt numbers 13–63, implementations may freely choose which bits of hvien are writable
2501d192ad8SXuan Hu  // and which bits are read-only zero or one.
2511d192ad8SXuan Hu  this.getLocal.foreach(_.setRW().withReset(0.U))
2521d192ad8SXuan Hu
253039cdc35SXuan Hu}
254039cdc35SXuan Hu
255*7768a97dSTang Haojinclass HgeieBundle(implicit val p: Parameters) extends CSRBundle with HasSoCParameter {
256*7768a97dSTang Haojin  val ie = RW(soc.IMSICParams.geilen, 1).withReset(0.U)
257039cdc35SXuan Hu  // bit 0 is read only 0
258039cdc35SXuan Hu}
259039cdc35SXuan Hu
260*7768a97dSTang Haojinclass HgeipBundle(implicit val p: Parameters) extends CSRBundle with HasSoCParameter {
261*7768a97dSTang Haojin  val ip = RO(soc.IMSICParams.geilen, 1)
262039cdc35SXuan Hu  // bit 0 is read only 0
263039cdc35SXuan Hu}
264039cdc35SXuan Hu
265039cdc35SXuan Huclass HedelegBundle extends ExceptionBundle {
266a37e0a1fSsinceforYy  this.getALL.foreach(_.setRW().withReset(0.U))
267ea3647bcSXuan Hu  // The default configs are RW
268a37e0a1fSsinceforYy  this.EX_HSCALL.setRO().withReset(0.U)
269a37e0a1fSsinceforYy  this.EX_VSCALL.setRO().withReset(0.U)
270a37e0a1fSsinceforYy  this.EX_MCALL .setRO().withReset(0.U)
271a37e0a1fSsinceforYy  this.EX_IGPF  .setRO().withReset(0.U)
272a37e0a1fSsinceforYy  this.EX_LGPF  .setRO().withReset(0.U)
273a37e0a1fSsinceforYy  this.EX_VI    .setRO().withReset(0.U)
274a37e0a1fSsinceforYy  this.EX_SGPF  .setRO().withReset(0.U)
275ca0aa835SXuan Hu  this.EX_DBLTRP.setRO().withReset(0.U) // double trap is not delegatable
276039cdc35SXuan Hu}
277039cdc35SXuan Hu
278039cdc35SXuan Huclass HidelegBundle extends InterruptBundle {
279a37e0a1fSsinceforYy  this.getALL.foreach(_.setRW().withReset(0.U))
280039cdc35SXuan Hu  // default RW
281a37e0a1fSsinceforYy  this.SSI .setRO().withReset(0.U)
282a37e0a1fSsinceforYy  this.MSI .setRO().withReset(0.U)
283a37e0a1fSsinceforYy  this.STI .setRO().withReset(0.U)
284a37e0a1fSsinceforYy  this.MTI .setRO().withReset(0.U)
285a37e0a1fSsinceforYy  this.SEI .setRO().withReset(0.U)
286a37e0a1fSsinceforYy  this.MEI .setRO().withReset(0.U)
287a37e0a1fSsinceforYy  this.SGEI.setRO().withReset(0.U)
28861f6ab51SZhaoyang You  this.getLocal.foreach(_.setRO().withReset(0.U))
28961f6ab51SZhaoyang You  this.LCOFI.setRW().withReset(0.U)
290039cdc35SXuan Hu}
291039cdc35SXuan Hu
292039cdc35SXuan Huclass HipToHvip extends Bundle {
293039cdc35SXuan Hu  val VSSIP = ValidIO(RW(0))
294039cdc35SXuan Hu}
295039cdc35SXuan Hu
2961d192ad8SXuan Huclass SipToHvip extends ToAliasIpLocalPart {
2971d192ad8SXuan Hu
2981d192ad8SXuan Hu}
2991d192ad8SXuan Hu
3001d192ad8SXuan Huclass HieToMie extends IeValidBundle {
3011d192ad8SXuan Hu  this.getVS.foreach(_.bits.setRW())
3021d192ad8SXuan Hu  this.SGEIE.bits.setRW()
3031d192ad8SXuan Hu}
3041d192ad8SXuan Hu
3054016eee8SsinceforYyclass HvictlBundle extends CSRBundle {
3064016eee8SsinceforYy  // Virtual Trap Interrupt control
307acddddb6SsinceforYy  val VTI = RW(30).withReset(0.U)
3084016eee8SsinceforYy  // WARL in AIA spec.
3094016eee8SsinceforYy  // RW, since we support max width of IID
310acddddb6SsinceforYy  val IID = RW(15 + HIIDWidth, 16).withReset(0.U)
3114016eee8SsinceforYy  // determines the interrupt’s presumed default priority order relative to a (virtual) supervisor external interrupt (SEI), major identity 9
3124016eee8SsinceforYy  // 0 = interrupt has higher default priority than an SEI
3134016eee8SsinceforYy  // 1 = interrupt has lower default priority than an SEI
3144016eee8SsinceforYy  // When hvictl.IID = 9, DPR is ignored.
3154016eee8SsinceforYy  // Todo: sort the interrupt specified by hvictl with DPR
316acddddb6SsinceforYy  val DPR = RW(9).withReset(0.U)
317acddddb6SsinceforYy  val IPRIOM = RW(8).withReset(0.U)
318acddddb6SsinceforYy  val IPRIO = RW(7, 0).withReset(0.U)
3194016eee8SsinceforYy}
3204016eee8SsinceforYy
3214016eee8SsinceforYyclass Hviprio1Bundle extends CSRBundle {
322acddddb6SsinceforYy  val PrioSSI = RW(15,  8).withReset(0.U)
323acddddb6SsinceforYy  val PrioSTI = RW(31, 24).withReset(0.U)
324acddddb6SsinceforYy  val PrioCOI = RW(47, 40).withReset(0.U)
3258256cd00SsinceforYy  val Prio14  = RW(55, 48).withReset(0.U)
3268256cd00SsinceforYy  val Prio15  = RW(63, 56).withReset(0.U)
3274016eee8SsinceforYy}
3284016eee8SsinceforYy
3298256cd00SsinceforYyclass Hviprio2Bundle extends FieldInitBundle
3304016eee8SsinceforYy
331f9913d9bSXuan Huclass HgatpBundle extends CSRBundle {
332f9913d9bSXuan Hu  val MODE = HgatpMode(63, 60, wNoFilter).withReset(HgatpMode.Bare)
333f9913d9bSXuan Hu  // WARL in privileged spec.
334f9913d9bSXuan Hu  // RW, since we support max width of VMID
335499d09b3SsinceforYy  val VMID = RW(44 - 1 + VMIDLEN, 44).withReset(0.U)
336499d09b3SsinceforYy  val PPN = RW(43, 0).withReset(0.U)
337f9913d9bSXuan Hu}
338f9913d9bSXuan Hu
3390b4c00ffSXuan Huclass HEnvCfg extends EnvCfg {
3400b4c00ffSXuan Hu  if (CSRConfig.EXT_SSTC) {
3410b4c00ffSXuan Hu    this.STCE.setRW().withReset(1.U)
3420b4c00ffSXuan Hu  }
34339db506bSXuan Hu  this.PBMTE.setRW().withReset(0.U)
3446808b803SZehao Liu  if (CSRConfig.EXT_DBLTRP) {
3456808b803SZehao Liu    // software write envcfg to open ssdbltrp if need
3466808b803SZehao Liu    // set 0 to pass ci
3476808b803SZehao Liu    this.DTE.setRW().withReset(0.U)
3486808b803SZehao Liu  }
3490b4c00ffSXuan Hu}
3500b4c00ffSXuan Hu
35123767fc3SZhaoyang Youclass Htimedelta extends FieldInitBundle
35223767fc3SZhaoyang You
353039cdc35SXuan Hutrait HypervisorBundle { self: CSRModule[_] =>
354039cdc35SXuan Hu  val hstatus = IO(Input(new HstatusBundle))
355039cdc35SXuan Hu}
3568fafb45aSsinceforYy
3578fafb45aSsinceforYytrait HasHypervisorEnvBundle { self: CSRModule[_] =>
3588fafb45aSsinceforYy  val menvcfg = IO(Input(new MEnvCfg))
3598fafb45aSsinceforYy}
360