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