xref: /XiangShan/src/main/scala/device/AXI4DummySD.scala (revision fad48058f3274a0b53f1ec3db336f23346f5abc3)
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
174bf9a978SZihao Yupackage device
184bf9a978SZihao Yu
198891a219SYinan Xuimport org.chipsalliance.cde.config.Parameters
204bf9a978SZihao Yuimport chisel3._
214bf9a978SZihao Yuimport chisel3.util._
22*fad48058SYinan Xuimport difftest.common.DifftestSDCard
23956d83c0Slinjiaweiimport freechips.rocketchip.diplomacy.AddressSet
243c02ee8fSwakafaimport utility._
254bf9a978SZihao Yu
264bf9a978SZihao Yutrait HasSDConst {
274bf9a978SZihao Yu  def MemorySize = 4L * 1024 * 1024 * 1024 // 4GB
284bf9a978SZihao Yu  def READ_BL_LEN = 15
29956d83c0Slinjiawei
304bf9a978SZihao Yu  def BlockLen = (1 << READ_BL_LEN)
31956d83c0Slinjiawei
324bf9a978SZihao Yu  def NrBlock = MemorySize / BlockLen
33956d83c0Slinjiawei
344bf9a978SZihao Yu  def C_SIZE_MULT = 7 // only 3 bits
354bf9a978SZihao Yu  def MULT = (1 << (C_SIZE_MULT + 2))
36956d83c0Slinjiawei
374bf9a978SZihao Yu  def C_SIZE = NrBlock / MULT - 1
384bf9a978SZihao Yu}
394bf9a978SZihao Yu
40956d83c0Slinjiaweiclass AXI4DummySD
41956d83c0Slinjiawei(
42a2e9bde6SAllen  address: Seq[AddressSet]
43956d83c0Slinjiawei)(implicit p: Parameters)
44956d83c0Slinjiawei  extends AXI4SlaveModule(address, executable = false) with HasSDConst
45956d83c0Slinjiawei{
46956d83c0Slinjiawei  override lazy val module = new AXI4SlaveModuleImp[Null](this) {
474bf9a978SZihao Yu    val range = List.range(0, 21)
484bf9a978SZihao Yu    val sdcmd :: sdarg :: sdtout :: sdcdiv :: sdrsp0 :: sdrsp1 :: sdrsp2 :: sdrsp3 :: sdhsts :: __pad0 :: __pad1 :: __pad2 :: sdvdd :: sdedm :: sdhcfg :: sdhbct :: sddata :: __pad10 :: __pad11 :: __pad12 :: sdhblc :: Nil = range
494bf9a978SZihao Yu
504bf9a978SZihao Yu    val regs = List.fill(range.size)(RegInit(0.U(32.W)))
515dabf2dfSYinan Xu    val edmConst = (8 << 4).U(32.W) // number of data in fifo
524bf9a978SZihao Yu
534bf9a978SZihao Yu    val MMC_SEND_OP_COND = 1
544bf9a978SZihao Yu    val MMC_ALL_SEND_CID = 2
554bf9a978SZihao Yu    val MMC_SEND_CSD = 9
564bf9a978SZihao Yu    val MMC_SEND_STATUS = 13
574bf9a978SZihao Yu    val MMC_READ_MULTIPLE_BLOCK = 18
584bf9a978SZihao Yu
594bf9a978SZihao Yu    val setAddr = WireInit(false.B)
604bf9a978SZihao Yu
614bf9a978SZihao Yu    def cmdWfn(wdata: UInt) = {
624bf9a978SZihao Yu      val cmd = wdata(5, 0)
634bf9a978SZihao Yu      switch(cmd) {
644bf9a978SZihao Yu        is(MMC_SEND_OP_COND.U) {
654bf9a978SZihao Yu          regs(sdrsp0) := "h80ff8000".U
664bf9a978SZihao Yu        }
674bf9a978SZihao Yu        is(MMC_ALL_SEND_CID.U) {
684bf9a978SZihao Yu          regs(sdrsp0) := "h00000001".U
694bf9a978SZihao Yu          regs(sdrsp1) := "h00000000".U
704bf9a978SZihao Yu          regs(sdrsp2) := "h00000000".U
714bf9a978SZihao Yu          regs(sdrsp3) := "h15000000".U
724bf9a978SZihao Yu        }
734bf9a978SZihao Yu        is(MMC_SEND_CSD.U) {
744bf9a978SZihao Yu          regs(sdrsp0) := "h92404001".U
754bf9a978SZihao Yu          regs(sdrsp1) := "h124b97e3".U | (C_SIZE.U(1, 0) << 30)
764bf9a978SZihao Yu          regs(sdrsp2) := "h0f508000".U | C_SIZE.U(11, 2) | (READ_BL_LEN.U << 16)
774bf9a978SZihao Yu          regs(sdrsp3) := "h8c26012a".U
784bf9a978SZihao Yu        }
794bf9a978SZihao Yu        is(MMC_SEND_STATUS.U) {
804bf9a978SZihao Yu          regs(sdrsp0) := 0.U
814bf9a978SZihao Yu          regs(sdrsp1) := 0.U
824bf9a978SZihao Yu          regs(sdrsp2) := 0.U
834bf9a978SZihao Yu          regs(sdrsp3) := 0.U
844bf9a978SZihao Yu        }
854bf9a978SZihao Yu        is(MMC_READ_MULTIPLE_BLOCK.U) {
864bf9a978SZihao Yu          setAddr := true.B
874bf9a978SZihao Yu        }
884bf9a978SZihao Yu      }
894bf9a978SZihao Yu      wdata
904bf9a978SZihao Yu    }
914bf9a978SZihao Yu
92*fad48058SYinan Xu    val sdHelper = DifftestSDCard()
93935edac4STang Haojin    sdHelper.ren := (getOffset(raddr) === 0x40.U && in.ar.fire)
94510ae4eeSJiuyang Liu    sdHelper.setAddr := setAddr
95510ae4eeSJiuyang Liu    sdHelper.addr := regs(sdarg)
96956d83c0Slinjiawei
97510ae4eeSJiuyang Liu    def sdRead = sdHelper.data
984bf9a978SZihao Yu
994bf9a978SZihao Yu    val mapping = Map(
1004bf9a978SZihao Yu      RegMap(0x00, regs(sdcmd), cmdWfn),
1014bf9a978SZihao Yu      RegMap(0x04, regs(sdarg)),
1024bf9a978SZihao Yu      RegMap(0x10, regs(sdrsp0), RegMap.Unwritable),
1034bf9a978SZihao Yu      RegMap(0x14, regs(sdrsp1), RegMap.Unwritable),
1044bf9a978SZihao Yu      RegMap(0x18, regs(sdrsp2), RegMap.Unwritable),
1054bf9a978SZihao Yu      RegMap(0x1c, regs(sdrsp3), RegMap.Unwritable),
1064bf9a978SZihao Yu      RegMap(0x20, regs(sdhsts)),
1074bf9a978SZihao Yu      RegMap(0x34, edmConst, RegMap.Unwritable),
1084bf9a978SZihao Yu      RegMap(0x38, regs(sdhcfg)),
1094bf9a978SZihao Yu      RegMap(0x38, regs(sdhbct)),
1104bf9a978SZihao Yu      RegMap(0x40, sdRead, RegMap.Unwritable),
1114bf9a978SZihao Yu      RegMap(0x50, regs(sdhblc))
1124bf9a978SZihao Yu    )
113956d83c0Slinjiawei
1144bf9a978SZihao Yu    def getOffset(addr: UInt) = addr(12, 0)
1154bf9a978SZihao Yu
1164bf9a978SZihao Yu    val strb = Mux(waddr(2), in.w.bits.strb(7, 4), in.w.bits.strb(3, 0))
1175dabf2dfSYinan Xu    val rdata = Wire(UInt(32.W))
1184bf9a978SZihao Yu    RegMap.generate(mapping, getOffset(raddr), rdata,
119935edac4STang Haojin      getOffset(waddr), in.w.fire, in.w.bits.data(31, 0), MaskExpand(strb))
1204bf9a978SZihao Yu
1215dabf2dfSYinan Xu    in.r.bits.data := Fill(2, rdata)
1224bf9a978SZihao Yu  }
123956d83c0Slinjiawei}
124