xref: /XiangShan/src/main/scala/xiangshan/backend/fu/NewCSR/CSRAIA.scala (revision 2c0548164dcff8bdad1f79d5cbaf393922b85cdc)
1package xiangshan.backend.fu.NewCSR
2
3import chisel3._
4import chisel3.util._
5import freechips.rocketchip.rocket.CSRs
6import CSRConfig._
7import xiangshan.backend.fu.NewCSR.CSRBundles.PrivState
8import xiangshan.backend.fu.NewCSR.CSRConfig._
9import xiangshan.backend.fu.NewCSR.CSRDefines.{CSRROField => RO, CSRRWField => RW, _}
10
11import scala.collection.immutable.SeqMap
12
13trait CSRAIA { self: NewCSR with HypervisorLevel =>
14  val miselect = Module(new CSRModule("Miselevt", new MISelectBundle))
15    .setAddr(CSRs.miselect)
16
17  val mireg = Module(new CSRModule("Mireg") with HasIregSink {
18    rdata := iregRead.mireg
19  })
20    .setAddr(CSRs.mireg)
21
22  val mtopei = Module(new CSRModule("Mtopei", new CSRBundle {
23    val id   = RW(26, 16)
24    val prio = RW(10,  0)
25  }))
26    .setAddr(CSRs.mtopei)
27
28  val mtopi = Module(new CSRModule("Mtopi", new TopIBundle) with HasInterruptFilterSink {
29    regOut.IID   := topIR.mtopi.IID
30    regOut.IPRIO := topIR.mtopi.IPRIO
31  })
32    .setAddr(CSRs.mtopi)
33
34  val siselect = Module(new CSRModule("Siselect", new SISelectBundle))
35    .setAddr(CSRs.siselect)
36
37  val sireg = Module(new CSRModule("Sireg") with HasIregSink {
38    rdata := iregRead.sireg
39  })
40    .setAddr(CSRs.sireg)
41
42  val stopei = Module(new CSRModule("Stopei", new CSRBundle {
43    val id   = RW(26, 16)
44    val prio = RW(10,  0)
45  }))
46    .setAddr(CSRs.stopei)
47
48  val stopi = Module(new CSRModule("Stopi", new TopIBundle) with HasInterruptFilterSink {
49    regOut.IID   := topIR.stopi.IID
50    regOut.IPRIO := topIR.stopi.IPRIO
51  })
52    .setAddr(CSRs.stopi)
53
54  val vsiselect = Module(new CSRModule("VSiselect", new VSISelectBundle))
55    .setAddr(CSRs.vsiselect)
56
57  val vsireg    = Module(new CSRModule("VSireg") with HasIregSink {
58    rdata := iregRead.sireg
59  })
60    .setAddr(CSRs.vsireg)
61
62  val vstopei   = Module(new CSRModule("VStopei", new CSRBundle {
63    val id   = RW(26, 16)
64    val prio = RW(10,  0)
65  }))
66    .setAddr(CSRs.vstopei)
67
68  val vstopi = Module(new CSRModule("VStopi", new TopIBundle) with HasInterruptFilterSink {
69    regOut.IID   := topIR.vstopi.IID
70    regOut.IPRIO := topIR.vstopi.IPRIO
71  })
72    .setAddr(CSRs.vstopi)
73
74  val miregiprios: Seq[CSRModule[_]] = Range(0, 0xF, 2).map(num =>
75    Module(new CSRModule(s"Iprio$num"))
76      .setAddr(0x30 + num)
77  )
78
79  val siregiprios: Seq[CSRModule[_]] = Range(0, 0xF, 2).map(num =>
80    Module(new CSRModule(s"Iprio$num"))
81      .setAddr(0x30 + num)
82  )
83
84  val aiaCSRMods = Seq(
85    miselect,
86    mireg,
87    mtopei,
88    mtopi,
89    siselect,
90    sireg,
91    stopei,
92    stopi,
93    vsiselect,
94    vsireg,
95    vstopi,
96    vstopei,
97  )
98
99  val aiaCSRMap = SeqMap.from(
100    aiaCSRMods.map(csr => (csr.addr -> (csr.w -> csr.rdata))).iterator
101  )
102
103  val aiaCSROutMap: SeqMap[Int, UInt] = SeqMap.from(
104    aiaCSRMods.map(csr => (csr.addr -> csr.regOut.asInstanceOf[CSRBundle].asUInt)).iterator
105  )
106
107  private val miregRData: UInt = Mux1H(
108    miregiprios.map(prio => (miselect.rdata.asUInt === prio.addr.U) -> prio.rdata)
109  )
110
111  private val siregRData: UInt = Mux1H(
112    siregiprios.map(prio => (siselect.rdata.asUInt === prio.addr.U) -> prio.rdata)
113  )
114
115  aiaCSRMods.foreach { mod =>
116    mod match {
117      case m: HasIregSink =>
118        m.iregRead.mireg := miregRData
119        m.iregRead.sireg := siregRData
120        m.iregRead.vsireg := 0.U // Todo: IMSIC
121      case _ =>
122    }
123  }
124}
125
126class ISelectField(final val maxValue: Int, reserved: Seq[Range]) extends CSREnum with WARLApply {
127  override def isLegal(enum: CSREnumType): Bool = {
128    !reserved.map(range => enum.asUInt >= range.start.U && enum.asUInt <= range.end.U).reduce(_ || _)
129  }
130}
131
132object VSISelectField extends ISelectField(
133  0x1FF,
134  reserved = Seq(
135    Range.inclusive(0x000, 0x02F),
136    Range.inclusive(0x040, 0x06F),
137    Range.inclusive(0x100, 0x1FF),
138  ),
139)
140
141object MISelectField extends ISelectField(
142  maxValue = 0xFF,
143  reserved = Seq(
144    Range.inclusive(0x00, 0x2F),
145    Range.inclusive(0x40, 0x6F),
146  ),
147)
148
149object SISelectField extends ISelectField(
150  maxValue = 0xFF,
151  reserved = Seq(
152    Range.inclusive(0x00, 0x2F),
153    Range.inclusive(0x40, 0x6F),
154  ),
155)
156
157class VSISelectBundle extends CSRBundle {
158  val ALL = VSISelectField(log2Up(0x1FF), 0, null)
159}
160
161class MISelectBundle extends CSRBundle {
162  val ALL = MISelectField(log2Up(0xFF), 0, null)
163}
164
165class SISelectBundle extends CSRBundle {
166  val ALL = SISelectField(log2Up(0xFF), 0, null)
167}
168
169class TopIBundle extends CSRBundle {
170  val IID   = RO(27, 16)
171  val IPRIO = RO(7, 0)
172}
173
174class TopEIBundle extends CSRBundle {
175  val IID   = RW(26, 16)
176  val IPRIO = RW(10, 0)
177}
178
179class IprioBundle extends CSRBundle {
180  val ALL = RW(63, 0).withReset(0.U)
181}
182
183class CSRToAIABundle extends Bundle {
184  private final val AddrWidth = 12
185
186  val addr = ValidIO(new Bundle {
187    val addr = UInt(AddrWidth.W)
188    val v = VirtMode()
189    val prvm = PrivMode()
190  })
191
192  val vgein = UInt(VGEINWidth.W)
193
194  val wdata = ValidIO(new Bundle {
195    val data = UInt(XLEN.W)
196  })
197
198  val mClaim = Bool()
199  val sClaim = Bool()
200  val vsClaim = Bool()
201}
202
203class AIAToCSRBundle extends Bundle {
204  val rdata = ValidIO(new Bundle {
205    val data = UInt(XLEN.W)
206    val illegal = Bool()
207  })
208  val mtopei = ValidIO(new TopEIBundle)
209  val stopei = ValidIO(new TopEIBundle)
210  val vstopei = ValidIO(new TopEIBundle)
211}
212
213trait HasAIABundle { self: CSRModule[_] =>
214  val aiaToCSR = IO(Input(new AIAToCSRBundle))
215}
216
217trait HasInterruptFilterSink { self: CSRModule[_] =>
218  val topIR = IO(new Bundle {
219    val mtopi  = Input(new TopIBundle)
220    val stopi  = Input(new TopIBundle)
221    val vstopi = Input(new TopIBundle)
222  })
223}
224
225trait HasISelectBundle { self: CSRModule[_] =>
226  val privState = IO(Input(new PrivState))
227  val miselect = IO(Input(new MISelectBundle))
228  val siselect = IO(Input(new SISelectBundle))
229  val mireg = IO(Input(UInt(XLEN.W)))
230  val sireg = IO(Input(UInt(XLEN.W)))
231}
232
233trait HasIregSink { self: CSRModule[_] =>
234  val iregRead = IO(Input(new Bundle {
235    val mireg = UInt(XLEN.W) // Todo: check if use ireg bundle, and shrink the width
236    val sireg = UInt(XLEN.W)
237    val vsireg = UInt(XLEN.W)
238  }))
239}