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 val hypervisorCSROutMap: SeqMap[Int, UInt] = SeqMap.from( 191 hypervisorCSRMods.map(csr => (csr.addr -> csr.regOut.asInstanceOf[CSRBundle].asUInt)).iterator 192 ) 193} 194 195class HstatusBundle extends CSRBundle { 196 197 val VSBE = RO(5).withReset(0.U) 198 val GVA = RW(6) 199 val SPV = VirtMode(7) 200 val SPVP = RW(8) 201 val HU = RW(9) 202 val VGEIN = HstatusVgeinField(17, 12, wNoFilter, rNoFilter) 203 val VTVM = RW(20) 204 val VTM = RW(21) 205 val VTSR = RW(22) 206 val VSXL = XLENField(33, 32).withReset(XLENField.XLEN64) 207 208} 209 210object HstatusVgeinField extends CSREnum with WLRLApply { 211 override def isLegal(enum: CSREnumType): Bool = enum.asUInt <= GEILEN.U 212} 213 214class HstatusModule extends CSRModule("Hstatus", new HstatusBundle) 215 with SretEventSinkBundle 216 with TrapEntryHSEventSinkBundle 217 218class HvipBundle extends CSRBundle { 219 val VSSIP = RW(2) 220 val VSTIP = RW(6) 221 val VSEIP = RW(10) 222} 223 224class HieBundle extends CSRBundle { 225 val VSSIE = RW( 2) 226 val VSTIE = RW( 6) 227 val VSEIE = RW(10) 228 val SGEIE = RW(12) 229} 230 231class HipBundle extends CSRBundle { 232 val VSSIP = RW( 2) // alias of hvip.VSSIP 233 val VSTIP = RO( 6) // hvip.VSTIP | PLIC.VSTIP 234 val VSEIP = RO(10) // hvip.VSEIP | hgeip(hstatus.VGEIN) | PLIC.VSEIP 235 val SGEIP = RO(12) // |(hgeip & hegie) 236} 237 238class HgeieBundle extends CSRBundle { 239 val ie = RW(GEILEN, 1) 240 // bit 0 is read only 0 241} 242 243class HgeipBundle extends CSRBundle { 244 val ip = RW(GEILEN, 1) 245 // bit 0 is read only 0 246} 247 248class HedelegBundle extends ExceptionBundle { 249 // default RW 250 this.EX_HSCALL.setRO() 251 this.EX_VSCALL.setRO() 252 this.EX_MCALL .setRO() 253 this.EX_IGPF .setRO() 254 this.EX_LGPF .setRO() 255 this.EX_VI .setRO() 256 this.EX_SGPF .setRO() 257} 258 259class HidelegBundle extends InterruptBundle { 260 // default RW 261 this.SSI .setRO() 262 this.MSI .setRO() 263 this.STI .setRO() 264 this.MTI .setRO() 265 this.SEI .setRO() 266 this.MEI .setRO() 267 this.SGEI.setRO() 268} 269 270class HipToHvip extends Bundle { 271 val VSSIP = ValidIO(RW(0)) 272} 273 274trait HypervisorBundle { self: CSRModule[_] => 275 val hstatus = IO(Input(new HstatusBundle)) 276 val hvip = IO(Input(new HvipBundle)) 277 val hideleg = IO(Input(new HidelegBundle)) 278 val hedeleg = IO(Input(new HedelegBundle)) 279 val hgeip = IO(Input(new HgeipBundle)) 280 val hgeie = IO(Input(new HgeieBundle)) 281 val hip = IO(Input(new HipBundle)) 282 val hie = IO(Input(new HieBundle)) 283} 284