xref: /XiangShan/src/main/scala/utils/DebugMem.scala (revision 51e45dbbf87325e45ff2af6ca86ed6c7eed04464)
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