xref: /XiangShan/src/main/scala/xiangshan/backend/regfile/Regfile.scala (revision 9684eb4fac35c5ee85ae727226265c7ed7fdb746)
15844fcf0SLinJiaweipackage xiangshan.backend.regfile
25844fcf0SLinJiawei
35844fcf0SLinJiaweiimport chisel3._
45844fcf0SLinJiaweiimport chisel3.util._
55844fcf0SLinJiaweiimport xiangshan._
65844fcf0SLinJiawei
75844fcf0SLinJiaweiclass RfReadPort extends XSBundle {
85844fcf0SLinJiawei  val addr = Input(UInt(PhyRegIdxWidth.W))
9*9684eb4fSLinJiawei  val data = Output(UInt((XLEN + 1).W))
105844fcf0SLinJiawei}
115844fcf0SLinJiawei
125844fcf0SLinJiaweiclass RfWritePort extends XSBundle {
135844fcf0SLinJiawei  val wen = Input(Bool())
145844fcf0SLinJiawei  val addr = Input(UInt(PhyRegIdxWidth.W))
15*9684eb4fSLinJiawei  val data = Input(UInt((XLEN + 1).W))
165844fcf0SLinJiawei}
175844fcf0SLinJiawei
185844fcf0SLinJiaweiclass Regfile
195844fcf0SLinJiawei(
205844fcf0SLinJiawei  numReadPorts: Int,
215844fcf0SLinJiawei  numWirtePorts: Int,
22*9684eb4fSLinJiawei  hasZero: Boolean,
23*9684eb4fSLinJiawei  len: Int
240c701001SLinJiawei) extends XSModule {
255844fcf0SLinJiawei  val io = IO(new Bundle() {
265844fcf0SLinJiawei    val readPorts = Vec(numReadPorts, new RfReadPort)
275844fcf0SLinJiawei    val writePorts = Vec(numWirtePorts, new RfWritePort)
285844fcf0SLinJiawei  })
290c701001SLinJiawei
30*9684eb4fSLinJiawei  val mem = Mem(NRPhyRegs, UInt(len.W))
310c701001SLinJiawei
320c701001SLinJiawei  for(r <- io.readPorts){
330c701001SLinJiawei    val addr_reg = RegNext(r.addr)
340c701001SLinJiawei    r.data := {if(hasZero) Mux(addr_reg===0.U, 0.U, mem(addr_reg)) else mem(addr_reg)}
350c701001SLinJiawei  }
360c701001SLinJiawei
370c701001SLinJiawei  for(w <- io.writePorts){
380c701001SLinJiawei    when(w.wen){
390c701001SLinJiawei      mem(w.addr) := w.data
400c701001SLinJiawei    }
410c701001SLinJiawei  }
426624015fSLinJiawei
4380d24142SLinJiawei  val debugArchRat = WireInit(VecInit(Seq.fill(32)(0.U(PhyRegIdxWidth.W))))
4489722029SLinJiawei  ExcitingUtils.addSink(
4589722029SLinJiawei    debugArchRat,
4689722029SLinJiawei    if(hasZero) "DEBUG_INI_ARCH_RAT" else "DEBUG_FP_ARCH_RAT",
4789722029SLinJiawei    ExcitingUtils.Debug
4889722029SLinJiawei  )
4980d24142SLinJiawei
5089722029SLinJiawei  val debugArchReg = WireInit(VecInit(debugArchRat.zipWithIndex.map(
5189722029SLinJiawei    x => if(hasZero && x._2==0) 0.U else mem(x._1)
5289722029SLinJiawei  )))
5389722029SLinJiawei  ExcitingUtils.addSource(
5489722029SLinJiawei    debugArchReg,
5589722029SLinJiawei    if(hasZero) "DEBUG_INT_ARCH_REG" else "DEBUG_FP_ARCH_REG",
5689722029SLinJiawei    ExcitingUtils.Debug
5789722029SLinJiawei  )
585844fcf0SLinJiawei}
59