xref: /XiangShan/src/main/scala/device/AXI4RAM.scala (revision 5e80b95b5495e356f3328bd1c06721ca2cedac67)
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._
10
11sealed abstract class RAM[T <: AXI4Lite](_type: T,
12  memByte: Int, beatBytes: Int = 4, dataFile: String = "") extends Module {
13  val io = IO(new Bundle{
14    val in = Flipped(_type)
15  })
16
17  val in = io.in
18  val mem = Mem(memByte / beatBytes, Vec(beatBytes, UInt(8.W)))
19  if (dataFile != "") loadMemoryFromFile(mem, dataFile)
20
21  def index(addr: UInt) = addr >> log2Ceil(beatBytes)
22
23  val w_full = RegInit(false.B)
24  when (in. b.fire()) { w_full := false.B }
25  when (in.aw.fire()) { w_full := true.B }
26
27  val wdata = VecInit.tabulate(beatBytes) { i => in.w.bits.data(8*(i+1)-1, 8*i) }
28  when (in.aw.fire()) {
29    mem.write(index(in.ar.bits.addr), wdata, in.w.bits.strb.toBools)
30  }
31
32  in. b.valid := w_full
33  in.aw.ready := in. w.valid && (in.b.ready || !w_full)
34  in. w.ready := in.aw.valid && (in.b.ready || !w_full)
35  in.b.bits.resp := AXI4Parameters.RESP_OKAY
36
37  val r_full = RegInit(false.B)
38  when (in. r.fire()) { r_full := false.B }
39  when (in.ar.fire()) { r_full := true.B }
40
41  def holdUnless[T <: Data](x: T, enable: Bool): T = Mux(enable, x, RegEnable(x, enable))
42
43  val ren = in.ar.fire()
44  val rdata = RegEnable(mem.read(index(in.ar.bits.addr)), ren)
45
46  in. r.valid := r_full
47  in.ar.ready := in.r.ready || !r_full
48  in.r.bits.resp := AXI4Parameters.RESP_OKAY
49  in.r.bits.data := Cat(rdata.reverse)
50}
51
52class AXI4LiteRAM(memByte: Int, beatBytes: Int = 4, dataFile: String = "")
53  extends RAM(new AXI4Lite, memByte, beatBytes, dataFile)
54
55class AXI4RAM(memByte: Int, beatBytes: Int = 4, dataFile: String = "")
56  extends RAM(new AXI4, memByte, beatBytes, dataFile) {
57
58  in.b.bits.id := RegEnable(in.aw.bits.id, in.aw.fire())
59  in.b.bits.user := RegEnable(in.aw.bits.user, in.aw.fire())
60  in.r.bits.id := RegEnable(in.ar.bits.id, in.ar.fire())
61  in.r.bits.user := RegEnable(in.ar.bits.user, in.ar.fire())
62  in.r.bits.last := true.B
63}
64