xref: /XiangShan/src/main/scala/device/AXI4RAM.scala (revision fc00d2822dcc80161e6da645d80c2385d229e73b)
1c6d43980SLemover/***************************************************************************************
2c6d43980SLemover* Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences
3f320e0f0SYinan Xu* Copyright (c) 2020-2021 Peng Cheng Laboratory
4c6d43980SLemover*
5c6d43980SLemover* XiangShan is licensed under Mulan PSL v2.
6c6d43980SLemover* You can use this software according to the terms and conditions of the Mulan PSL v2.
7c6d43980SLemover* You may obtain a copy of Mulan PSL v2 at:
8c6d43980SLemover*          http://license.coscl.org.cn/MulanPSL2
9c6d43980SLemover*
10c6d43980SLemover* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
11c6d43980SLemover* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
12c6d43980SLemover* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
13c6d43980SLemover*
14c6d43980SLemover* See the Mulan PSL v2 for more details.
15c6d43980SLemover***************************************************************************************/
16c6d43980SLemover
17ce6a2d5bSZihao Yupackage device
18ce6a2d5bSZihao Yu
19ce6a2d5bSZihao Yuimport chisel3._
2071784e68SYinan Xuimport chisel3.util._
21*fc00d282SYinan Xuimport difftest.common.DifftestMem
2271784e68SYinan Xuimport freechips.rocketchip.amba.axi4.AXI4SlaveNode
2371784e68SYinan Xuimport freechips.rocketchip.diplomacy.{AddressSet, LazyModule}
24*fc00d282SYinan Xuimport org.chipsalliance.cde.config.Parameters
259ae8972bSZihao Yu
260341d9bdSlinjiaweiclass AXI4RAM
270341d9bdSlinjiawei(
28a2e9bde6SAllen  address: Seq[AddressSet],
296f1f3ac7Slinjiawei  memByte: Long,
300341d9bdSlinjiawei  useBlackBox: Boolean = false,
310341d9bdSlinjiawei  executable: Boolean = true,
320341d9bdSlinjiawei  beatBytes: Int = 8,
332225d46eSJiawei Lin  burstLen: Int = 16,
340341d9bdSlinjiawei)(implicit p: Parameters)
350341d9bdSlinjiawei  extends AXI4SlaveModule(address, executable, beatBytes, burstLen)
360341d9bdSlinjiawei{
370341d9bdSlinjiawei  override lazy val module = new AXI4SlaveModuleImp(this){
380341d9bdSlinjiawei
3920592febSZihao Yu    val offsetBits = log2Up(memByte)
400341d9bdSlinjiawei
412195ebbdSYinan Xu    require(address.length >= 1)
422195ebbdSYinan Xu    val baseAddress = address(0).base
432195ebbdSYinan Xu
44935edac4STang Haojin    def index(addr: UInt) = ((addr - baseAddress.U)(offsetBits - 1, 0) >> log2Ceil(beatBytes)).asUInt
450341d9bdSlinjiawei
4611f0c68cSAllen    def inRange(idx: UInt) = idx < (memByte / beatBytes).U
47ce6a2d5bSZihao Yu
48da878e9eSZihao Yu    val wIdx = index(waddr) + writeBeatCnt
499ae8972bSZihao Yu    val rIdx = index(raddr) + readBeatCnt
50935edac4STang Haojin    val wen = in.w.fire && inRange(wIdx)
5111f0c68cSAllen    require(beatBytes >= 8)
529ae8972bSZihao Yu
539ae8972bSZihao Yu    val rdata = if (useBlackBox) {
54*fc00d282SYinan Xu      val mem = DifftestMem(memByte, beatBytes)
55*fc00d282SYinan Xu      when (wen) {
56*fc00d282SYinan Xu        mem.write(
57*fc00d282SYinan Xu          addr = wIdx,
58*fc00d282SYinan Xu          data = in.w.bits.data.asTypeOf(Vec(beatBytes, UInt(8.W))),
59*fc00d282SYinan Xu          mask = in.w.bits.strb.asBools
60*fc00d282SYinan Xu        )
6111f0c68cSAllen      }
62*fc00d282SYinan Xu      val raddr = Mux(in.r.fire && !rLast, rIdx + 1.U, rIdx)
63*fc00d282SYinan Xu      mem.readAndHold(raddr, in.ar.fire || in.r.fire).asUInt
649ae8972bSZihao Yu    } else {
650341d9bdSlinjiawei      val mem = Mem(memByte / beatBytes, Vec(beatBytes, UInt(8.W)))
669ae8972bSZihao Yu
670341d9bdSlinjiawei      val wdata = VecInit.tabulate(beatBytes) { i => in.w.bits.data(8 * (i + 1) - 1, 8 * i) }
680341d9bdSlinjiawei      when(wen) {
69935edac4STang Haojin        mem.write(wIdx, wdata, in.w.bits.strb.asBools)
700341d9bdSlinjiawei      }
719ae8972bSZihao Yu
729ae8972bSZihao Yu      Cat(mem.read(rIdx).reverse)
73ce6a2d5bSZihao Yu    }
74efc6a777Slinjiawei    in.r.bits.data := rdata
75ce6a2d5bSZihao Yu  }
760341d9bdSlinjiawei}
772225d46eSJiawei Lin
7871784e68SYinan Xuclass AXI4RAMWrapper (
7971784e68SYinan Xu  slave: AXI4SlaveNode,
8071784e68SYinan Xu  memByte: Long,
8171784e68SYinan Xu  useBlackBox: Boolean = false
8271784e68SYinan Xu )(implicit p: Parameters) extends AXI4MemorySlave(slave, memByte, useBlackBox) {
832225d46eSJiawei Lin  val ram = LazyModule(new AXI4RAM(
842225d46eSJiawei Lin    slaveParam.address, memByte, useBlackBox,
852225d46eSJiawei Lin    slaveParam.executable, portParam.beatBytes, burstLen
862225d46eSJiawei Lin  ))
8771784e68SYinan Xu  ram.node := master
882225d46eSJiawei Lin}
89