xref: /XiangShan/src/main/scala/utils/AXI4Lite.scala (revision 03df898aac434d7e1caa346314a13c44961e7489)
1720dd621STang Haojin/***************************************************************************************
2720dd621STang Haojin* Copyright (c) 2024 Beijing Institute of Open Source Chip (BOSC)
3720dd621STang Haojin* Copyright (c) 2024 Institute of Computing Technology, Chinese Academy of Sciences
4720dd621STang Haojin*
5720dd621STang Haojin* XiangShan is licensed under Mulan PSL v2.
6720dd621STang Haojin* You can use this software according to the terms and conditions of the Mulan PSL v2.
7720dd621STang Haojin* You may obtain a copy of Mulan PSL v2 at:
8720dd621STang Haojin*          http://license.coscl.org.cn/MulanPSL2
9720dd621STang Haojin*
10720dd621STang Haojin* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
11720dd621STang Haojin* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
12720dd621STang Haojin* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
13720dd621STang Haojin*
14720dd621STang Haojin* See the Mulan PSL v2 for more details.
15720dd621STang Haojin***************************************************************************************/
16720dd621STang Haojin
17720dd621STang Haojinpackage utils
18720dd621STang Haojin
19720dd621STang Haojinimport chisel3._
20720dd621STang Haojinimport chisel3.util._
21720dd621STang Haojinimport freechips.rocketchip.amba.axi4.AXI4Bundle
22720dd621STang Haojin
23720dd621STang Haojinclass AXI4LiteBundleA(addrWidth: Int, idWidth: Int = 0) extends Bundle {
24720dd621STang Haojin  val id = UInt(idWidth.W)
25720dd621STang Haojin  val addr = UInt(addrWidth.W)
26720dd621STang Haojin}
27720dd621STang Haojin
28720dd621STang Haojinclass AXI4LiteBundleAR(addrWidth: Int, idWidth: Int = 0) extends AXI4LiteBundleA(addrWidth, idWidth)
29720dd621STang Haojin
30720dd621STang Haojinclass AXI4LiteBundleAW(addrWidth: Int, idWidth: Int = 0) extends AXI4LiteBundleA(addrWidth, idWidth)
31720dd621STang Haojin
32720dd621STang Haojinclass AXI4LiteBundleW(dataWidth: Int) extends Bundle {
33720dd621STang Haojin  val data = UInt(dataWidth.W)
34720dd621STang Haojin}
35720dd621STang Haojin
36720dd621STang Haojinclass AXI4LiteBundleR(dataWidth: Int, idWidth: Int = 0) extends Bundle {
37720dd621STang Haojin  val id = UInt(idWidth.W)
38720dd621STang Haojin  val data = UInt(dataWidth.W)
39720dd621STang Haojin  val resp = UInt(2.W)
40720dd621STang Haojin}
41720dd621STang Haojin
42720dd621STang Haojinclass AXI4LiteBundleB(idWidth: Int = 0) extends Bundle {
43720dd621STang Haojin  val id = UInt(idWidth.W)
44720dd621STang Haojin  val resp = UInt(2.W)
45720dd621STang Haojin}
46720dd621STang Haojin
47720dd621STang Haojinclass AXI4LiteBundle(val addrWidth: Int, val dataWidth: Int, val idWidth: Int = 0) extends Bundle {
48720dd621STang Haojin  val aw = Irrevocable(new AXI4LiteBundleAW(addrWidth, idWidth))
49720dd621STang Haojin  val w  = Irrevocable(new AXI4LiteBundleW(dataWidth))
50720dd621STang Haojin  val b  = Flipped(Irrevocable(new AXI4LiteBundleB(idWidth)))
51720dd621STang Haojin  val ar = Irrevocable(new AXI4LiteBundleAR(addrWidth, idWidth))
52720dd621STang Haojin  val r  = Flipped(Irrevocable(new AXI4LiteBundleR(dataWidth, idWidth)))
53720dd621STang Haojin
54720dd621STang Haojin  private def connectExisting(left: Bundle, right: Bundle): Unit = {
55720dd621STang Haojin    for ((name, data) <- left.elements)
56720dd621STang Haojin      if (right.elements.contains(name))
57720dd621STang Haojin        data := right.elements(name)
58720dd621STang Haojin      else
59720dd621STang Haojin        data := (name match {
60*03df898aSzhangyuxin          case "size" => log2Ceil(dataWidth/8).U
61*03df898aSzhangyuxin          case "strb" => ((1L<<(dataWidth/8)) - 1).U
62720dd621STang Haojin          case "last" => true.B.asTypeOf(data)
63720dd621STang Haojin          case _: String => 0.U.asTypeOf(data)
64720dd621STang Haojin        })
65720dd621STang Haojin  }
66720dd621STang Haojin
67720dd621STang Haojin  def connectToAXI4(axi4: AXI4Bundle): Unit = {
68720dd621STang Haojin    axi4.aw.valid := aw.valid
69720dd621STang Haojin    aw.ready := axi4.aw.ready
70720dd621STang Haojin    connectExisting(axi4.aw.bits, aw.bits)
71720dd621STang Haojin
72720dd621STang Haojin    axi4.w.valid := w.valid
73720dd621STang Haojin    w.ready := axi4.w.ready
74720dd621STang Haojin    connectExisting(axi4.w.bits, w.bits)
75720dd621STang Haojin
76720dd621STang Haojin    axi4.ar.valid := ar.valid
77720dd621STang Haojin    ar.ready := axi4.ar.ready
78720dd621STang Haojin    connectExisting(axi4.ar.bits, ar.bits)
79720dd621STang Haojin
80720dd621STang Haojin    b.valid := axi4.b.valid
81720dd621STang Haojin    axi4.b.ready := b.ready
82720dd621STang Haojin    connectExisting(b.bits, axi4.b.bits)
83720dd621STang Haojin
84720dd621STang Haojin    r.valid := axi4.r.valid
85720dd621STang Haojin    axi4.r.ready := r.ready
86720dd621STang Haojin    connectExisting(r.bits, axi4.r.bits)
87720dd621STang Haojin  }
88720dd621STang Haojin
89720dd621STang Haojin  def connectFromAXI4(axi4: AXI4Bundle): Unit = {
90720dd621STang Haojin    aw.valid := axi4.aw.valid
91720dd621STang Haojin    axi4.aw.ready := aw.ready
92720dd621STang Haojin    connectExisting(aw.bits, axi4.aw.bits)
93720dd621STang Haojin
94720dd621STang Haojin    w.valid := axi4.w.valid
95720dd621STang Haojin    axi4.w.ready := w.ready
96720dd621STang Haojin    connectExisting(w.bits, axi4.w.bits)
97720dd621STang Haojin
98720dd621STang Haojin    ar.valid := axi4.ar.valid
99720dd621STang Haojin    axi4.ar.ready := ar.ready
100720dd621STang Haojin    connectExisting(ar.bits, axi4.ar.bits)
101720dd621STang Haojin
102720dd621STang Haojin    axi4.b.valid := b.valid
103720dd621STang Haojin    b.ready := axi4.b.ready
104720dd621STang Haojin    connectExisting(axi4.b.bits, b.bits)
105720dd621STang Haojin
106720dd621STang Haojin    axi4.r.valid := r.valid
107720dd621STang Haojin    r.ready := axi4.r.ready
108720dd621STang Haojin    connectExisting(axi4.r.bits, r.bits)
109720dd621STang Haojin  }
110720dd621STang Haojin}
111