1// See LICENSE.SiFive for license details. 2 3package device 4 5import chisel3._ 6import chisel3.util._ 7import chisel3.util.experimental.loadMemoryFromFile 8 9import bus.axi4._ 10import utils._ 11 12class AXI4RAM[T <: AXI4Lite](_type: T = new AXI4, 13 memByte: Int, beatBytes: Int = 4, dataFile: String = "") extends AXI4SlaveModule(_type) { 14 val mem = Mem(memByte / beatBytes, Vec(beatBytes, UInt(8.W))) 15 if (dataFile != "") loadMemoryFromFile(mem, dataFile) 16 17 val offsetBits = log2Up(memByte) 18 val offsetMask = (1 << offsetBits) - 1 19 def index(addr: UInt) = (addr & offsetMask.U) >> log2Ceil(beatBytes) 20 def inRange(addr: UInt) = index(addr) < (memByte / 4).U 21 22 val wdata = VecInit.tabulate(beatBytes) { i => in.w.bits.data(8*(i+1)-1, 8*i) } 23 when (in.aw.fire() && inRange(in.aw.bits.addr)) { 24 mem.write(index(in.aw.bits.addr), wdata, in.w.bits.strb.toBools) 25 } 26 27 in.r.bits.data := Cat(RegEnable(mem.read(index(in.ar.bits.addr)), in.ar.fire()).reverse) 28} 29