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