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