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