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