1039cdc35SXuan Hupackage xiangshan.backend.fu.NewCSR 2039cdc35SXuan Hu 3039cdc35SXuan Huimport chisel3._ 40b4c00ffSXuan Huimport chisel3.util.BitPat.bitPatToUInt 59c0fd28fSXuan Huimport chisel3.util.{BitPat, Cat, Fill, Mux1H, MuxCase, ValidIO} 69c0fd28fSXuan Huimport utility.{SignExt, ZeroExt} 72c054816SsinceforYyimport freechips.rocketchip.rocket.CSRs 8039cdc35SXuan Huimport xiangshan.backend.fu.NewCSR.CSRBundles._ 9039cdc35SXuan Huimport xiangshan.backend.fu.NewCSR.CSRDefines._ 10039cdc35SXuan Huimport xiangshan.backend.fu.NewCSR.CSRFunc._ 11039cdc35SXuan Huimport xiangshan.backend.fu.NewCSR.CSRDefines.{CSRROField => RO, CSRRWField => RW, CSRWARLField => WARL, CSRWLRLField => WLRL, _} 12039cdc35SXuan Huimport xiangshan.backend.fu.NewCSR.CSRConfig._ 13237d4cfdSXuan Huimport xiangshan.backend.fu.NewCSR.CSREvents.TrapEntryHSEventSinkBundle 141d192ad8SXuan Huimport xiangshan.backend.fu.NewCSR.CSREnumTypeImplicitCast._ 151d192ad8SXuan Huimport xiangshan.backend.fu.NewCSR.CSRBundleImplicitCast._ 161d192ad8SXuan Huimport xiangshan.backend.fu.NewCSR.ChiselRecordForField._ 17039cdc35SXuan Hu 18039cdc35SXuan Huimport scala.collection.immutable.SeqMap 19039cdc35SXuan Hu 20039cdc35SXuan Hutrait SupervisorLevel { self: NewCSR with MachineLevel => 211d192ad8SXuan Hu val sie = Module(new CSRModule("Sie", new SieBundle) 221d192ad8SXuan Hu with HasIpIeBundle 231d192ad8SXuan Hu { 24039cdc35SXuan Hu val toMie = IO(new SieToMie) 251d192ad8SXuan Hu val fromVSie = IO(Flipped(new VSieToSie)) 2640145b14SXuan Hu 271d192ad8SXuan Hu // Sie is alias of mie when mideleg=1. 281d192ad8SXuan Hu // Otherwise, sie has seperate writable registers 291d192ad8SXuan Hu // There are no regs in CSR sie. 301d192ad8SXuan Hu val mieIsAlias = mideleg 311d192ad8SXuan Hu val usingReg = ~mideleg & mvien 321d192ad8SXuan Hu regOut := (mieIsAlias & mie) | (usingReg & reg) 331d192ad8SXuan Hu 341d192ad8SXuan Hu bundle.getFields.map(_.lsb).foreach { num => 351d192ad8SXuan Hu val wtMie = toMie.getByNum(num) 361d192ad8SXuan Hu val vsieWt = fromVSie.getByNum(num) 371d192ad8SXuan Hu 381d192ad8SXuan Hu wtMie.specifyField( 391d192ad8SXuan Hu _.valid := wen && mieIsAlias(num) && wtMie.bits.isRW.B, 401d192ad8SXuan Hu _.bits := wen && mieIsAlias(num) && wtMie.bits.isRW.B &< wdata(num), 411d192ad8SXuan Hu ) 421d192ad8SXuan Hu 431d192ad8SXuan Hu when ( 441d192ad8SXuan Hu wen && usingReg(num) && reg(num).isRW.B || 451d192ad8SXuan Hu vsieWt.valid && usingReg(num) && vsieWt.bits.isRW.B 461d192ad8SXuan Hu ) { 471d192ad8SXuan Hu reg(num) := Mux1H(Seq( 481d192ad8SXuan Hu wen -> wdata(num), 491d192ad8SXuan Hu vsieWt.valid -> vsieWt.bits, 501d192ad8SXuan Hu )) 511d192ad8SXuan Hu }.otherwise { 521d192ad8SXuan Hu reg(num) := reg(num) 531d192ad8SXuan Hu } 541d192ad8SXuan Hu } 55946f0090SXuan Hu 56946f0090SXuan Hu regOut.getFields.foreach { field => 57946f0090SXuan Hu if (field.isHardWired) { 58946f0090SXuan Hu field := field.getHardWireValue 59946f0090SXuan Hu } 60946f0090SXuan Hu } 61039cdc35SXuan Hu }) 622c054816SsinceforYy .setAddr(CSRs.sie) 63039cdc35SXuan Hu 64039cdc35SXuan Hu val stvec = Module(new CSRModule("Stvec", new XtvecBundle)) 652c054816SsinceforYy .setAddr(CSRs.stvec) 66039cdc35SXuan Hu 67039cdc35SXuan Hu val scounteren = Module(new CSRModule("Scounteren", new Counteren)) 682c054816SsinceforYy .setAddr(CSRs.scounteren) 69039cdc35SXuan Hu 700b4c00ffSXuan Hu val senvcfg = Module(new CSRModule("Senvcfg", new SEnvCfg)) 712c054816SsinceforYy .setAddr(CSRs.senvcfg) 72039cdc35SXuan Hu 73039cdc35SXuan Hu val sscratch = Module(new CSRModule("Sscratch")) 742c054816SsinceforYy .setAddr(CSRs.sscratch) 75039cdc35SXuan Hu 763e8a0170SXuan Hu val sepc = Module(new CSRModule("Sepc", new Epc) with TrapEntryHSEventSinkBundle) 772c054816SsinceforYy .setAddr(CSRs.sepc) 78039cdc35SXuan Hu 79237d4cfdSXuan Hu val scause = Module(new CSRModule("Scause", new CauseBundle) with TrapEntryHSEventSinkBundle) 802c054816SsinceforYy .setAddr(CSRs.scause) 81039cdc35SXuan Hu 82499d09b3SsinceforYy val stval = Module(new CSRModule("Stval", new XtvalBundle) with TrapEntryHSEventSinkBundle) 832c054816SsinceforYy .setAddr(CSRs.stval) 84039cdc35SXuan Hu 851d192ad8SXuan Hu val sip = Module(new CSRModule("Sip", new SipBundle) 861d192ad8SXuan Hu with HasIpIeBundle 871d192ad8SXuan Hu { 88039cdc35SXuan Hu val toMip = IO(new SipToMip) 891d192ad8SXuan Hu val toMvip = IO(new SipToMvip) 90039cdc35SXuan Hu 91039cdc35SXuan Hu // Ref: 7.1.3. Supervisor Interrupt Registers (sip and sie) 92039cdc35SXuan Hu // The sip and sie registers are subsets of the mip and mie registers. Reading any 93039cdc35SXuan Hu // implemented field, or writing any writable field, of sip/sie effects a read or write of the 94039cdc35SXuan Hu // homonymous field of mip/mie. 950b4c00ffSXuan Hu 96039cdc35SXuan Hu // Ref: 3.1.9. Machine Interrupt Registers (mip and mie) 97039cdc35SXuan Hu // Restricted views of the mip and mie registers appear as the sip and sie registers for supervisor level. If 98039cdc35SXuan Hu // an interrupt is delegated to S-mode by setting a bit in the mideleg register, it becomes visible in the 99039cdc35SXuan Hu // sip register and is maskable using the sie register. Otherwise, the corresponding bits in sip and sie 100039cdc35SXuan Hu // are **read-only zero**. 1011d192ad8SXuan Hu val mipIsAlias = mideleg 1021d192ad8SXuan Hu val mvipIsAlias = ~mideleg & mvien 103039cdc35SXuan Hu 1041d192ad8SXuan Hu dontTouch(mvipIsAlias) 105039cdc35SXuan Hu 1061d192ad8SXuan Hu regOut := mipIsAlias & mip | (mvipIsAlias & mvip) 1071d192ad8SXuan Hu 1081d192ad8SXuan Hu bundle.getFields.map(_.lsb).foreach { num => 1091d192ad8SXuan Hu val wtMip = toMip.getByNum(num) 1101d192ad8SXuan Hu val wtMvip = toMvip.getByNum(num) 1111d192ad8SXuan Hu 1121d192ad8SXuan Hu wtMip.specifyField( 1131d192ad8SXuan Hu _.valid := wen && mipIsAlias(num) && wtMip.bits.isRW.B, 1141d192ad8SXuan Hu _.bits := wen && mipIsAlias(num) && wtMip.bits.isRW.B &< wdata(num), 1151d192ad8SXuan Hu ) 1161d192ad8SXuan Hu 1171d192ad8SXuan Hu wtMvip.specifyField( 1181d192ad8SXuan Hu _.valid := wen && mvipIsAlias(num) && wtMvip.bits.isRW.B, 1191d192ad8SXuan Hu _.bits := wen && mvipIsAlias(num) && wtMvip.bits.isRW.B &< wdata(num), 1201d192ad8SXuan Hu ) 1211d192ad8SXuan Hu } 122946f0090SXuan Hu 123946f0090SXuan Hu regOut.getFields.foreach { field => 124946f0090SXuan Hu if (field.isHardWired) { 125946f0090SXuan Hu field := field.getHardWireValue 126946f0090SXuan Hu } 127946f0090SXuan Hu } 128039cdc35SXuan Hu }) 1292c054816SsinceforYy .setAddr(CSRs.sip) 130039cdc35SXuan Hu 1310b4c00ffSXuan Hu val stimecmp = Module(new CSRModule("Stimecmp", new CSRBundle { 1320b4c00ffSXuan Hu val stimecmp = RW(63, 0).withReset(bitPatToUInt(BitPat.Y(64))) 1330b4c00ffSXuan Hu })) 1342c054816SsinceforYy .setAddr(CSRs.stimecmp) 135760398d7SXuan Hu 136f9913d9bSXuan Hu val satp = Module(new CSRModule("Satp", new SatpBundle) { 1379c0fd28fSXuan Hu val ppnMask = ZeroExt(Fill(PPNLength, 1.U(1.W)).take(PAddrBits - PageOffsetWidth), PPNLength) 138f9913d9bSXuan Hu // If satp is written with an unsupported MODE, 139f9913d9bSXuan Hu // the entire write has no effect; no fields in satp are modified. 140f9913d9bSXuan Hu when (wen && wdata.MODE.isLegal) { 1419c0fd28fSXuan Hu reg.MODE := wdata.MODE 1429c0fd28fSXuan Hu reg.ASID := wdata.ASID 1439c0fd28fSXuan Hu reg.PPN := wdata.PPN & ppnMask 144f9913d9bSXuan Hu }.otherwise { 145f9913d9bSXuan Hu reg := reg 146f9913d9bSXuan Hu } 147f9913d9bSXuan Hu }) 1482c054816SsinceforYy .setAddr(CSRs.satp) 149039cdc35SXuan Hu 150202093f4Schengguanghui // scountovf: This register enables supervisor-level overflow interrupt handler software to quickly and easily 151202093f4Schengguanghui // determine which counter(s) have overflowed (without needing to make an execution environment call 152202093f4Schengguanghui // or series of calls ultimately up to M-mode). 153fd72f3d9Schengguanghui val scountovf = Module(new CSRModule("Scountovf", new CSRBundle { 154202093f4Schengguanghui override val len: Int = 32 155fd72f3d9Schengguanghui val OFVEC = RO(31, 3).withReset(0.U) 156fd72f3d9Schengguanghui }) with HasMhpmeventOfBundle { 157202093f4Schengguanghui regOut.OFVEC := Mux1H(Seq( 158*dadf9cfcSchengguanghui privState.isModeM -> ofVec, 159*dadf9cfcSchengguanghui privState.isModeHS -> (mcounteren.HPM.asUInt & ofVec), 160*dadf9cfcSchengguanghui privState.isModeVS -> (mcounteren.HPM.asUInt & hcounteren.HPM.asUInt & ofVec), 161*dadf9cfcSchengguanghui )) 162fd72f3d9Schengguanghui }).setAddr(CSRs.scountovf) 163fd72f3d9Schengguanghui 16426033c52Schengguanghui val sstateen0 = Module(new CSRModule("Sstateen", new SstateenBundle0) with HasStateen0Bundle { 16526033c52Schengguanghui // For every bit in an mstateen CSR that is zero (whether read-only zero or set to zero), the same bit 16626033c52Schengguanghui // appears as read-only zero in the matching hstateen and sstateen CSRs. For every bit in an hstateen 16726033c52Schengguanghui // CSR that is zero (whether read-only zero or set to zero), the same bit appears as read-only zero in 16826033c52Schengguanghui // sstateen when accessed in VS-mode. 16926033c52Schengguanghui regOut := Mux(privState.isVirtual, fromHstateen0.asUInt, fromMstateen0.asUInt) & reg.asUInt 17026033c52Schengguanghui }).setAddr(CSRs.sstateen0) 17126033c52Schengguanghui 172039cdc35SXuan Hu val supervisorLevelCSRMods: Seq[CSRModule[_]] = Seq( 173039cdc35SXuan Hu sie, 174039cdc35SXuan Hu stvec, 175039cdc35SXuan Hu scounteren, 176039cdc35SXuan Hu senvcfg, 177039cdc35SXuan Hu sscratch, 178039cdc35SXuan Hu sepc, 179039cdc35SXuan Hu scause, 180039cdc35SXuan Hu stval, 181039cdc35SXuan Hu sip, 182760398d7SXuan Hu stimecmp, 183039cdc35SXuan Hu satp, 184fd72f3d9Schengguanghui scountovf, 18526033c52Schengguanghui sstateen0, 186039cdc35SXuan Hu ) 187039cdc35SXuan Hu 18894895e77SXuan Hu val supervisorLevelCSRMap: SeqMap[Int, (CSRAddrWriteBundle[_], UInt)] = SeqMap( 18994895e77SXuan Hu CSRs.sstatus -> (mstatus.wAliasSstatus, mstatus.sstatusRdata), 190039cdc35SXuan Hu ) ++ SeqMap.from( 1918aa89407SXuan Hu supervisorLevelCSRMods.map(csr => (csr.addr -> (csr.w, csr.rdata))).iterator 192039cdc35SXuan Hu ) 193e877d8bfSXuan Hu 194e877d8bfSXuan Hu val supervisorLevelCSROutMap: SeqMap[Int, UInt] = SeqMap( 1952c054816SsinceforYy CSRs.sstatus -> mstatus.sstatus.asUInt, 196e877d8bfSXuan Hu ) ++ SeqMap.from( 197e877d8bfSXuan Hu supervisorLevelCSRMods.map(csr => (csr.addr -> csr.regOut.asInstanceOf[CSRBundle].asUInt)).iterator 198e877d8bfSXuan Hu ) 199039cdc35SXuan Hu} 200039cdc35SXuan Hu 201039cdc35SXuan Huclass SstatusBundle extends CSRBundle { 202039cdc35SXuan Hu val SIE = CSRWARLField (1, wNoFilter) 203039cdc35SXuan Hu val SPIE = CSRWARLField (5, wNoFilter) 204499d09b3SsinceforYy val UBE = CSRROField (6).withReset(0.U) 205499d09b3SsinceforYy val SPP = CSRWARLField (8, wNoFilter).withReset(0.U) 206499d09b3SsinceforYy val VS = ContextStatus (10, 9).withReset(ContextStatus.Off) 207499d09b3SsinceforYy val FS = ContextStatus (14, 13).withReset(ContextStatus.Off) 208039cdc35SXuan Hu val XS = ContextStatusRO(16, 15).withReset(0.U) 209499d09b3SsinceforYy val SUM = CSRWARLField (18, wNoFilter).withReset(0.U) 210499d09b3SsinceforYy val MXR = CSRWARLField (19, wNoFilter).withReset(0.U) 2116808b803SZehao Liu val SDT = CSRWARLField (24, wNoFilter).withReset(0.U) 212039cdc35SXuan Hu val UXL = XLENField (33, 32).withReset(XLENField.XLEN64) 213039cdc35SXuan Hu val SD = CSRROField (63, (_, _) => FS === ContextStatus.Dirty || VS === ContextStatus.Dirty) 214039cdc35SXuan Hu} 215039cdc35SXuan Hu 216039cdc35SXuan Huclass SieBundle extends InterruptEnableBundle { 2171d192ad8SXuan Hu this.getHS.foreach(_.setRW().withReset(0.U)) 218499d09b3SsinceforYy this.STIE.setRO().withReset(0.U) 2191d192ad8SXuan Hu this.getLocal.foreach(_.setRW().withReset(0.U)) 220946f0090SXuan Hu this.getM .foreach(_.setHardWired(0.U)) 221946f0090SXuan Hu this.getVS.foreach(_.setHardWired(0.U)) 222946f0090SXuan Hu this.SGEIE.setHardWired(0.U) 223039cdc35SXuan Hu} 224039cdc35SXuan Hu 225039cdc35SXuan Huclass SipBundle extends InterruptPendingBundle { 2261d192ad8SXuan Hu // All pending bits in sip are aliases of mip or read-only 0 227946f0090SXuan Hu this.getM .foreach(_.setHardWired(0.U)) 228946f0090SXuan Hu this.getVS.foreach(_.setHardWired(0.U)) 229946f0090SXuan Hu this.SGEIP.setHardWired(0.U) 230039cdc35SXuan Hu} 231039cdc35SXuan Hu 232039cdc35SXuan Huclass SatpBundle extends CSRBundle { 233039cdc35SXuan Hu val MODE = SatpMode(63, 60, null).withReset(SatpMode.Bare) 234039cdc35SXuan Hu // WARL in privileged spec. 235039cdc35SXuan Hu // RW, since we support max width of ASID 236499d09b3SsinceforYy val ASID = RW(44 - 1 + ASIDLEN, 44).withReset(0.U) 2379c0fd28fSXuan Hu // Do WARL in SatpModule/VSatpModule 238499d09b3SsinceforYy val PPN = RW(43, 0).withReset(0.U) 239039cdc35SXuan Hu} 240039cdc35SXuan Hu 2410b4c00ffSXuan Huclass SEnvCfg extends EnvCfg 2420b4c00ffSXuan Hu 2431d192ad8SXuan Huclass SipToMip extends IpValidBundle { 2441d192ad8SXuan Hu this.SSIP.bits.setRW() 2451d192ad8SXuan Hu this.LCOFIP.bits.setRW() 246039cdc35SXuan Hu} 247039cdc35SXuan Hu 2481d192ad8SXuan Huclass SipToMvip extends IpValidBundle { 2491d192ad8SXuan Hu this.SSIP.bits.setRW() 2501d192ad8SXuan Hu this.getLocal.foreach(_.bits.setRW()) 2511d192ad8SXuan Hu} 2521d192ad8SXuan Hu 2531d192ad8SXuan Huclass SieToMie extends IeValidBundle { 2541d192ad8SXuan Hu this.getHS.foreach(_.bits.setRW()) 2551d192ad8SXuan Hu this.getLocal.foreach(_.bits.setRW()) 256039cdc35SXuan Hu} 257fd72f3d9Schengguanghui 258fd72f3d9Schengguanghuitrait HasMhpmeventOfBundle { self: CSRModule[_] => 259202093f4Schengguanghui val ofVec = IO(Input(UInt(perfCntNum.W))) 260202093f4Schengguanghui val privState = IO(Input(new PrivState)) 261202093f4Schengguanghui val mcounteren = IO(Input(new Counteren)) 262202093f4Schengguanghui val hcounteren = IO(Input(new Counteren)) 263fd72f3d9Schengguanghui}