xref: /XiangShan/src/main/scala/xiangshan/backend/fu/NewCSR/InterruptBundle.scala (revision a2cf57616ebde35fcac4de9c2ad02bb85cb3a47d)
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
291class NonMaskableIRPendingBundle extends CSRBundle {
292  val NMI_31 = RW(31).withReset(0.U)
293  val NMI_43 = RW(43).withReset(0.U)
294  // reserve for more NMI type
295}
296object NonMaskableIRNO{
297  final val NMI_43 = 43
298  final val NMI_31 = 31
299  // reserve for more NMI type
300
301  val interruptDefaultPrio = Seq(
302    NMI_43, NMI_31
303  )
304  def getIRQHigherThan(irq: Int): Seq[Int] = {
305    val idx = this.interruptDefaultPrio.indexOf(irq, 0)
306    require(idx != -1, s"The irq($irq) does not exists in IntPriority Seq")
307    this.interruptDefaultPrio.slice(0, idx)
308  }
309
310}
311
312object InterruptNO {
313  // Software Interrupt
314  final val SSI  = 1
315  final val VSSI = 2
316  final val MSI  = 3
317  // Time Interrupt
318  final val STI  = 5
319  final val VSTI = 6
320  final val MTI  = 7
321  // External Interrupt
322  final val SEI  = 9
323  final val VSEI = 10
324  final val MEI  = 11
325  final val SGEI = 12
326  // SoC
327  final val COI = 13
328  final val LPRASEI = 35
329  final val HPRASEI = 43
330
331  val privArchGroup = Seq(
332    MEI, MSI, MTI,
333    SEI, SSI, STI,
334    SGEI,
335    VSEI, VSSI, VSTI,
336    COI, 14, 15,
337  )
338
339  val localHighGroup = Seq(
340    47, 23, 46,
341    45, 22, 44,
342    HPRASEI, 21, 42,
343    41, 20, 40,
344  )
345
346  val localLowGroup = Seq(
347    39, 19, 38,
348    37, 18, 36,
349    LPRASEI, 17, 34,
350    33, 16, 32,
351  )
352
353  val customHighestGroup = Seq(
354    63, 31, 62,
355    61, 30, 60,
356  )
357
358  val customMiddleHighGroup = Seq(
359    59, 29, 58,
360    57, 28, 56,
361  )
362
363  val customMiddleLowGroup = Seq(
364    55, 27, 54,
365    53, 26, 52,
366  )
367
368  val customLowestGroup = Seq(
369    51, 25, 50,
370    49, 24, 48,
371  )
372
373  val interruptDefaultPrio = customHighestGroup ++
374                            localHighGroup ++
375                            customMiddleHighGroup ++
376                            privArchGroup ++
377                            customMiddleLowGroup ++
378                            localLowGroup ++
379                            customLowestGroup
380
381  def getPrioIdxInGroup(group: this.type => Seq[Int])(f: this.type => Int): Int = {
382    val idx = group(this).indexOf(f(this))
383    assert(idx != -1)
384    idx
385  }
386
387  def getVS = Seq(VSSI, VSTI, VSEI)
388
389  def getHS = Seq(SSI, STI, SEI)
390
391  def getM = Seq(MSI, MTI, MEI)
392
393  def getNonLocal = Seq(
394    SSI, VSSI, MSI,
395    STI, VSTI, MTI,
396    SEI, VSEI, MEI,
397    SGEI
398  )
399
400  def getLocal = localHighGroup ++ localLowGroup ++
401                 customHighestGroup ++ customMiddleHighGroup ++
402                 customMiddleLowGroup ++ customLowestGroup ++ Seq(COI)
403}
404
405trait HasIpIeBundle { self: CSRModule[_] =>
406  val mideleg = IO(Input(new MidelegBundle))
407  val mip     = IO(Input(new MipBundle))
408  val mie     = IO(Input(new MieBundle))
409  val mvip    = IO(Input(new MvipBundle))
410  val mvien   = IO(Input(new MvienBundle))
411  val hideleg = IO(Input(new HidelegBundle))
412  val hip     = IO(Input(new HipBundle))
413  val hie     = IO(Input(new HieBundle))
414  val hvien   = IO(Input(new HvienBundle))
415  val hvip    = IO(Input(new HvipBundle))
416  val sip     = IO(Input(new SipBundle))
417  val sie     = IO(Input(new SieBundle))
418  val vsip    = IO(Input(new VSipBundle))
419  val vsie    = IO(Input(new VSieBundle))
420  val hgeip   = IO(Input(new HgeipBundle))
421  val hgeie   = IO(Input(new HgeieBundle))
422  val hstatusVGEIN = IO(Input(HstatusVgeinField()))
423}
424
425trait ToAliasIpLocalPart extends Bundle {
426  val LCOFIP   = ValidIO(RO(13)) // Counter overflow interrupt
427  val LC14IP   = ValidIO(RO(14))
428  val LC15IP   = ValidIO(RO(15))
429  val LC16IP   = ValidIO(RO(16))
430  val LC17IP   = ValidIO(RO(17))
431  val LC18IP   = ValidIO(RO(18))
432  val LC19IP   = ValidIO(RO(19))
433  val LC20IP   = ValidIO(RO(20))
434  val LC21IP   = ValidIO(RO(21))
435  val LC22IP   = ValidIO(RO(22))
436  val LC23IP   = ValidIO(RO(23))
437  val LC24IP   = ValidIO(RO(24))
438  val LC25IP   = ValidIO(RO(25))
439  val LC26IP   = ValidIO(RO(26))
440  val LC27IP   = ValidIO(RO(27))
441  val LC28IP   = ValidIO(RO(28))
442  val LC29IP   = ValidIO(RO(29))
443  val LC30IP   = ValidIO(RO(30))
444  val LC31IP   = ValidIO(RO(31))
445  val LC32IP   = ValidIO(RO(32))
446  val LC33IP   = ValidIO(RO(33))
447  val LC34IP   = ValidIO(RO(34))
448  val LPRASEIP = ValidIO(RO(35)) // Low-priority RAS event interrupt
449  val LC36IP   = ValidIO(RO(36))
450  val LC37IP   = ValidIO(RO(37))
451  val LC38IP   = ValidIO(RO(38))
452  val LC39IP   = ValidIO(RO(39))
453  val LC40IP   = ValidIO(RO(40))
454  val LC41IP   = ValidIO(RO(41))
455  val LC42IP   = ValidIO(RO(42))
456  val HPRASEIP = ValidIO(RO(43)) // High-priority RAS event interrupt
457  val LC44IP   = ValidIO(RO(44))
458  val LC45IP   = ValidIO(RO(45))
459  val LC46IP   = ValidIO(RO(46))
460  val LC47IP   = ValidIO(RO(47))
461  val LC48IP   = ValidIO(RO(48))
462  val LC49IP   = ValidIO(RO(49))
463  val LC50IP   = ValidIO(RO(50))
464  val LC51IP   = ValidIO(RO(51))
465  val LC52IP   = ValidIO(RO(52))
466  val LC53IP   = ValidIO(RO(53))
467  val LC54IP   = ValidIO(RO(54))
468  val LC55IP   = ValidIO(RO(55))
469  val LC56IP   = ValidIO(RO(56))
470  val LC57IP   = ValidIO(RO(57))
471  val LC58IP   = ValidIO(RO(58))
472  val LC59IP   = ValidIO(RO(59))
473  val LC60IP   = ValidIO(RO(60))
474  val LC61IP   = ValidIO(RO(61))
475  val LC62IP   = ValidIO(RO(62))
476  val LC63IP   = ValidIO(RO(63))
477
478  def getLocal = Seq(
479    LCOFIP, LC14IP, LC15IP,
480    LC16IP, LC17IP, LC18IP, LC19IP, LC20IP, LC21IP, LC22IP, LC23IP,
481    LC24IP, LC25IP, LC26IP, LC27IP, LC28IP, LC29IP, LC30IP, LC31IP,
482    LC32IP, LC33IP, LC34IP, LPRASEIP, LC36IP, LC37IP, LC38IP, LC39IP,
483    LC40IP, LC41IP, LC42IP, HPRASEIP, LC44IP, LC45IP, LC46IP, LC47IP,
484    LC48IP, LC49IP, LC50IP, LC51IP, LC52IP, LC53IP, LC54IP, LC55IP,
485    LC56IP, LC57IP, LC58IP, LC59IP, LC60IP, LC61IP, LC62IP, LC63IP,
486  )
487}
488
489class IeValidBundle extends Bundle with IgnoreSeqInBundle {
490  val SSIE     = ValidIO(RO( 1))
491  val VSSIE    = ValidIO(RO( 2))
492  val MSIE     = ValidIO(RO( 3))
493  val STIE     = ValidIO(RO( 5))
494  val VSTIE    = ValidIO(RO( 6))
495  val MTIE     = ValidIO(RO( 7))
496  val SEIE     = ValidIO(RO( 9))
497  val VSEIE    = ValidIO(RO(10))
498  val MEIE     = ValidIO(RO(11))
499  val SGEIE    = ValidIO(RO(12))
500
501  val LCOFIE   = ValidIO(RO(13)) // Counter overflow interrupt
502  val LC14IE   = ValidIO(RO(14))
503  val LC15IE   = ValidIO(RO(15))
504  val LC16IE   = ValidIO(RO(16))
505  val LC17IE   = ValidIO(RO(17))
506  val LC18IE   = ValidIO(RO(18))
507  val LC19IE   = ValidIO(RO(19))
508  val LC20IE   = ValidIO(RO(20))
509  val LC21IE   = ValidIO(RO(21))
510  val LC22IE   = ValidIO(RO(22))
511  val LC23IE   = ValidIO(RO(23))
512  val LC24IE   = ValidIO(RO(24))
513  val LC25IE   = ValidIO(RO(25))
514  val LC26IE   = ValidIO(RO(26))
515  val LC27IE   = ValidIO(RO(27))
516  val LC28IE   = ValidIO(RO(28))
517  val LC29IE   = ValidIO(RO(29))
518  val LC30IE   = ValidIO(RO(30))
519  val LC31IE   = ValidIO(RO(31))
520  val LC32IE   = ValidIO(RO(32))
521  val LC33IE   = ValidIO(RO(33))
522  val LC34IE   = ValidIO(RO(34))
523  val LPRASEIE = ValidIO(RO(35)) // Low-priority RAS event interrupt
524  val LC36IE   = ValidIO(RO(36))
525  val LC37IE   = ValidIO(RO(37))
526  val LC38IE   = ValidIO(RO(38))
527  val LC39IE   = ValidIO(RO(39))
528  val LC40IE   = ValidIO(RO(40))
529  val LC41IE   = ValidIO(RO(41))
530  val LC42IE   = ValidIO(RO(42))
531  val HPRASEIE = ValidIO(RO(43)) // High-priority RAS event interrupt
532  val LC44IE   = ValidIO(RO(44))
533  val LC45IE   = ValidIO(RO(45))
534  val LC46IE   = ValidIO(RO(46))
535  val LC47IE   = ValidIO(RO(47))
536  val LC48IE   = ValidIO(RO(48))
537  val LC49IE   = ValidIO(RO(49))
538  val LC50IE   = ValidIO(RO(50))
539  val LC51IE   = ValidIO(RO(51))
540  val LC52IE   = ValidIO(RO(52))
541  val LC53IE   = ValidIO(RO(53))
542  val LC54IE   = ValidIO(RO(54))
543  val LC55IE   = ValidIO(RO(55))
544  val LC56IE   = ValidIO(RO(56))
545  val LC57IE   = ValidIO(RO(57))
546  val LC58IE   = ValidIO(RO(58))
547  val LC59IE   = ValidIO(RO(59))
548  val LC60IE   = ValidIO(RO(60))
549  val LC61IE   = ValidIO(RO(61))
550  val LC62IE   = ValidIO(RO(62))
551  val LC63IE   = ValidIO(RO(63))
552
553  val getVS = Seq(VSSIE, VSTIE, VSEIE)
554
555  def getHS = Seq(SSIE, STIE, SEIE)
556
557  def getM = Seq(MSIE, MTIE, MEIE)
558
559  def getNonLocal = Seq(
560    SSIE, VSSIE, MSIE,
561    STIE, VSTIE, MTIE,
562    SEIE, VSEIE, MEIE,
563    SGEIE
564  )
565
566  def getLocal = Seq(
567    LCOFIE, LC14IE, LC15IE,
568    LC16IE, LC17IE, LC18IE, LC19IE, LC20IE, LC21IE, LC22IE, LC23IE,
569    LC24IE, LC25IE, LC26IE, LC27IE, LC28IE, LC29IE, LC30IE, LC31IE,
570    LC32IE, LC33IE, LC34IE, LPRASEIE, LC36IE, LC37IE, LC38IE, LC39IE,
571    LC40IE, LC41IE, LC42IE, HPRASEIE, LC44IE, LC45IE, LC46IE, LC47IE,
572    LC48IE, LC49IE, LC50IE, LC51IE, LC52IE, LC53IE, LC54IE, LC55IE,
573    LC56IE, LC57IE, LC58IE, LC59IE, LC60IE, LC61IE, LC62IE, LC63IE,
574  )
575
576  def getAll = getNonLocal ++ getLocal
577
578  def getRW = getAll.filter(_.bits.isRW)
579
580  def getNonRW = getAll.filterNot(_.bits.isRW)
581
582  def getByNum(num: Int) = getAll.find(_.bits.lsb == num).get
583
584  def connectZeroNonRW : this.type = {
585    this.getNonRW.foreach(_.specifyField(
586      _.valid := false.B,
587      _.bits  := DontCare
588    ))
589    this
590  }
591}
592
593class IpValidBundle extends Bundle with IgnoreSeqInBundle {
594  val SSIP     = ValidIO(RO( 1))
595  val VSSIP    = ValidIO(RO( 2))
596  val MSIP     = ValidIO(RO( 3))
597  val STIP     = ValidIO(RO( 5))
598  val VSTIP    = ValidIO(RO( 6))
599  val MTIP     = ValidIO(RO( 7))
600  val SEIP     = ValidIO(RO( 9))
601  val VSEIP    = ValidIO(RO(10))
602  val MEIP     = ValidIO(RO(11))
603  val SGEIP    = ValidIO(RO(12))
604
605  val LCOFIP   = ValidIO(RO(13)) // Counter overflow interrupt
606  val LC14IP   = ValidIO(RO(14))
607  val LC15IP   = ValidIO(RO(15))
608  val LC16IP   = ValidIO(RO(16))
609  val LC17IP   = ValidIO(RO(17))
610  val LC18IP   = ValidIO(RO(18))
611  val LC19IP   = ValidIO(RO(19))
612  val LC20IP   = ValidIO(RO(20))
613  val LC21IP   = ValidIO(RO(21))
614  val LC22IP   = ValidIO(RO(22))
615  val LC23IP   = ValidIO(RO(23))
616  val LC24IP   = ValidIO(RO(24))
617  val LC25IP   = ValidIO(RO(25))
618  val LC26IP   = ValidIO(RO(26))
619  val LC27IP   = ValidIO(RO(27))
620  val LC28IP   = ValidIO(RO(28))
621  val LC29IP   = ValidIO(RO(29))
622  val LC30IP   = ValidIO(RO(30))
623  val LC31IP   = ValidIO(RO(31))
624  val LC32IP   = ValidIO(RO(32))
625  val LC33IP   = ValidIO(RO(33))
626  val LC34IP   = ValidIO(RO(34))
627  val LPRASEIP = ValidIO(RO(35)) // Low-priority RAS event interrupt
628  val LC36IP   = ValidIO(RO(36))
629  val LC37IP   = ValidIO(RO(37))
630  val LC38IP   = ValidIO(RO(38))
631  val LC39IP   = ValidIO(RO(39))
632  val LC40IP   = ValidIO(RO(40))
633  val LC41IP   = ValidIO(RO(41))
634  val LC42IP   = ValidIO(RO(42))
635  val HPRASEIP = ValidIO(RO(43)) // High-priority RAS event interrupt
636  val LC44IP   = ValidIO(RO(44))
637  val LC45IP   = ValidIO(RO(45))
638  val LC46IP   = ValidIO(RO(46))
639  val LC47IP   = ValidIO(RO(47))
640  val LC48IP   = ValidIO(RO(48))
641  val LC49IP   = ValidIO(RO(49))
642  val LC50IP   = ValidIO(RO(50))
643  val LC51IP   = ValidIO(RO(51))
644  val LC52IP   = ValidIO(RO(52))
645  val LC53IP   = ValidIO(RO(53))
646  val LC54IP   = ValidIO(RO(54))
647  val LC55IP   = ValidIO(RO(55))
648  val LC56IP   = ValidIO(RO(56))
649  val LC57IP   = ValidIO(RO(57))
650  val LC58IP   = ValidIO(RO(58))
651  val LC59IP   = ValidIO(RO(59))
652  val LC60IP   = ValidIO(RO(60))
653  val LC61IP   = ValidIO(RO(61))
654  val LC62IP   = ValidIO(RO(62))
655  val LC63IP   = ValidIO(RO(63))
656
657  val getVS = Seq(VSSIP, VSTIP, VSEIP)
658
659  def getHS = Seq(SSIP, STIP, SEIP)
660
661  def getM = Seq(MSIP, MTIP, MEIP)
662
663  def getNonLocal = Seq(
664    SSIP, VSSIP, MSIP,
665    STIP, VSTIP, MTIP,
666    SEIP, VSEIP, MEIP,
667    SGEIP
668  )
669
670  def getLocal = Seq(
671    LCOFIP, LC14IP, LC15IP,
672    LC16IP, LC17IP, LC18IP, LC19IP, LC20IP, LC21IP, LC22IP, LC23IP,
673    LC24IP, LC25IP, LC26IP, LC27IP, LC28IP, LC29IP, LC30IP, LC31IP,
674    LC32IP, LC33IP, LC34IP, LPRASEIP, LC36IP, LC37IP, LC38IP, LC39IP,
675    LC40IP, LC41IP, LC42IP, HPRASEIP, LC44IP, LC45IP, LC46IP, LC47IP,
676    LC48IP, LC49IP, LC50IP, LC51IP, LC52IP, LC53IP, LC54IP, LC55IP,
677    LC56IP, LC57IP, LC58IP, LC59IP, LC60IP, LC61IP, LC62IP, LC63IP,
678  )
679
680  def getAll = getNonLocal ++ getLocal
681
682  def getRW = getAll.filter(_.bits.isRW)
683
684  def getNonRW = getAll.filterNot(_.bits.isRW)
685
686  def getByNum(num: Int) = getAll.find(_.bits.lsb == num).get
687
688  def connectZeroNonRW : this.type = {
689    this.getNonRW.foreach(_.specifyField(
690      _.valid := false.B,
691      _.bits  := DontCare,
692    ))
693    this
694  }
695}
696