xref: /XiangShan/src/main/scala/xiangshan/backend/regfile/Regfile.scala (revision 6624015f1ba388d25efed041bcf04031425f2735)
15844fcf0SLinJiaweipackage xiangshan.backend.regfile
25844fcf0SLinJiawei
35844fcf0SLinJiaweiimport chisel3._
45844fcf0SLinJiaweiimport chisel3.util._
580d24142SLinJiaweiimport chisel3.util.experimental.BoringUtils
65844fcf0SLinJiaweiimport xiangshan._
75844fcf0SLinJiawei
85844fcf0SLinJiaweiclass RfReadPort extends XSBundle {
95844fcf0SLinJiawei  val addr = Input(UInt(PhyRegIdxWidth.W))
105844fcf0SLinJiawei  val data = Output(UInt(XLEN.W))
115844fcf0SLinJiawei}
125844fcf0SLinJiawei
135844fcf0SLinJiaweiclass RfWritePort extends XSBundle {
145844fcf0SLinJiawei  val wen = Input(Bool())
155844fcf0SLinJiawei  val addr = Input(UInt(PhyRegIdxWidth.W))
165844fcf0SLinJiawei  val data = Input(UInt(XLEN.W))
175844fcf0SLinJiawei}
185844fcf0SLinJiawei
195844fcf0SLinJiaweiclass Regfile
205844fcf0SLinJiawei(
215844fcf0SLinJiawei  numReadPorts: Int,
225844fcf0SLinJiawei  numWirtePorts: Int,
23*6624015fSLinJiawei  hasZero: Boolean,
24*6624015fSLinJiawei  isMemRf: Boolean = false
250c701001SLinJiawei) extends XSModule {
265844fcf0SLinJiawei  val io = IO(new Bundle() {
275844fcf0SLinJiawei    val readPorts = Vec(numReadPorts, new RfReadPort)
285844fcf0SLinJiawei    val writePorts = Vec(numWirtePorts, new RfWritePort)
295844fcf0SLinJiawei  })
300c701001SLinJiawei
310c701001SLinJiawei  val mem = Mem(NRPhyRegs, UInt(XLEN.W))
320c701001SLinJiawei
330c701001SLinJiawei  for(r <- io.readPorts){
340c701001SLinJiawei    val addr_reg = RegNext(r.addr)
350c701001SLinJiawei    r.data := {if(hasZero) Mux(addr_reg===0.U, 0.U, mem(addr_reg)) else mem(addr_reg)}
360c701001SLinJiawei  }
370c701001SLinJiawei
380c701001SLinJiawei  for(w <- io.writePorts){
390c701001SLinJiawei    when(w.wen){
400c701001SLinJiawei      mem(w.addr) := w.data
410c701001SLinJiawei    }
420c701001SLinJiawei  }
43*6624015fSLinJiawei
44*6624015fSLinJiawei  if(!isMemRf){
4580d24142SLinJiawei    val debugArchRat = WireInit(VecInit(Seq.fill(32)(0.U(PhyRegIdxWidth.W))))
4680d24142SLinJiawei    BoringUtils.addSink(debugArchRat, if(hasZero) "DEBUG_INI_ARCH_RAT" else "DEBUG_FP_ARCH_RAT")
4780d24142SLinJiawei
4880d24142SLinJiawei    val debugArchReg = WireInit(VecInit(debugArchRat.zipWithIndex.map(x => if(hasZero && x._2==0) 0.U else mem(x._1))))
4980d24142SLinJiawei    BoringUtils.addSource(debugArchReg, if(hasZero) "DEBUG_INT_ARCH_REG" else "DEBUG_FP_ARCH_REG")
505844fcf0SLinJiawei  }
51*6624015fSLinJiawei}
52