xref: /XiangShan/src/main/scala/xiangshan/backend/regfile/Regfile.scala (revision 06a36b4fc9846f4cabc63aa8b4f243ab13e4d01b)
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.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.W))
16}
17
18class Regfile
19(
20  numReadPorts: Int,
21  numWirtePorts: Int,
22  hasZero: Boolean
23) extends XSModule {
24  val io = IO(new Bundle() {
25    val readPorts = Vec(numReadPorts, new RfReadPort)
26    val writePorts = Vec(numWirtePorts, new RfWritePort)
27  })
28
29  val mem = Mem(NRPhyRegs, UInt(XLEN.W))
30
31  for(r <- io.readPorts){
32    val addr_reg = RegNext(r.addr)
33    r.data := {if(hasZero) Mux(addr_reg===0.U, 0.U, mem(addr_reg)) else mem(addr_reg)}
34  }
35
36  for(w <- io.writePorts){
37    when(w.wen){
38      mem(w.addr) := w.data
39    }
40  }
41}
42