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