xref: /XiangShan/src/main/scala/xiangshan/backend/regfile/Regfile.scala (revision 0c7010011aa569214eeacb79ef652cbf1ac33ca8)
15844fcf0SLinJiaweipackage xiangshan.backend.regfile
25844fcf0SLinJiawei
35844fcf0SLinJiaweiimport chisel3._
45844fcf0SLinJiaweiimport chisel3.util._
55844fcf0SLinJiaweiimport xiangshan._
65844fcf0SLinJiawei
75844fcf0SLinJiaweiclass RfReadPort extends XSBundle {
85844fcf0SLinJiawei  val addr = Input(UInt(PhyRegIdxWidth.W))
95844fcf0SLinJiawei  val data = Output(UInt(XLEN.W))
105844fcf0SLinJiawei}
115844fcf0SLinJiawei
125844fcf0SLinJiaweiclass RfWritePort extends XSBundle {
135844fcf0SLinJiawei  val wen = Input(Bool())
145844fcf0SLinJiawei  val addr = Input(UInt(PhyRegIdxWidth.W))
155844fcf0SLinJiawei  val data = Input(UInt(XLEN.W))
165844fcf0SLinJiawei}
175844fcf0SLinJiawei
185844fcf0SLinJiaweiclass Regfile
195844fcf0SLinJiawei(
205844fcf0SLinJiawei  numReadPorts: Int,
215844fcf0SLinJiawei  numWirtePorts: Int,
225844fcf0SLinJiawei  hasZero: Boolean
23*0c701001SLinJiawei) extends XSModule {
245844fcf0SLinJiawei  val io = IO(new Bundle() {
255844fcf0SLinJiawei    val readPorts = Vec(numReadPorts, new RfReadPort)
265844fcf0SLinJiawei    val writePorts = Vec(numWirtePorts, new RfWritePort)
275844fcf0SLinJiawei  })
28*0c701001SLinJiawei
29*0c701001SLinJiawei  val mem = Mem(NRPhyRegs, UInt(XLEN.W))
30*0c701001SLinJiawei
31*0c701001SLinJiawei  for(r <- io.readPorts){
32*0c701001SLinJiawei    val addr_reg = RegNext(r.addr)
33*0c701001SLinJiawei    r.data := {if(hasZero) Mux(addr_reg===0.U, 0.U, mem(addr_reg)) else mem(addr_reg)}
34*0c701001SLinJiawei  }
35*0c701001SLinJiawei
36*0c701001SLinJiawei  for(w <- io.writePorts){
37*0c701001SLinJiawei    when(w.wen){
38*0c701001SLinJiawei      mem(w.addr) := w.data
39*0c701001SLinJiawei    }
40*0c701001SLinJiawei  }
415844fcf0SLinJiawei}
42