xref: /XiangShan/src/main/scala/xiangshan/backend/fu/NewCSR/CSRAIA.scala (revision c2650312b580f636dcbe07b8ba84fa3d8b9d3e3d)
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._
7
8import scala.collection.immutable.SeqMap
9
10trait CSRAIA { self: NewCSR =>
11  val miselect = Module(new CSRModule("Miselevt", new MISelectBundle))
12    .setAddr(0x350)
13
14  val mireg = Module(new CSRModule("Mireg"))
15    .setAddr(0x351)
16
17  val mtopei = Module(new CSRModule("Mtopei", new CSRBundle {
18    val id   = RW(26, 16)
19    val prio = RW(10,  0)
20  }))
21    .setAddr(0x35C)
22
23  val mtopi = Module(new CSRModule("Mtopi", new TopIBundle))
24    .setAddr(0xFB0)
25
26  val siselect = Module(new CSRModule("Siselect", new SISelectBundle))
27    .setAddr(0x150)
28
29  val sireg = Module(new CSRModule("Sireg"))
30    .setAddr(0x151)
31
32  val stopei = Module(new CSRModule("Stopei", new CSRBundle {
33    val id   = RW(26, 16)
34    val prio = RW(10,  0)
35  }))
36    .setAddr(0x15C)
37
38  val stopi = Module(new CSRModule("Stopi", new TopIBundle))
39    .setAddr(0xDB0)
40
41  val vsiselect = Module(new CSRModule("VSiselect", new VSISelectBundle))
42    .setAddr(0x250)
43
44  val vsireg    = Module(new CSRModule("VSireg"))
45    .setAddr(0x251)
46
47  val vstopei   = Module(new CSRModule("VStopei", new CSRBundle {
48    val id   = RW(26, 16)
49    val prio = RW(10,  0)
50  }))
51    .setAddr(0x25C)
52
53  val vstopi = Module(new CSRModule("VStopi", new TopIBundle))
54    .setAddr(0xEB0)
55
56  val aiaCSRMods = Seq(
57    miselect,
58    mireg,
59    mtopei,
60    mtopi,
61    siselect,
62    sireg,
63    stopei,
64    stopi,
65    vsiselect,
66    vsireg,
67    vstopi,
68    vstopei,
69  )
70
71  val aiaCSRMap = SeqMap.from(
72    aiaCSRMods.map(csr => (csr.addr -> (csr.w -> csr.rdata.asInstanceOf[CSRBundle].asUInt))).iterator
73  )
74
75}
76
77class ISelectField(final val maxValue: Int, reserved: Seq[Range]) extends CSREnum with CSRWARLApply {
78  override def isLegal(enum: CSREnumType): Bool = {
79    !reserved.map(range => enum.asUInt >= range.start.U && enum.asUInt <= range.end.U).reduce(_ || _)
80  }
81}
82
83object VSISelectField extends ISelectField(
84  0x1FF,
85  reserved = Seq(
86    Range.inclusive(0x000, 0x02F),
87    Range.inclusive(0x040, 0x06F),
88    Range.inclusive(0x100, 0x1FF),
89  ),
90)
91
92object MISelectField extends ISelectField(
93  maxValue = 0xFF,
94  reserved = Seq(
95    Range.inclusive(0x00, 0x2F),
96    Range.inclusive(0x40, 0x6F),
97  ),
98)
99
100object SISelectField extends ISelectField(
101  maxValue = 0xFF,
102  reserved = Seq(
103    Range.inclusive(0x00, 0x2F),
104    Range.inclusive(0x40, 0x6F),
105  ),
106)
107
108class VSISelectBundle extends CSRBundle {
109  val ALL = VSISelectField(log2Up(0x1FF), 0, null)
110}
111
112class MISelectBundle extends CSRBundle {
113  val ALL = MISelectField(log2Up(0xFF), 0, null)
114}
115
116class SISelectBundle extends CSRBundle {
117  val ALL = SISelectField(log2Up(0xFF), 0, null)
118}
119
120class TopIBundle extends CSRBundle {
121  val IID   = RO(27, 16)
122  val IPRIO = RO(7, 0)
123}
124
125class TopEIBundle extends CSRBundle {
126  val IID   = RW(26, 16)
127  val IPRIO = RW(10, 0)
128}
129
130class CSRToAIABundle extends Bundle {
131  private final val AddrWidth = 12
132
133  val addr = ValidIO(new Bundle {
134    val addr = UInt(AddrWidth.W)
135    val v = VirtMode()
136    val prvm = PrivMode()
137  })
138
139  val vgein = UInt(VGEINWidth.W)
140
141  val wdata = ValidIO(new Bundle {
142    val data = UInt(XLEN.W)
143  })
144
145  val mClaim = Bool()
146  val sClaim = Bool()
147  val vsClaim = Bool()
148}
149
150class AIAToCSRBundle extends Bundle {
151  val rdata = ValidIO(new Bundle {
152    val data = UInt(XLEN.W)
153    val illegal = Bool()
154  })
155  val mtopei = new TopEIBundle
156  val stopei = new TopEIBundle
157  val vstopei = new TopEIBundle
158}
159