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