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