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