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