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