xref: /XiangShan/src/main/scala/xiangshan/backend/fu/NewCSR/InterruptBundle.scala (revision 887862dbb8debde8ab099befc426493834a69ee7)
1package xiangshan.backend.fu.NewCSR
2
3import chisel3._
4import chisel3.util._
5import xiangshan.backend.fu.NewCSR.CSRDefines.{CSRROField => RO, CSRRWField => RW}
6import xiangshan.backend.fu.NewCSR.ChiselRecordForField.AddRecordSpecifyFields
7
8class InterruptBundle extends CSRBundle {
9  // Software Interrupt
10  val SSI      = RW(1)
11  val VSSI     = RW(2)
12  val MSI      = RW(3)
13  // Time Interrupt
14  val STI      = RW(5)
15  val VSTI     = RW(6)
16  val MTI      = RW(7)
17  // External Interrupt
18  val SEI      = RW(9)
19  val VSEI     = RW(10)
20  val MEI      = RW(11)
21  val SGEI     = RW(12)
22  // SoC
23  val LCOFI    = RW(13) // Counter overflow interrupt
24  val LC14I    = RO(14)
25  val LC15I    = RO(15)
26  val LC16I    = RO(16)
27  val LC17I    = RO(17)
28  val LC18I    = RO(18)
29  val LC19I    = RO(19)
30  val LC20I    = RO(20)
31  val LC21I    = RO(21)
32  val LC22I    = RO(22)
33  val LC23I    = RO(23)
34  val LC24I    = RO(24)
35  val LC25I    = RO(25)
36  val LC26I    = RO(26)
37  val LC27I    = RO(27)
38  val LC28I    = RO(28)
39  val LC29I    = RO(29)
40  val LC30I    = RO(30)
41  val LC31I    = RO(31)
42  val LC32I    = RO(32)
43  val LC33I    = RO(33)
44  val LC34I    = RO(34)
45  val LPRASEI  = RO(35)
46  val LC36I    = RO(36)
47  val LC37I    = RO(37)
48  val LC38I    = RO(38)
49  val LC39I    = RO(39)
50  val LC40I    = RO(40)
51  val LC41I    = RO(41)
52  val LC42I    = RO(42)
53  val HPRASEI  = RO(43)
54  val LC44I    = RO(44)
55  val LC45I    = RO(45)
56  val LC46I    = RO(46)
57  val LC47I    = RO(47)
58  val LC48I    = RO(48)
59  val LC49I    = RO(49)
60  val LC50I    = RO(50)
61  val LC51I    = RO(51)
62  val LC52I    = RO(52)
63  val LC53I    = RO(53)
64  val LC54I    = RO(54)
65  val LC55I    = RO(55)
66  val LC56I    = RO(56)
67  val LC57I    = RO(57)
68  val LC58I    = RO(58)
69  val LC59I    = RO(59)
70  val LC60I    = RO(60)
71  val LC61I    = RO(61)
72  val LC62I    = RO(62)
73  val LC63I    = RO(63)
74
75  def getVS = Seq(VSSI, VSTI, VSEI)
76
77  def getHS = Seq(SSI, STI, SEI)
78
79  def getM = Seq(MSI, MTI, MEI)
80
81  def getNonLocal = Seq(
82    SSI, VSSI, MSI,
83    STI, VSTI, MTI,
84    SEI, VSEI, MEI,
85    SGEI
86  )
87
88  def getLocal = Seq(
89    LCOFI,LC14I,LC15I,
90    LC16I,LC17I,LC18I,LC19I,LC20I,LC21I,LC22I,LC23I,
91    LC24I,LC25I,LC26I,LC27I,LC28I,LC29I,LC30I,LC31I,
92    LC32I,LC33I,LC34I,LPRASEI,LC36I,LC37I,LC38I,LC39I,
93    LC40I,LC41I,LC42I,HPRASEI,LC44I,LC45I,LC46I,LC47I,
94    LC48I,LC49I,LC50I,LC51I,LC52I,LC53I,LC54I,LC55I,
95    LC56I,LC57I,LC58I,LC59I,LC60I,LC61I,LC62I,LC63I,
96  )
97
98  def getALL = getNonLocal ++ getLocal
99}
100
101class InterruptPendingBundle extends CSRBundle {
102  // Software Interrupt
103  val SSIP     = RO(1)
104  val VSSIP    = RO(2)
105  val MSIP     = RO(3)
106  // Time Interrupt
107  val STIP     = RO(5)
108  val VSTIP    = RO(6)
109  val MTIP     = RO(7)
110  // External Interrupt
111  val SEIP     = RO(9)
112  val VSEIP    = RO(10)
113  val MEIP     = RO(11)
114  val SGEIP    = RO(12)
115  // Local Interrupt
116  val LCOFIP   = RO(13) // Counter overflow interrupt
117  val LC14IP   = RO(14)
118  val LC15IP   = RO(15)
119  val LC16IP   = RO(16)
120  val LC17IP   = RO(17)
121  val LC18IP   = RO(18)
122  val LC19IP   = RO(19)
123  val LC20IP   = RO(20)
124  val LC21IP   = RO(21)
125  val LC22IP   = RO(22)
126  val LC23IP   = RO(23)
127  val LC24IP   = RO(24)
128  val LC25IP   = RO(25)
129  val LC26IP   = RO(26)
130  val LC27IP   = RO(27)
131  val LC28IP   = RO(28)
132  val LC29IP   = RO(29)
133  val LC30IP   = RO(30)
134  val LC31IP   = RO(31)
135  val LC32IP   = RO(32)
136  val LC33IP   = RO(33)
137  val LC34IP   = RO(34)
138  val LPRASEIP = RO(35) // Low-priority RAS event interrupt
139  val LC36IP   = RO(36)
140  val LC37IP   = RO(37)
141  val LC38IP   = RO(38)
142  val LC39IP   = RO(39)
143  val LC40IP   = RO(40)
144  val LC41IP   = RO(41)
145  val LC42IP   = RO(42)
146  val HPRASEIP = RO(43) // High-priority RAS event interrupt
147  val LC44IP   = RO(44)
148  val LC45IP   = RO(45)
149  val LC46IP   = RO(46)
150  val LC47IP   = RO(47)
151  val LC48IP   = RO(48)
152  val LC49IP   = RO(49)
153  val LC50IP   = RO(50)
154  val LC51IP   = RO(51)
155  val LC52IP   = RO(52)
156  val LC53IP   = RO(53)
157  val LC54IP   = RO(54)
158  val LC55IP   = RO(55)
159  val LC56IP   = RO(56)
160  val LC57IP   = RO(57)
161  val LC58IP   = RO(58)
162  val LC59IP   = RO(59)
163  val LC60IP   = RO(60)
164  val LC61IP   = RO(61)
165  val LC62IP   = RO(62)
166  val LC63IP   = RO(63)
167
168  def getVS = Seq(VSSIP, VSTIP, VSEIP)
169
170  def getHS = Seq(SSIP, STIP, SEIP)
171
172  def getM = Seq(MSIP, MTIP, MEIP)
173
174  def getNonLocal = Seq(
175    SSIP, VSSIP, MSIP,
176    STIP, VSTIP, MTIP,
177    SEIP, VSEIP, MEIP,
178    SGEIP
179  )
180
181  def getLocal = Seq(
182    LCOFIP,LC14IP,LC15IP,
183    LC16IP,LC17IP,LC18IP,LC19IP,LC20IP,LC21IP,LC22IP,LC23IP,
184    LC24IP,LC25IP,LC26IP,LC27IP,LC28IP,LC29IP,LC30IP,LC31IP,
185    LC32IP,LC33IP,LC34IP,LPRASEIP,LC36IP,LC37IP,LC38IP,LC39IP,
186    LC40IP,LC41IP,LC42IP,HPRASEIP,LC44IP,LC45IP,LC46IP,LC47IP,
187    LC48IP,LC49IP,LC50IP,LC51IP,LC52IP,LC53IP,LC54IP,LC55IP,
188    LC56IP,LC57IP,LC58IP,LC59IP,LC60IP,LC61IP,LC62IP,LC63IP,
189  )
190
191  def getALL = getNonLocal ++ getLocal
192}
193
194class InterruptEnableBundle extends CSRBundle {
195  // Software Interrupt
196  val SSIE     = RO(1)
197  val VSSIE    = RO(2)
198  val MSIE     = RO(3)
199  // Time Interrupt
200  val STIE     = RO(5)
201  val VSTIE    = RO(6)
202  val MTIE     = RO(7)
203  // External Interrupt
204  val SEIE     = RO(9)
205  val VSEIE    = RO(10)
206  val MEIE     = RO(11)
207  val SGEIE    = RO(12)
208  // SoC
209  val LCOFIE   = RO(13) // Counter overflow interrupt
210  val LC14IE   = RO(14)
211  val LC15IE   = RO(15)
212  val LC16IE   = RO(16)
213  val LC17IE   = RO(17)
214  val LC18IE   = RO(18)
215  val LC19IE   = RO(19)
216  val LC20IE   = RO(20)
217  val LC21IE   = RO(21)
218  val LC22IE   = RO(22)
219  val LC23IE   = RO(23)
220  val LC24IE   = RO(24)
221  val LC25IE   = RO(25)
222  val LC26IE   = RO(26)
223  val LC27IE   = RO(27)
224  val LC28IE   = RO(28)
225  val LC29IE   = RO(29)
226  val LC30IE   = RO(30)
227  val LC31IE   = RO(31)
228  val LC32IE   = RO(32)
229  val LC33IE   = RO(33)
230  val LC34IE   = RO(34)
231  val LPRASEIE = RO(35) // Low-priority RAS event interrupt
232  val LC36IE   = RO(36)
233  val LC37IE   = RO(37)
234  val LC38IE   = RO(38)
235  val LC39IE   = RO(39)
236  val LC40IE   = RO(40)
237  val LC41IE   = RO(41)
238  val LC42IE   = RO(42)
239  val HPRASEIE = RO(43) // High-priority RAS event interrupt
240  val LC44IE   = RO(44)
241  val LC45IE   = RO(45)
242  val LC46IE   = RO(46)
243  val LC47IE   = RO(47)
244  val LC48IE   = RO(48)
245  val LC49IE   = RO(49)
246  val LC50IE   = RO(50)
247  val LC51IE   = RO(51)
248  val LC52IE   = RO(52)
249  val LC53IE   = RO(53)
250  val LC54IE   = RO(54)
251  val LC55IE   = RO(55)
252  val LC56IE   = RO(56)
253  val LC57IE   = RO(57)
254  val LC58IE   = RO(58)
255  val LC59IE   = RO(59)
256  val LC60IE   = RO(60)
257  val LC61IE   = RO(61)
258  val LC62IE   = RO(62)
259  val LC63IE   = RO(63)
260
261  def getVS = Seq(VSSIE, VSTIE, VSEIE)
262
263  def getHS = Seq(SSIE, STIE, SEIE)
264
265  def getM = Seq(MSIE, MTIE, MEIE)
266
267  def getNonVS = this.getHS ++ this.getM ++ this.getLocal :+ this.SGEIE
268
269  def getNonLocal = Seq(
270    SSIE, VSSIE, MSIE,
271    STIE, VSTIE, MTIE,
272    SEIE, VSEIE, MEIE,
273    SGEIE
274  )
275
276  def getLocal = Seq(
277    LCOFIE,LC14IE,LC15IE,
278    LC16IE,LC17IE,LC18IE,LC19IE,LC20IE,LC21IE,LC22IE,LC23IE,
279    LC24IE,LC25IE,LC26IE,LC27IE,LC28IE,LC29IE,LC30IE,LC31IE,
280    LC32IE,LC33IE,LC34IE,LPRASEIE,LC36IE,LC37IE,LC38IE,LC39IE,
281    LC40IE,LC41IE,LC42IE,HPRASEIE,LC44IE,LC45IE,LC46IE,LC47IE,
282    LC48IE,LC49IE,LC50IE,LC51IE,LC52IE,LC53IE,LC54IE,LC55IE,
283    LC56IE,LC57IE,LC58IE,LC59IE,LC60IE,LC61IE,LC62IE,LC63IE
284  )
285
286  def getALL = getNonLocal ++ getLocal
287
288  def getRW = getALL.filter(_.isRW)
289}
290
291object InterruptNO {
292  // Software Interrupt
293  final val SSI  = 1
294  final val VSSI = 2
295  final val MSI  = 3
296  // Time Interrupt
297  final val STI  = 5
298  final val VSTI = 6
299  final val MTI  = 7
300  // External Interrupt
301  final val SEI  = 9
302  final val VSEI = 10
303  final val MEI  = 11
304  final val SGEI = 12
305  // SoC
306  final val COI = 13
307  final val LPRASEI = 35
308  final val HPRASEI = 43
309
310  val interruptDefaultPrio = Seq(
311    MEI, MSI, MTI,
312    SEI, SSI, STI,
313    SGEI,
314    VSEI, VSSI, VSTI,
315    COI,
316  )
317
318  val localHighGroup = Seq(
319    47, 23, 46,
320    45, 22, 44,
321    HPRASEI, 21, 42,
322    41, 20, 40,
323  )
324
325  val localLowGroup = Seq(
326    39, 19, 38,
327    37, 18, 36,
328    LPRASEI, 17, 34,
329    33, 16, 32,
330  )
331
332  val customHighestGroup = Seq(
333    63, 31, 62,
334    61, 30, 60,
335  )
336
337  val customMiddleHighGroup = Seq(
338    59, 29, 58,
339    57, 28, 56,
340  )
341
342  val customMiddleLowGroup = Seq(
343    55, 27, 54,
344    53, 26, 52,
345  )
346
347  val customLowestGroup = Seq(
348    51, 25, 50,
349    49, 24, 48,
350  )
351
352  def getPrioIdxInGroup(group: this.type => Seq[Int])(f: this.type => Int): Int = {
353    val idx = group(this).indexOf(f(this))
354    assert(idx != -1)
355    idx
356  }
357
358  def getVS = Seq(VSSI, VSTI, VSEI)
359
360  def getHS = Seq(SSI, STI, SEI)
361
362  def getM = Seq(MSI, MTI, MEI)
363
364  def getNonLocal = Seq(
365    SSI, VSSI, MSI,
366    STI, VSTI, MTI,
367    SEI, VSEI, MEI,
368    SGEI
369  )
370}
371
372trait HasIpIeBundle { self: CSRModule[_] =>
373  val mideleg = IO(Input(new MidelegBundle))
374  val mip     = IO(Input(new MipBundle))
375  val mie     = IO(Input(new MieBundle))
376  val mvip    = IO(Input(new MvipBundle))
377  val mvien   = IO(Input(new MvienBundle))
378  val hideleg = IO(Input(new HidelegBundle))
379  val hip     = IO(Input(new HipBundle))
380  val hie     = IO(Input(new HieBundle))
381  val hvien   = IO(Input(new HvienBundle))
382  val hvip    = IO(Input(new HvipBundle))
383  val sip     = IO(Input(new SipBundle))
384  val sie     = IO(Input(new SieBundle))
385  val vsip    = IO(Input(new VSipBundle))
386  val vsie    = IO(Input(new VSieBundle))
387  val hgeip   = IO(Input(new HgeipBundle))
388  val hgeie   = IO(Input(new HgeieBundle))
389  val hstatusVGEIN = IO(Input(HstatusVgeinField()))
390}
391
392trait ToAliasIpLocalPart extends Bundle {
393  val LCOFIP   = ValidIO(RO(13)) // Counter overflow interrupt
394  val LC14IP   = ValidIO(RO(14))
395  val LC15IP   = ValidIO(RO(15))
396  val LC16IP   = ValidIO(RO(16))
397  val LC17IP   = ValidIO(RO(17))
398  val LC18IP   = ValidIO(RO(18))
399  val LC19IP   = ValidIO(RO(19))
400  val LC20IP   = ValidIO(RO(20))
401  val LC21IP   = ValidIO(RO(21))
402  val LC22IP   = ValidIO(RO(22))
403  val LC23IP   = ValidIO(RO(23))
404  val LC24IP   = ValidIO(RO(24))
405  val LC25IP   = ValidIO(RO(25))
406  val LC26IP   = ValidIO(RO(26))
407  val LC27IP   = ValidIO(RO(27))
408  val LC28IP   = ValidIO(RO(28))
409  val LC29IP   = ValidIO(RO(29))
410  val LC30IP   = ValidIO(RO(30))
411  val LC31IP   = ValidIO(RO(31))
412  val LC32IP   = ValidIO(RO(32))
413  val LC33IP   = ValidIO(RO(33))
414  val LC34IP   = ValidIO(RO(34))
415  val LPRASEIP = ValidIO(RO(35)) // Low-priority RAS event interrupt
416  val LC36IP   = ValidIO(RO(36))
417  val LC37IP   = ValidIO(RO(37))
418  val LC38IP   = ValidIO(RO(38))
419  val LC39IP   = ValidIO(RO(39))
420  val LC40IP   = ValidIO(RO(40))
421  val LC41IP   = ValidIO(RO(41))
422  val LC42IP   = ValidIO(RO(42))
423  val HPRASEIP = ValidIO(RO(43)) // High-priority RAS event interrupt
424  val LC44IP   = ValidIO(RO(44))
425  val LC45IP   = ValidIO(RO(45))
426  val LC46IP   = ValidIO(RO(46))
427  val LC47IP   = ValidIO(RO(47))
428  val LC48IP   = ValidIO(RO(48))
429  val LC49IP   = ValidIO(RO(49))
430  val LC50IP   = ValidIO(RO(50))
431  val LC51IP   = ValidIO(RO(51))
432  val LC52IP   = ValidIO(RO(52))
433  val LC53IP   = ValidIO(RO(53))
434  val LC54IP   = ValidIO(RO(54))
435  val LC55IP   = ValidIO(RO(55))
436  val LC56IP   = ValidIO(RO(56))
437  val LC57IP   = ValidIO(RO(57))
438  val LC58IP   = ValidIO(RO(58))
439  val LC59IP   = ValidIO(RO(59))
440  val LC60IP   = ValidIO(RO(60))
441  val LC61IP   = ValidIO(RO(61))
442  val LC62IP   = ValidIO(RO(62))
443  val LC63IP   = ValidIO(RO(63))
444
445  def getLocal = Seq(
446    LCOFIP, LC14IP, LC15IP,
447    LC16IP, LC17IP, LC18IP, LC19IP, LC20IP, LC21IP, LC22IP, LC23IP,
448    LC24IP, LC25IP, LC26IP, LC27IP, LC28IP, LC29IP, LC30IP, LC31IP,
449    LC32IP, LC33IP, LC34IP, LPRASEIP, LC36IP, LC37IP, LC38IP, LC39IP,
450    LC40IP, LC41IP, LC42IP, HPRASEIP, LC44IP, LC45IP, LC46IP, LC47IP,
451    LC48IP, LC49IP, LC50IP, LC51IP, LC52IP, LC53IP, LC54IP, LC55IP,
452    LC56IP, LC57IP, LC58IP, LC59IP, LC60IP, LC61IP, LC62IP, LC63IP,
453  )
454}
455
456class IeValidBundle extends Bundle with IgnoreSeqInBundle {
457  val SSIE     = ValidIO(RO( 1))
458  val VSSIE    = ValidIO(RO( 2))
459  val MSIE     = ValidIO(RO( 3))
460  val STIE     = ValidIO(RO( 5))
461  val VSTIE    = ValidIO(RO( 6))
462  val MTIE     = ValidIO(RO( 7))
463  val SEIE     = ValidIO(RO( 9))
464  val VSEIE    = ValidIO(RO(10))
465  val MEIE     = ValidIO(RO(11))
466  val SGEIE    = ValidIO(RO(12))
467
468  val LCOFIE   = ValidIO(RO(13)) // Counter overflow interrupt
469  val LC14IE   = ValidIO(RO(14))
470  val LC15IE   = ValidIO(RO(15))
471  val LC16IE   = ValidIO(RO(16))
472  val LC17IE   = ValidIO(RO(17))
473  val LC18IE   = ValidIO(RO(18))
474  val LC19IE   = ValidIO(RO(19))
475  val LC20IE   = ValidIO(RO(20))
476  val LC21IE   = ValidIO(RO(21))
477  val LC22IE   = ValidIO(RO(22))
478  val LC23IE   = ValidIO(RO(23))
479  val LC24IE   = ValidIO(RO(24))
480  val LC25IE   = ValidIO(RO(25))
481  val LC26IE   = ValidIO(RO(26))
482  val LC27IE   = ValidIO(RO(27))
483  val LC28IE   = ValidIO(RO(28))
484  val LC29IE   = ValidIO(RO(29))
485  val LC30IE   = ValidIO(RO(30))
486  val LC31IE   = ValidIO(RO(31))
487  val LC32IE   = ValidIO(RO(32))
488  val LC33IE   = ValidIO(RO(33))
489  val LC34IE   = ValidIO(RO(34))
490  val LPRASEIE = ValidIO(RO(35)) // Low-priority RAS event interrupt
491  val LC36IE   = ValidIO(RO(36))
492  val LC37IE   = ValidIO(RO(37))
493  val LC38IE   = ValidIO(RO(38))
494  val LC39IE   = ValidIO(RO(39))
495  val LC40IE   = ValidIO(RO(40))
496  val LC41IE   = ValidIO(RO(41))
497  val LC42IE   = ValidIO(RO(42))
498  val HPRASEIE = ValidIO(RO(43)) // High-priority RAS event interrupt
499  val LC44IE   = ValidIO(RO(44))
500  val LC45IE   = ValidIO(RO(45))
501  val LC46IE   = ValidIO(RO(46))
502  val LC47IE   = ValidIO(RO(47))
503  val LC48IE   = ValidIO(RO(48))
504  val LC49IE   = ValidIO(RO(49))
505  val LC50IE   = ValidIO(RO(50))
506  val LC51IE   = ValidIO(RO(51))
507  val LC52IE   = ValidIO(RO(52))
508  val LC53IE   = ValidIO(RO(53))
509  val LC54IE   = ValidIO(RO(54))
510  val LC55IE   = ValidIO(RO(55))
511  val LC56IE   = ValidIO(RO(56))
512  val LC57IE   = ValidIO(RO(57))
513  val LC58IE   = ValidIO(RO(58))
514  val LC59IE   = ValidIO(RO(59))
515  val LC60IE   = ValidIO(RO(60))
516  val LC61IE   = ValidIO(RO(61))
517  val LC62IE   = ValidIO(RO(62))
518  val LC63IE   = ValidIO(RO(63))
519
520  val getVS = Seq(VSSIE, VSTIE, VSEIE)
521
522  def getHS = Seq(SSIE, STIE, SEIE)
523
524  def getM = Seq(MSIE, MTIE, MEIE)
525
526  def getNonLocal = Seq(
527    SSIE, VSSIE, MSIE,
528    STIE, VSTIE, MTIE,
529    SEIE, VSEIE, MEIE,
530    SGEIE
531  )
532
533  def getLocal = Seq(
534    LCOFIE, LC14IE, LC15IE,
535    LC16IE, LC17IE, LC18IE, LC19IE, LC20IE, LC21IE, LC22IE, LC23IE,
536    LC24IE, LC25IE, LC26IE, LC27IE, LC28IE, LC29IE, LC30IE, LC31IE,
537    LC32IE, LC33IE, LC34IE, LPRASEIE, LC36IE, LC37IE, LC38IE, LC39IE,
538    LC40IE, LC41IE, LC42IE, HPRASEIE, LC44IE, LC45IE, LC46IE, LC47IE,
539    LC48IE, LC49IE, LC50IE, LC51IE, LC52IE, LC53IE, LC54IE, LC55IE,
540    LC56IE, LC57IE, LC58IE, LC59IE, LC60IE, LC61IE, LC62IE, LC63IE,
541  )
542
543  def getAll = getNonLocal ++ getLocal
544
545  def getRW = getAll.filter(_.bits.isRW)
546
547  def getNonRW = getAll.filterNot(_.bits.isRW)
548
549  def getByNum(num: Int) = getAll.find(_.bits.lsb == num).get
550
551  def connectZeroNonRW : this.type = {
552    this.getNonRW.foreach(_.specifyField(
553      _.valid := false.B,
554      _.bits  := DontCare
555    ))
556    this
557  }
558}
559
560class IpValidBundle extends Bundle with IgnoreSeqInBundle {
561  val SSIP     = ValidIO(RO( 1))
562  val VSSIP    = ValidIO(RO( 2))
563  val MSIP     = ValidIO(RO( 3))
564  val STIP     = ValidIO(RO( 5))
565  val VSTIP    = ValidIO(RO( 6))
566  val MTIP     = ValidIO(RO( 7))
567  val SEIP     = ValidIO(RO( 9))
568  val VSEIP    = ValidIO(RO(10))
569  val MEIP     = ValidIO(RO(11))
570  val SGEIP    = ValidIO(RO(12))
571
572  val LCOFIP   = ValidIO(RO(13)) // Counter overflow interrupt
573  val LC14IP   = ValidIO(RO(14))
574  val LC15IP   = ValidIO(RO(15))
575  val LC16IP   = ValidIO(RO(16))
576  val LC17IP   = ValidIO(RO(17))
577  val LC18IP   = ValidIO(RO(18))
578  val LC19IP   = ValidIO(RO(19))
579  val LC20IP   = ValidIO(RO(20))
580  val LC21IP   = ValidIO(RO(21))
581  val LC22IP   = ValidIO(RO(22))
582  val LC23IP   = ValidIO(RO(23))
583  val LC24IP   = ValidIO(RO(24))
584  val LC25IP   = ValidIO(RO(25))
585  val LC26IP   = ValidIO(RO(26))
586  val LC27IP   = ValidIO(RO(27))
587  val LC28IP   = ValidIO(RO(28))
588  val LC29IP   = ValidIO(RO(29))
589  val LC30IP   = ValidIO(RO(30))
590  val LC31IP   = ValidIO(RO(31))
591  val LC32IP   = ValidIO(RO(32))
592  val LC33IP   = ValidIO(RO(33))
593  val LC34IP   = ValidIO(RO(34))
594  val LPRASEIP = ValidIO(RO(35)) // Low-priority RAS event interrupt
595  val LC36IP   = ValidIO(RO(36))
596  val LC37IP   = ValidIO(RO(37))
597  val LC38IP   = ValidIO(RO(38))
598  val LC39IP   = ValidIO(RO(39))
599  val LC40IP   = ValidIO(RO(40))
600  val LC41IP   = ValidIO(RO(41))
601  val LC42IP   = ValidIO(RO(42))
602  val HPRASEIP = ValidIO(RO(43)) // High-priority RAS event interrupt
603  val LC44IP   = ValidIO(RO(44))
604  val LC45IP   = ValidIO(RO(45))
605  val LC46IP   = ValidIO(RO(46))
606  val LC47IP   = ValidIO(RO(47))
607  val LC48IP   = ValidIO(RO(48))
608  val LC49IP   = ValidIO(RO(49))
609  val LC50IP   = ValidIO(RO(50))
610  val LC51IP   = ValidIO(RO(51))
611  val LC52IP   = ValidIO(RO(52))
612  val LC53IP   = ValidIO(RO(53))
613  val LC54IP   = ValidIO(RO(54))
614  val LC55IP   = ValidIO(RO(55))
615  val LC56IP   = ValidIO(RO(56))
616  val LC57IP   = ValidIO(RO(57))
617  val LC58IP   = ValidIO(RO(58))
618  val LC59IP   = ValidIO(RO(59))
619  val LC60IP   = ValidIO(RO(60))
620  val LC61IP   = ValidIO(RO(61))
621  val LC62IP   = ValidIO(RO(62))
622  val LC63IP   = ValidIO(RO(63))
623
624  val getVS = Seq(VSSIP, VSTIP, VSEIP)
625
626  def getHS = Seq(SSIP, STIP, SEIP)
627
628  def getM = Seq(MSIP, MTIP, MEIP)
629
630  def getNonLocal = Seq(
631    SSIP, VSSIP, MSIP,
632    STIP, VSTIP, MTIP,
633    SEIP, VSEIP, MEIP,
634    SGEIP
635  )
636
637  def getLocal = Seq(
638    LCOFIP, LC14IP, LC15IP,
639    LC16IP, LC17IP, LC18IP, LC19IP, LC20IP, LC21IP, LC22IP, LC23IP,
640    LC24IP, LC25IP, LC26IP, LC27IP, LC28IP, LC29IP, LC30IP, LC31IP,
641    LC32IP, LC33IP, LC34IP, LPRASEIP, LC36IP, LC37IP, LC38IP, LC39IP,
642    LC40IP, LC41IP, LC42IP, HPRASEIP, LC44IP, LC45IP, LC46IP, LC47IP,
643    LC48IP, LC49IP, LC50IP, LC51IP, LC52IP, LC53IP, LC54IP, LC55IP,
644    LC56IP, LC57IP, LC58IP, LC59IP, LC60IP, LC61IP, LC62IP, LC63IP,
645  )
646
647  def getAll = getNonLocal ++ getLocal
648
649  def getRW = getAll.filter(_.bits.isRW)
650
651  def getNonRW = getAll.filterNot(_.bits.isRW)
652
653  def getByNum(num: Int) = getAll.find(_.bits.lsb == num).get
654
655  def connectZeroNonRW : this.type = {
656    this.getNonRW.foreach(_.specifyField(
657      _.valid := false.B,
658      _.bits  := DontCare,
659    ))
660    this
661  }
662}
663