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