xref: /XiangShan/src/main/scala/xiangshan/backend/regfile/Regfile.scala (revision 001fc977af066ca79b0d0729dd3d8e586991e1ae)
1package xiangshan.backend.regfile
2
3import chisel3._
4import chisel3.util._
5import xiangshan._
6
7class RfReadPort extends XSBundle {
8  val addr = Input(UInt(PhyRegIdxWidth.W))
9  val data = Output(UInt((XLEN + 1).W))
10}
11
12class RfWritePort extends XSBundle {
13  val wen = Input(Bool())
14  val addr = Input(UInt(PhyRegIdxWidth.W))
15  val data = Input(UInt((XLEN + 1).W))
16}
17
18class Regfile
19(
20  numReadPorts: Int,
21  numWirtePorts: Int,
22  hasZero: Boolean,
23  len: Int
24) extends XSModule {
25  val io = IO(new Bundle() {
26    val readPorts = Vec(numReadPorts, new RfReadPort)
27    val writePorts = Vec(numWirtePorts, new RfWritePort)
28  })
29
30  val mem = Mem(NRPhyRegs, UInt(len.W))
31
32  for(r <- io.readPorts){
33    val addr_reg = RegNext(r.addr)
34    r.data := {if(hasZero) Mux(addr_reg===0.U, 0.U, mem(addr_reg)) else mem(addr_reg)}
35  }
36
37  for(w <- io.writePorts){
38    when(w.wen){
39      mem(w.addr) := w.data
40    }
41  }
42
43  if (!env.FPGAPlatform) {
44    val debugArchRat = WireInit(VecInit(Seq.fill(32)(0.U(PhyRegIdxWidth.W))))
45    ExcitingUtils.addSink(
46      debugArchRat,
47      if(hasZero) "DEBUG_INI_ARCH_RAT" else "DEBUG_FP_ARCH_RAT",
48      ExcitingUtils.Debug
49    )
50
51    val debugArchReg = WireInit(VecInit(debugArchRat.zipWithIndex.map(
52      x => if(hasZero && x._2==0) 0.U else mem(x._1)
53    )))
54    ExcitingUtils.addSource(
55      debugArchReg,
56      if(hasZero) "DEBUG_INT_ARCH_REG" else "DEBUG_FP_ARCH_REG",
57      ExcitingUtils.Debug
58    )
59  }
60
61}
62