xref: /XiangShan/src/main/scala/xiangshan/backend/fu/NewCSR/CSRAIA.scala (revision f9ed852fb2338f6ae4c57ca7f9ac0f5d719bd41f)
19681ffb2SXuan Hupackage xiangshan.backend.fu.NewCSR
29681ffb2SXuan Hu
39681ffb2SXuan Huimport chisel3._
49681ffb2SXuan Huimport chisel3.util._
52c054816SsinceforYyimport freechips.rocketchip.rocket.CSRs
68cfc24b2STang Haojinimport org.chipsalliance.cde.config.Parameters
72c054816SsinceforYyimport CSRConfig._
88cfc24b2STang Haojinimport system.HasSoCParameter
9a53de5b8SsinceforYyimport xiangshan.backend.fu.NewCSR.CSRBundles._
10d0b87b97SXuan Huimport xiangshan.backend.fu.NewCSR.CSRConfig._
11d0b87b97SXuan Huimport xiangshan.backend.fu.NewCSR.CSRDefines.{CSRROField => RO, CSRRWField => RW, _}
128cfc24b2STang Haojinimport xiangshan.XSBundle
139681ffb2SXuan Hu
149681ffb2SXuan Huimport scala.collection.immutable.SeqMap
159681ffb2SXuan Hu
16e877d8bfSXuan Hutrait CSRAIA { self: NewCSR with HypervisorLevel =>
17cdf05a9cSsinceforYy  val miselect = Module(new CSRModule("Miselect", new MISelectBundle) with HasISelectBundle {
18f7c21cb5SXuan Hu    private val value = reg.ALL.asUInt
19bf652b44SNewPaulWalker    inIMSICRange := value >= 0x70.U && value < 0x100.U
20f7c21cb5SXuan Hu    isIllegal :=
21f7c21cb5SXuan Hu      value < 0x30.U ||
22bf652b44SNewPaulWalker      value >= 0x30.U && value < 0x40.U && value(0) === 1.U ||
23f7c21cb5SXuan Hu      value >= 0x40.U && value < 0x70.U ||
24bf652b44SNewPaulWalker      value >= 0x100.U
25f7c21cb5SXuan Hu  })
262c054816SsinceforYy    .setAddr(CSRs.miselect)
279681ffb2SXuan Hu
28523f2fa2SXuan Hu  val mireg = Module(new CSRModule("Mireg") with HasIregSink {
29523f2fa2SXuan Hu    rdata := iregRead.mireg
30523f2fa2SXuan Hu  })
312c054816SsinceforYy    .setAddr(CSRs.mireg)
329681ffb2SXuan Hu
3389bb2535SXuan Hu  val mtopei = Module(new CSRModule("Mtopei", new TopEIBundle) with HasAIABundle {
3489bb2535SXuan Hu    regOut := aiaToCSR.mtopei
357d3fb559SXuan Hu  })
362c054816SsinceforYy    .setAddr(CSRs.mtopei)
379681ffb2SXuan Hu
38523f2fa2SXuan Hu  val mtopi = Module(new CSRModule("Mtopi", new TopIBundle) with HasInterruptFilterSink {
39a37e0a1fSsinceforYy    regOut.IID   := topIR.mtopi.IID
40a37e0a1fSsinceforYy    regOut.IPRIO := topIR.mtopi.IPRIO
414016eee8SsinceforYy  })
422c054816SsinceforYy    .setAddr(CSRs.mtopi)
439681ffb2SXuan Hu
44f7c21cb5SXuan Hu  val siselect = Module(new CSRModule("Siselect", new SISelectBundle) with HasISelectBundle {
45f7c21cb5SXuan Hu    private val value = reg.ALL.asUInt
46bf652b44SNewPaulWalker    inIMSICRange := value >= 0x70.U && value < 0x100.U
47f7c21cb5SXuan Hu    isIllegal :=
48f7c21cb5SXuan Hu      value < 0x30.U ||
49bf652b44SNewPaulWalker      value >= 0x30.U && value < 0x40.U && value(0) === 1.U ||
50f7c21cb5SXuan Hu      value >= 0x40.U && value < 0x70.U ||
51bf652b44SNewPaulWalker      value >= 0x100.U
52f7c21cb5SXuan Hu  })
532c054816SsinceforYy    .setAddr(CSRs.siselect)
549681ffb2SXuan Hu
55523f2fa2SXuan Hu  val sireg = Module(new CSRModule("Sireg") with HasIregSink {
56523f2fa2SXuan Hu    rdata := iregRead.sireg
57523f2fa2SXuan Hu  })
582c054816SsinceforYy    .setAddr(CSRs.sireg)
599681ffb2SXuan Hu
6089bb2535SXuan Hu  val stopei = Module(new CSRModule("Stopei", new TopEIBundle) with HasAIABundle {
6189bb2535SXuan Hu    regOut := aiaToCSR.stopei
627d3fb559SXuan Hu  })
632c054816SsinceforYy    .setAddr(CSRs.stopei)
649681ffb2SXuan Hu
65523f2fa2SXuan Hu  val stopi = Module(new CSRModule("Stopi", new TopIBundle) with HasInterruptFilterSink {
66a37e0a1fSsinceforYy    regOut.IID   := topIR.stopi.IID
67a37e0a1fSsinceforYy    regOut.IPRIO := topIR.stopi.IPRIO
684016eee8SsinceforYy  })
692c054816SsinceforYy    .setAddr(CSRs.stopi)
709681ffb2SXuan Hu
71f7c21cb5SXuan Hu  val vsiselect = Module(new CSRModule("VSiselect", new VSISelectBundle) with HasISelectBundle {
72f7c21cb5SXuan Hu    private val value = reg.ALL.asUInt
73bf652b44SNewPaulWalker    inIMSICRange := value >= 0x70.U && value < 0x100.U
74f7c21cb5SXuan Hu    isIllegal :=
75f7c21cb5SXuan Hu      value < 0x70.U ||
76bf652b44SNewPaulWalker      value >= 0x100.U
77f7c21cb5SXuan Hu  })
782c054816SsinceforYy    .setAddr(CSRs.vsiselect)
799681ffb2SXuan Hu
80523f2fa2SXuan Hu  val vsireg    = Module(new CSRModule("VSireg") with HasIregSink {
81523f2fa2SXuan Hu    rdata := iregRead.sireg
82523f2fa2SXuan Hu  })
832c054816SsinceforYy    .setAddr(CSRs.vsireg)
849681ffb2SXuan Hu
8589bb2535SXuan Hu  val vstopei   = Module(new CSRModule("VStopei", new TopEIBundle) with HasAIABundle {
8689bb2535SXuan Hu    regOut := aiaToCSR.vstopei
877d3fb559SXuan Hu  })
882c054816SsinceforYy    .setAddr(CSRs.vstopei)
899681ffb2SXuan Hu
90523f2fa2SXuan Hu  val vstopi = Module(new CSRModule("VStopi", new TopIBundle) with HasInterruptFilterSink {
91a37e0a1fSsinceforYy    regOut.IID   := topIR.vstopi.IID
92a37e0a1fSsinceforYy    regOut.IPRIO := topIR.vstopi.IPRIO
934016eee8SsinceforYy  })
942c054816SsinceforYy    .setAddr(CSRs.vstopi)
959681ffb2SXuan Hu
9696292cf5SsinceforYy  val miprio0 = Module(new CSRModule(s"Iprio0", new Iprio0Bundle) with HasIeBundle {
9796292cf5SsinceforYy    val mask = Wire(Vec(8, UInt(8.W)))
9896292cf5SsinceforYy    for (i <- 0 until 8) {
9996292cf5SsinceforYy      mask(i) := Fill(8, mie.asUInt(i))
10096292cf5SsinceforYy    }
10196292cf5SsinceforYy    regOut := reg & mask.asUInt
10296292cf5SsinceforYy  })
103acddddb6SsinceforYy    .setAddr(0x30)
104ef44afa0SsinceforYy
10596292cf5SsinceforYy  val miprio2 = Module(new CSRModule(s"Iprio2", new MIprio2Bundle) with HasIeBundle {
10696292cf5SsinceforYy    val mask = Wire(Vec(8, UInt(8.W)))
10796292cf5SsinceforYy    for (i <- 0 until 8) {
10896292cf5SsinceforYy      mask(i) := Fill(8, mie.asUInt(i+8))
10996292cf5SsinceforYy    }
11096292cf5SsinceforYy    regOut := reg & mask.asUInt
11196292cf5SsinceforYy  })
11296292cf5SsinceforYy    .setAddr(0x32)
11396292cf5SsinceforYy
11496292cf5SsinceforYy  val miprios: Seq[CSRModule[_]] = (4 to (0xF, 2)).map(num =>
11596292cf5SsinceforYy    Module(new CSRModule(s"Iprio$num", new IprioBundle) with HasIeBundle {
11696292cf5SsinceforYy      val mask = Wire(Vec(8, UInt(8.W)))
11796292cf5SsinceforYy      for (i <- 0 until 8) {
11896292cf5SsinceforYy        mask(i) := Fill(8, mie.asUInt(num*4+i))
11996292cf5SsinceforYy      }
12096292cf5SsinceforYy      regOut := reg & mask.asUInt
12196292cf5SsinceforYy    })
122a53de5b8SsinceforYy      .setAddr(0x30 + num)
123a53de5b8SsinceforYy  )
124acddddb6SsinceforYy
12596292cf5SsinceforYy  val siprio0 = Module(new CSRModule(s"Iprio0", new Iprio0Bundle) with HasIeBundle {
12696292cf5SsinceforYy    val mask = Wire(Vec(8, UInt(8.W)))
12796292cf5SsinceforYy    for (i <- 0 until 8) {
12896292cf5SsinceforYy      mask(i) := Fill(8, sie.asUInt(i))
12996292cf5SsinceforYy    }
13096292cf5SsinceforYy    regOut := reg & mask.asUInt
13196292cf5SsinceforYy  })
132acddddb6SsinceforYy    .setAddr(0x30)
133acddddb6SsinceforYy
13496292cf5SsinceforYy  val siprio2 = Module(new CSRModule(s"Iprio2", new SIprio2Bundle) with HasIeBundle {
13596292cf5SsinceforYy    val mask = Wire(Vec(8, UInt(8.W)))
13696292cf5SsinceforYy    for (i <- 0 until 8) {
13796292cf5SsinceforYy      mask(i) := Fill(8, sie.asUInt(i+8))
13896292cf5SsinceforYy    }
13996292cf5SsinceforYy    regOut := reg & mask.asUInt
14096292cf5SsinceforYy  })
14196292cf5SsinceforYy    .setAddr(0x32)
14296292cf5SsinceforYy
14396292cf5SsinceforYy  val siprios: Seq[CSRModule[_]] = (4 to (0xF, 2)).map(num =>
14496292cf5SsinceforYy    Module(new CSRModule(s"Iprio$num", new IprioBundle) with HasIeBundle{
14596292cf5SsinceforYy      val mask = Wire(Vec(8, UInt(8.W)))
14696292cf5SsinceforYy      for (i <- 0 until 8) {
14796292cf5SsinceforYy        mask(i) := Fill(8, sie.asUInt(num*4+i))
14896292cf5SsinceforYy      }
14996292cf5SsinceforYy      regOut := reg & mask.asUInt
15096292cf5SsinceforYy    })
151a53de5b8SsinceforYy    .setAddr(0x30 + num)
152a53de5b8SsinceforYy  )
153acddddb6SsinceforYy
15496292cf5SsinceforYy  val miregiprios: Seq[CSRModule[_]] = Seq(miprio0, miprio2) ++: miprios
155acddddb6SsinceforYy
15696292cf5SsinceforYy  val siregiprios: Seq[CSRModule[_]] = Seq(siprio0, siprio2) ++: siprios
15796292cf5SsinceforYy
15896292cf5SsinceforYy  val iregiprios = miregiprios ++ siregiprios
159523f2fa2SXuan Hu
1609681ffb2SXuan Hu  val aiaCSRMods = Seq(
1619681ffb2SXuan Hu    miselect,
1629681ffb2SXuan Hu    mireg,
1639681ffb2SXuan Hu    mtopei,
1649681ffb2SXuan Hu    mtopi,
1659681ffb2SXuan Hu    siselect,
1669681ffb2SXuan Hu    sireg,
1679681ffb2SXuan Hu    stopei,
1689681ffb2SXuan Hu    stopi,
1699681ffb2SXuan Hu    vsiselect,
1709681ffb2SXuan Hu    vsireg,
1719681ffb2SXuan Hu    vstopi,
1729681ffb2SXuan Hu    vstopei,
173523f2fa2SXuan Hu  )
1749681ffb2SXuan Hu
17594895e77SXuan Hu  val aiaCSRMap: SeqMap[Int, (CSRAddrWriteBundle[_], UInt)] = SeqMap.from(
1768aa89407SXuan Hu    aiaCSRMods.map(csr => (csr.addr -> (csr.w -> csr.rdata))).iterator
1779681ffb2SXuan Hu  )
1789681ffb2SXuan Hu
179e877d8bfSXuan Hu  val aiaCSROutMap: SeqMap[Int, UInt] = SeqMap.from(
180e877d8bfSXuan Hu    aiaCSRMods.map(csr => (csr.addr -> csr.regOut.asInstanceOf[CSRBundle].asUInt)).iterator
181e877d8bfSXuan Hu  )
182523f2fa2SXuan Hu
1838aa89407SXuan Hu  private val miregRData: UInt = Mux1H(
1848aa89407SXuan Hu    miregiprios.map(prio => (miselect.rdata.asUInt === prio.addr.U) -> prio.rdata)
1858aa89407SXuan Hu  )
186523f2fa2SXuan Hu
1878aa89407SXuan Hu  private val siregRData: UInt = Mux1H(
1888aa89407SXuan Hu    siregiprios.map(prio => (siselect.rdata.asUInt === prio.addr.U) -> prio.rdata)
1898aa89407SXuan Hu  )
190523f2fa2SXuan Hu
191523f2fa2SXuan Hu  aiaCSRMods.foreach { mod =>
192523f2fa2SXuan Hu    mod match {
193523f2fa2SXuan Hu      case m: HasIregSink =>
1948aa89407SXuan Hu        m.iregRead.mireg := miregRData
1958aa89407SXuan Hu        m.iregRead.sireg := siregRData
196423dd365SXuan Hu        m.iregRead.vsireg := 0.U // Todo: IMSIC
197523f2fa2SXuan Hu      case _ =>
198523f2fa2SXuan Hu    }
199523f2fa2SXuan Hu  }
2009681ffb2SXuan Hu}
2019681ffb2SXuan Hu
202436f48ccSXuan Huclass ISelectField(final val maxValue: Int, reserved: Seq[Range]) extends CSREnum with WARLApply {
203e3da8badSTang Haojin  override def isLegal(enumeration: CSREnumType): Bool = enumeration.asUInt <= maxValue.U
2049681ffb2SXuan Hu}
2059681ffb2SXuan Hu
2069681ffb2SXuan Huobject VSISelectField extends ISelectField(
207*f9ed852fSNewPaulWalker  0xFFF,
2089681ffb2SXuan Hu  reserved = Seq(
2099681ffb2SXuan Hu    Range.inclusive(0x000, 0x02F),
2109681ffb2SXuan Hu    Range.inclusive(0x040, 0x06F),
211*f9ed852fSNewPaulWalker    Range.inclusive(0x100, 0xFFF),
2129681ffb2SXuan Hu  ),
2139681ffb2SXuan Hu)
2149681ffb2SXuan Hu
2159681ffb2SXuan Huobject MISelectField extends ISelectField(
2169681ffb2SXuan Hu  maxValue = 0xFF,
2179681ffb2SXuan Hu  reserved = Seq(
2189681ffb2SXuan Hu    Range.inclusive(0x00, 0x2F),
2199681ffb2SXuan Hu    Range.inclusive(0x40, 0x6F),
2209681ffb2SXuan Hu  ),
2219681ffb2SXuan Hu)
2229681ffb2SXuan Hu
2239681ffb2SXuan Huobject SISelectField extends ISelectField(
224*f9ed852fSNewPaulWalker  maxValue = 0xFFF,
2259681ffb2SXuan Hu  reserved = Seq(
226*f9ed852fSNewPaulWalker    Range.inclusive(0x000, 0x02F),
227*f9ed852fSNewPaulWalker    Range.inclusive(0x040, 0x06F),
228*f9ed852fSNewPaulWalker    Range.inclusive(0x100, 0xFFF),
2299681ffb2SXuan Hu  ),
2309681ffb2SXuan Hu)
2319681ffb2SXuan Hu
2329681ffb2SXuan Huclass VSISelectBundle extends CSRBundle {
233*f9ed852fSNewPaulWalker  val ALL = VSISelectField(log2Up(0xFFF), 0, null).withReset(0.U)
2349681ffb2SXuan Hu}
2359681ffb2SXuan Hu
2369681ffb2SXuan Huclass MISelectBundle extends CSRBundle {
23711f2d1cbSXuan Hu  val ALL = MISelectField(log2Up(0xFF), 0, null).withReset(0.U)
2389681ffb2SXuan Hu}
2399681ffb2SXuan Hu
2409681ffb2SXuan Huclass SISelectBundle extends CSRBundle {
241*f9ed852fSNewPaulWalker  val ALL = SISelectField(log2Up(0xFFF), 0, null).withReset(0.U)
2429681ffb2SXuan Hu}
2439681ffb2SXuan Hu
2449681ffb2SXuan Huclass TopIBundle extends CSRBundle {
2459681ffb2SXuan Hu  val IID   = RO(27, 16)
2469681ffb2SXuan Hu  val IPRIO = RO(7, 0)
2479681ffb2SXuan Hu}
2489681ffb2SXuan Hu
2499681ffb2SXuan Huclass TopEIBundle extends CSRBundle {
2509681ffb2SXuan Hu  val IID   = RW(26, 16)
2519681ffb2SXuan Hu  val IPRIO = RW(10, 0)
2529681ffb2SXuan Hu}
2539681ffb2SXuan Hu
254a53de5b8SsinceforYyclass IprioBundle extends FieldInitBundle
255acddddb6SsinceforYy
256acddddb6SsinceforYyclass Iprio0Bundle extends CSRBundle {
257acddddb6SsinceforYy  val PrioSSI  = RW(15,  8).withReset(0.U)
258acddddb6SsinceforYy  val PrioVSSI = RW(23, 16).withReset(0.U)
259acddddb6SsinceforYy  val PrioMSI  = RW(31, 24).withReset(0.U)
260acddddb6SsinceforYy  val PrioSTI  = RW(47, 40).withReset(0.U)
261acddddb6SsinceforYy  val PrioVSTI = RW(55, 48).withReset(0.U)
262acddddb6SsinceforYy  val PrioMTI  = RW(63, 56).withReset(0.U)
263acddddb6SsinceforYy}
264acddddb6SsinceforYy
26596292cf5SsinceforYyclass MIprio2Bundle extends CSRBundle {
26696292cf5SsinceforYy  val PrioSEI   = RW(15,  8).withReset(0.U)
26796292cf5SsinceforYy  val PrioVSEI  = RW(23, 16).withReset(0.U)
26896292cf5SsinceforYy  val PrioMEI   = RO(31, 24).withReset(0.U)
26996292cf5SsinceforYy  val PrioSGEI  = RW(39, 32).withReset(0.U)
27096292cf5SsinceforYy  val PrioLCOFI = RW(47, 40).withReset(0.U)
27196292cf5SsinceforYy  val Prio14    = RW(55, 48).withReset(0.U)
27296292cf5SsinceforYy  val Prio15    = RW(63, 56).withReset(0.U)
27396292cf5SsinceforYy}
27496292cf5SsinceforYy
27596292cf5SsinceforYyclass SIprio2Bundle extends CSRBundle {
27696292cf5SsinceforYy  val PrioSEI   = RO(15,  8).withReset(0.U)
27796292cf5SsinceforYy  val PrioVSEI  = RW(23, 16).withReset(0.U)
27896292cf5SsinceforYy  val PrioMEI   = RW(31, 24).withReset(0.U)
27996292cf5SsinceforYy  val PrioSGEI  = RW(39, 32).withReset(0.U)
28096292cf5SsinceforYy  val PrioLCOFI = RW(47, 40).withReset(0.U)
28196292cf5SsinceforYy  val Prio14    = RW(55, 48).withReset(0.U)
28296292cf5SsinceforYy  val Prio15    = RW(63, 56).withReset(0.U)
28396292cf5SsinceforYy}
28496292cf5SsinceforYy
2858cfc24b2STang Haojinclass CSRToAIABundle(implicit p: Parameters) extends XSBundle with HasSoCParameter {
2869681ffb2SXuan Hu  val addr = ValidIO(new Bundle {
2878cfc24b2STang Haojin    val addr = UInt(soc.IMSICParams.iselectWidth.W)
2889681ffb2SXuan Hu    val v = VirtMode()
2899681ffb2SXuan Hu    val prvm = PrivMode()
2909681ffb2SXuan Hu  })
2919681ffb2SXuan Hu
2928cfc24b2STang Haojin  val vgein = UInt(soc.IMSICParams.vgeinWidth.W)
2939681ffb2SXuan Hu
2949681ffb2SXuan Hu  val wdata = ValidIO(new Bundle {
295f7c21cb5SXuan Hu    val op = UInt(2.W)
2969681ffb2SXuan Hu    val data = UInt(XLEN.W)
2979681ffb2SXuan Hu  })
2989681ffb2SXuan Hu
2999681ffb2SXuan Hu  val mClaim = Bool()
3009681ffb2SXuan Hu  val sClaim = Bool()
3019681ffb2SXuan Hu  val vsClaim = Bool()
3029681ffb2SXuan Hu}
3039681ffb2SXuan Hu
3048cfc24b2STang Haojinclass AIAToCSRBundle(implicit p: Parameters) extends XSBundle with HasSoCParameter {
3059681ffb2SXuan Hu  val rdata = ValidIO(new Bundle {
3069681ffb2SXuan Hu    val data = UInt(XLEN.W)
3079681ffb2SXuan Hu    val illegal = Bool()
3089681ffb2SXuan Hu  })
30989bb2535SXuan Hu  val meip    = Bool()
31089bb2535SXuan Hu  val seip    = Bool()
3118cfc24b2STang Haojin  val vseip   = UInt(soc.IMSICParams.geilen.W)
31289bb2535SXuan Hu  val mtopei  = new TopEIBundle
31389bb2535SXuan Hu  val stopei  = new TopEIBundle
31489bb2535SXuan Hu  val vstopei = new TopEIBundle
3159681ffb2SXuan Hu}
316007f6122SXuan Hu
317007f6122SXuan Hutrait HasAIABundle { self: CSRModule[_] =>
318007f6122SXuan Hu  val aiaToCSR = IO(Input(new AIAToCSRBundle))
319007f6122SXuan Hu}
3204016eee8SsinceforYy
321523f2fa2SXuan Hutrait HasInterruptFilterSink { self: CSRModule[_] =>
322523f2fa2SXuan Hu  val topIR = IO(new Bundle {
3234016eee8SsinceforYy    val mtopi  = Input(new TopIBundle)
3244016eee8SsinceforYy    val stopi  = Input(new TopIBundle)
3254016eee8SsinceforYy    val vstopi = Input(new TopIBundle)
3264016eee8SsinceforYy  })
3274016eee8SsinceforYy}
3284016eee8SsinceforYy
3294016eee8SsinceforYytrait HasISelectBundle { self: CSRModule[_] =>
330f7c21cb5SXuan Hu  val inIMSICRange = IO(Output(Bool()))
331f7c21cb5SXuan Hu  val isIllegal = IO(Output(Bool()))
3324016eee8SsinceforYy}
333523f2fa2SXuan Hu
334523f2fa2SXuan Hutrait HasIregSink { self: CSRModule[_] =>
335523f2fa2SXuan Hu  val iregRead = IO(Input(new Bundle {
336523f2fa2SXuan Hu    val mireg = UInt(XLEN.W) // Todo: check if use ireg bundle, and shrink the width
337523f2fa2SXuan Hu    val sireg = UInt(XLEN.W)
338523f2fa2SXuan Hu    val vsireg = UInt(XLEN.W)
339523f2fa2SXuan Hu  }))
340523f2fa2SXuan Hu}
34196292cf5SsinceforYy
34296292cf5SsinceforYytrait HasIeBundle { self: CSRModule[_] =>
34396292cf5SsinceforYy  val mie = IO(Input(new MieBundle))
34496292cf5SsinceforYy  val sie = IO(Input(new SieBundle))
34596292cf5SsinceforYy}
346