1package xiangshan.backend.fu.NewCSR 2 3import chisel3._ 4import chisel3.util._ 5import org.chipsalliance.cde.config.Parameters 6import xiangshan.backend.fu.NewCSR.CSRDefines.{CSRROField => RO, CSRRWField => RW, CSRWARLField => WARL, CSRWLRLField => WLRL, _} 7import xiangshan.backend.fu.NewCSR.CSRFunc._ 8import xiangshan.backend.fu.NewCSR.CSRConfig._ 9import xiangshan.backend.fu.NewCSR.CSRBundles._ 10import xiangshan.backend.fu.NewCSR.CSREvents.{SretEventSinkBundle, TrapEntryHSEventSinkBundle} 11 12import scala.collection.immutable.SeqMap 13import xiangshan.backend.fu.NewCSR.CSREnumTypeImplicitCast._ 14 15trait HypervisorLevel { self: NewCSR => 16 17 val hstatus = Module(new HstatusModule) 18 .setAddr(0x600) 19 20 val hedeleg = Module(new CSRModule("Hedeleg", new HedelegBundle)) 21 .setAddr(0x602) 22 23 val hideleg = Module(new CSRModule("Hideleg", new HidelegBundle)) 24 .setAddr(0x603) 25 26 val hie = Module(new CSRModule("Hie", new HieBundle) with HypervisorBundle { 27 val fromVSie = IO(Flipped(new VSieToHie)) 28 val fromMie = IO(Flipped(new MieToHie)) 29 30 when (fromVSie.SSIE.valid) { reg.VSSIE := fromVSie.SSIE.bits } 31 when (fromVSie.STIE.valid) { reg.VSTIE := fromVSie.STIE.bits } 32 when (fromVSie.SEIE.valid) { reg.VSEIE := fromVSie.SEIE.bits } 33 when (fromMie.VSSIE.valid) { reg.VSSIE := fromMie.VSSIE.bits } 34 when (fromMie.VSTIE.valid) { reg.VSTIE := fromMie.VSTIE.bits } 35 when (fromMie.VSEIE.valid) { reg.VSEIE := fromMie.VSEIE.bits } 36 when (fromMie.SGEIE.valid) { reg.SGEIE := fromMie.SGEIE.bits } 37 }) 38 .setAddr(0x604) 39 40 hie.fromMie := mie.toHie 41 42 val htimedelta = Module(new CSRModule("Htimedelta", new CSRBundle { 43 val VALUE = RW(63, 0) 44 })) 45 .setAddr(0x605) 46 47 val hcounteren = Module(new CSRModule("Hcounteren", new Counteren)) 48 .setAddr(0x606) 49 50 val hgeie = Module(new CSRModule("Hgeie", new HgeieBundle)) 51 .setAddr(0x607) 52 53 val hvien = Module(new CSRModule("Hvien", new CSRBundle { 54 val ien = RW(63, 13) 55 // bits 12:0 read only 0 56 })) 57 .setAddr(0x608) 58 59 val hvictl = Module(new CSRModule("Hvictl", new HvictlBundle)) 60 .setAddr(0x609) 61 62 val henvcfg = Module(new CSRModule("Henvcfg", new HEnvCfg) with HasHypervisorEnvBundle { 63 when (!menvcfg.STCE.asBool && !privState.isModeM && accessStimecmp) { 64 regOut.STCE := 0.U 65 } 66 }) 67 .setAddr(0x60A) 68 69 val htval = Module(new CSRModule("Htval", new CSRBundle { 70 val ALL = RW(63, 0) 71 }) with TrapEntryHSEventSinkBundle) 72 .setAddr(0x643) 73 74 val hip = Module(new CSRModule("Hip", new HipBundle) with HypervisorBundle with HasExternalInterruptBundle { 75 val fromVSip = IO(Flipped(new VSipToHip)) 76 val toHvip = IO(new HipToHvip) 77 78 regOut.VSSIP := hvip.VSSIP 79 regOut.VSTIP := hvip.VSTIP.asUInt.asBool | platformIRP.VSTIP 80 regOut.VSEIP := hvip.VSEIP.asUInt.asBool | platformIRP.VSEIP | hgeip.ip.asUInt(hstatus.VGEIN.asUInt) 81 regOut.SGEIP := (hgeip.ip.asUInt | hgeie.ie.asUInt).orR 82 83 // hip.VSEIP is read only 84 // hip.VSTIP is read only 85 // hip.VSSIP is alias of hvip.VSSIP 86 // vsip.SSIP is alias of hip.VSSIP 87 toHvip.VSSIP.valid := fromVSip.SSIP.valid || wen 88 toHvip.VSSIP.bits := Mux1H(Seq( 89 fromVSip.SSIP.valid -> fromVSip.SSIP.bits, 90 wen -> wdata.VSSIP 91 )) 92 }) 93 .setAddr(0x644) 94 95 val hvip = Module(new CSRModule("Hvip", new CSRBundle { 96 val VSSIP = RW( 2) 97 val VSTIP = RW( 6) 98 val VSEIP = RW(10) 99 }) { 100 val fromHip = IO(Flipped(new HipToHvip)) 101 when (fromHip.VSSIP.valid) { reg.VSSIP := fromHip.VSSIP.bits } 102 }) 103 .setAddr(0x645) 104 105 hvip.fromHip := hip.toHvip 106 107 val hviprio1 = Module(new CSRModule("Hviprio1", new Hviprio1Bundle)) 108 .setAddr(0x646) 109 110 val hviprio2 = Module(new CSRModule("Hviprio2", new Hviprio2Bundle)) 111 .setAddr(0x647) 112 113 val htinst = Module(new CSRModule("Htinst", new CSRBundle { 114 val ALL = RO(63, 0) 115 }) with TrapEntryHSEventSinkBundle) 116 .setAddr(0x64A) 117 118 val hgatp = Module(new CSRModule("Hgatp", new HgatpBundle) { 119 // Ref: 13.2.10. Hypervisor Guest Address Translation and Protection Register (hgatp) 120 // A write to hgatp with an unsupported MODE value is not ignored as it is for satp. Instead, the fields of 121 // hgatp are WARL in the normal way, when so indicated. 122 // 123 // But we treat hgatp as the same of satp and vsatp. 124 // If hgatp is written with an unsupported MODE, 125 // the entire write has no effect; no fields in hgatp are modified. 126 when(wen && wdata.MODE.isLegal) { 127 when (wdata.MODE === HgatpMode.Bare) { 128 reg := 0.U 129 }.otherwise { 130 reg := wdata 131 } 132 }.elsewhen (wen && !wdata.MODE.isLegal) { 133 reg.PPN := wdata.PPN 134 reg.VMID := wdata.VMID 135 }.otherwise { 136 reg := reg 137 } 138 }) 139 .setAddr(0x680) 140 141 val hgeip = Module(new CSRModule("Hgeip", new HgeipBundle)) 142 .setAddr(0xE12) 143 144 val hypervisorCSRMods: Seq[CSRModule[_]] = Seq( 145 hstatus, 146 hedeleg, 147 hideleg, 148 hie, 149 htimedelta, 150 hcounteren, 151 hgeie, 152 hvien, 153 hvictl, 154 henvcfg, 155 htval, 156 hip, 157 hvip, 158 hviprio1, 159 hviprio2, 160 htinst, 161 hgatp, 162 hgeip, 163 ) 164 165 val hypervisorCSRMap: SeqMap[Int, (CSRAddrWriteBundle[_], Data)] = SeqMap.from( 166 hypervisorCSRMods.map(csr => (csr.addr -> (csr.w -> csr.rdata))).iterator 167 ) 168 169 val hypervisorCSROutMap: SeqMap[Int, UInt] = SeqMap.from( 170 hypervisorCSRMods.map(csr => (csr.addr -> csr.regOut.asInstanceOf[CSRBundle].asUInt)).iterator 171 ) 172} 173 174class HstatusBundle extends CSRBundle { 175 176 val VSBE = RO(5).withReset(0.U) 177 val GVA = RW(6) 178 val SPV = VirtMode(7) 179 val SPVP = RW(8) 180 val HU = RW(9) 181 val VGEIN = HstatusVgeinField(17, 12, wNoFilter, rNoFilter) 182 val VTVM = RW(20) 183 val VTW = RW(21) 184 val VTSR = RW(22) 185 val VSXL = XLENField(33, 32).withReset(XLENField.XLEN64) 186 187} 188 189object HstatusVgeinField extends CSREnum with WLRLApply { 190 override def isLegal(enum: CSREnumType): Bool = enum.asUInt <= GEILEN.U 191} 192 193class HstatusModule(implicit p: Parameters) extends CSRModule("Hstatus", new HstatusBundle) 194 with SretEventSinkBundle 195 with TrapEntryHSEventSinkBundle 196 197class HvipBundle extends CSRBundle { 198 val VSSIP = RW(2) 199 val VSTIP = RW(6) 200 val VSEIP = RW(10) 201} 202 203class HieBundle extends CSRBundle { 204 val VSSIE = RW( 2).withReset(0.U) 205 val VSTIE = RW( 6).withReset(0.U) 206 val VSEIE = RW(10).withReset(0.U) 207 val SGEIE = RW(12).withReset(0.U) 208} 209 210class HipBundle extends CSRBundle { 211 val VSSIP = RW( 2).withReset(0.U) // alias of hvip.VSSIP 212 val VSTIP = RO( 6).withReset(0.U) // hvip.VSTIP | PLIC.VSTIP 213 val VSEIP = RO(10).withReset(0.U) // hvip.VSEIP | hgeip(hstatus.VGEIN) | PLIC.VSEIP 214 val SGEIP = RO(12).withReset(0.U) // |(hgeip & hegie) 215} 216 217class HgeieBundle extends CSRBundle { 218 val ie = RW(GEILEN, 1) 219 // bit 0 is read only 0 220} 221 222class HgeipBundle extends CSRBundle { 223 val ip = RW(GEILEN, 1) 224 // bit 0 is read only 0 225} 226 227class HedelegBundle extends ExceptionBundle { 228 this.getALL.foreach(_.setRW().withReset(0.U)) 229 // The default configs are RW 230 this.EX_HSCALL.setRO().withReset(0.U) 231 this.EX_VSCALL.setRO().withReset(0.U) 232 this.EX_MCALL .setRO().withReset(0.U) 233 this.EX_IGPF .setRO().withReset(0.U) 234 this.EX_LGPF .setRO().withReset(0.U) 235 this.EX_VI .setRO().withReset(0.U) 236 this.EX_SGPF .setRO().withReset(0.U) 237} 238 239class HidelegBundle extends InterruptBundle { 240 this.getALL.foreach(_.setRW().withReset(0.U)) 241 // default RW 242 this.SSI .setRO().withReset(0.U) 243 this.MSI .setRO().withReset(0.U) 244 this.STI .setRO().withReset(0.U) 245 this.MTI .setRO().withReset(0.U) 246 this.SEI .setRO().withReset(0.U) 247 this.MEI .setRO().withReset(0.U) 248 this.SGEI.setRO().withReset(0.U) 249} 250 251class HipToHvip extends Bundle { 252 val VSSIP = ValidIO(RW(0)) 253} 254 255class HvictlBundle extends CSRBundle { 256 // Virtual Trap Interrupt control 257 val VTI = RW(30) 258 // WARL in AIA spec. 259 // RW, since we support max width of IID 260 val IID = RW(15 + HIIDWidth, 16) 261 // determines the interrupt’s presumed default priority order relative to a (virtual) supervisor external interrupt (SEI), major identity 9 262 // 0 = interrupt has higher default priority than an SEI 263 // 1 = interrupt has lower default priority than an SEI 264 // When hvictl.IID = 9, DPR is ignored. 265 // Todo: sort the interrupt specified by hvictl with DPR 266 val DPR = RW(9) 267 val IPRIOM = RW(8) 268 val IPRIO = RW(7, 0) 269} 270 271class Hviprio1Bundle extends CSRBundle { 272 val PrioSSI = RW(15, 8) 273 val PrioSTI = RW(31, 24) 274 val PrioCOI = RW(47, 40) 275 val Prio14 = RW(55, 48) 276 val Prio15 = RW(63, 56) 277} 278 279class Hviprio2Bundle extends CSRBundle { 280 val Prio16 = RW(7, 0) 281 val Prio17 = RW(15, 8) 282 val Prio18 = RW(23, 16) 283 val Prio19 = RW(31, 24) 284 val Prio20 = RW(39, 32) 285 val Prio21 = RW(47, 40) 286 val Prio22 = RW(55, 48) 287 val Prio23 = RW(63, 56) 288} 289 290class HgatpBundle extends CSRBundle { 291 final val PPN_msb = PAddrWidth - AddrWidthInPage - 1 292 val MODE = HgatpMode(63, 60, wNoFilter).withReset(HgatpMode.Bare) 293 // WARL in privileged spec. 294 // RW, since we support max width of VMID 295 val VMID = RW(44 - 1 + VMIDLEN, 44) 296 val PPN = RW(PAddrWidth, 0) 297} 298 299class HEnvCfg extends EnvCfg { 300 if (CSRConfig.EXT_SSTC) { 301 this.STCE.setRW().withReset(1.U) 302 } 303} 304 305trait HypervisorBundle { self: CSRModule[_] => 306 val hstatus = IO(Input(new HstatusBundle)) 307 val hvip = IO(Input(new HvipBundle)) 308 val hideleg = IO(Input(new HidelegBundle)) 309 val hedeleg = IO(Input(new HedelegBundle)) 310 val hgeip = IO(Input(new HgeipBundle)) 311 val hgeie = IO(Input(new HgeieBundle)) 312 val hip = IO(Input(new HipBundle)) 313 val hie = IO(Input(new HieBundle)) 314} 315 316trait HasHypervisorEnvBundle { self: CSRModule[_] => 317 val menvcfg = IO(Input(new MEnvCfg)) 318 val privState = IO(Input(new PrivState)) 319 val accessStimecmp = IO(Input(Bool())) 320}