xref: /XiangShan/src/main/scala/xiangshan/backend/fu/NewCSR/SupervisorLevel.scala (revision dadf9cfc4ad5fd01f86dbade10d12f1a3c69f2d2)
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}