1*51e45dbbSTang Haojin/*************************************************************************************** 2*51e45dbbSTang Haojin* Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences 3*51e45dbbSTang Haojin* Copyright (c) 2020-2021 Peng Cheng Laboratory 4*51e45dbbSTang Haojin* 5*51e45dbbSTang Haojin* XiangShan is licensed under Mulan PSL v2. 6*51e45dbbSTang Haojin* You can use this software according to the terms and conditions of the Mulan PSL v2. 7*51e45dbbSTang Haojin* You may obtain a copy of Mulan PSL v2 at: 8*51e45dbbSTang Haojin* http://license.coscl.org.cn/MulanPSL2 9*51e45dbbSTang Haojin* 10*51e45dbbSTang Haojin* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, 11*51e45dbbSTang Haojin* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, 12*51e45dbbSTang Haojin* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. 13*51e45dbbSTang Haojin* 14*51e45dbbSTang Haojin* See the Mulan PSL v2 for more details. 15*51e45dbbSTang Haojin***************************************************************************************/ 16*51e45dbbSTang Haojin 17*51e45dbbSTang Haojinpackage utils 18*51e45dbbSTang Haojin 19*51e45dbbSTang Haojinimport chisel3._ 20*51e45dbbSTang Haojin 21*51e45dbbSTang Haojinobject DebugMem { 22*51e45dbbSTang Haojin def apply[T <: Data](size: Int, data: T): DebugMem[T] = { 23*51e45dbbSTang Haojin new DebugMem(size, data) 24*51e45dbbSTang Haojin } 25*51e45dbbSTang Haojin} 26*51e45dbbSTang Haojin 27*51e45dbbSTang Haojinclass DebugMem[T <: Data](size: Int, data: T) extends IndexedSeq[T] { 28*51e45dbbSTang Haojin private var debugMem: Option[Mem[T]] = None 29*51e45dbbSTang Haojin private var debugReg: Option[Vec[T]] = None 30*51e45dbbSTang Haojin 31*51e45dbbSTang Haojin BuildInfo.version match { 32*51e45dbbSTang Haojin case "3.6.0" => debugMem = Some(Mem(size, data)) 33*51e45dbbSTang Haojin case _ => debugReg = Some(Reg(Vec(size, data))) 34*51e45dbbSTang Haojin } 35*51e45dbbSTang Haojin 36*51e45dbbSTang Haojin def apply(addr: Int): T = BuildInfo.version match { 37*51e45dbbSTang Haojin case "3.6.0" => debugMem.get(addr) 38*51e45dbbSTang Haojin case _ => debugReg.get(addr) 39*51e45dbbSTang Haojin } 40*51e45dbbSTang Haojin 41*51e45dbbSTang Haojin def apply(addr: UInt): T = BuildInfo.version match { 42*51e45dbbSTang Haojin case "3.6.0" => debugMem.get(addr) 43*51e45dbbSTang Haojin case _ => debugReg.get(addr) 44*51e45dbbSTang Haojin } 45*51e45dbbSTang Haojin 46*51e45dbbSTang Haojin def length: Int = BuildInfo.version match { 47*51e45dbbSTang Haojin case "3.6.0" => debugMem.get.length.intValue 48*51e45dbbSTang Haojin case _ => debugReg.get.length 49*51e45dbbSTang Haojin } 50*51e45dbbSTang Haojin} 51