xref: /XiangShan/src/main/scala/device/AXI4IntrGenerator.scala (revision b6a21a24effdf0453ab76aeb322110e6d9f20d36)
1*b6a21a24SYinan Xupackage device
2*b6a21a24SYinan Xu
3*b6a21a24SYinan Xuimport chisel3._
4*b6a21a24SYinan Xuimport chisel3.util._
5*b6a21a24SYinan Xuimport chipsalliance.rocketchip.config.Parameters
6*b6a21a24SYinan Xuimport freechips.rocketchip.diplomacy.AddressSet
7*b6a21a24SYinan Xuimport utils._
8*b6a21a24SYinan Xu
9*b6a21a24SYinan Xu// we support 256 interrupt bits by default
10*b6a21a24SYinan Xuclass IntrGenIO extends Bundle {
11*b6a21a24SYinan Xu  val intrVec = Output(UInt(256.W))
12*b6a21a24SYinan Xu}
13*b6a21a24SYinan Xu
14*b6a21a24SYinan Xuclass AXI4IntrGenerator
15*b6a21a24SYinan Xu(
16*b6a21a24SYinan Xu  address: Seq[AddressSet]
17*b6a21a24SYinan Xu)(implicit p: Parameters)
18*b6a21a24SYinan Xu  extends AXI4SlaveModule(address, executable = false, _extra = new IntrGenIO)
19*b6a21a24SYinan Xu{
20*b6a21a24SYinan Xu
21*b6a21a24SYinan Xu  override lazy val module = new AXI4SlaveModuleImp(this){
22*b6a21a24SYinan Xu
23*b6a21a24SYinan Xu    val intrReg = RegInit(VecInit(Seq.fill(8)(0.U(32.W))))
24*b6a21a24SYinan Xu    io.extra.get.intrVec := Cat(intrReg.reverse)
25*b6a21a24SYinan Xu
26*b6a21a24SYinan Xu    when (in.w.fire()) {
27*b6a21a24SYinan Xu      intrReg(waddr(4, 2)) := in.w.bits.data(31, 0)
28*b6a21a24SYinan Xu    }
29*b6a21a24SYinan Xu
30*b6a21a24SYinan Xu    in.r.bits.data := intrReg(raddr)
31*b6a21a24SYinan Xu  }
32*b6a21a24SYinan Xu}
33