/* * serv_rf_ram.v : SRAM-based RF storage for SERV * * SPDX-FileCopyrightText: 2019 Olof Kindgren * SPDX-License-Identifier: ISC */ `include "../util/clog2.vh" module serv_rf_ram #(parameter width=0, parameter csr_regs=4, parameter depth=32*(32+csr_regs)/width) (input wire i_clk, input wire [`CLOG2(depth)-1:0] i_waddr, input wire [width-1:0] i_wdata, input wire i_wen, input wire [`CLOG2(depth)-1:0] i_raddr, input wire i_ren, output wire [width-1:0] o_rdata); reg [width-1:0] memory [0:depth-1]; reg [width-1:0] rdata ; always @(posedge i_clk) begin if (i_wen) memory[i_waddr] <= i_wdata; rdata <= i_ren ? memory[i_raddr] : {width{1'bx}}; end /* Reads from reg x0 needs to return 0 Check that the part of the read address corresponding to the register is zero and gate the output width LSB of reg index `CLOG2(width) 2 4 1 4 3 2 8 2 3 16 1 4 32 0 5 */ reg regzero; always @(posedge i_clk) regzero <= !(|i_raddr[`CLOG2(depth)-1:5-`CLOG2(width)]); assign o_rdata = rdata & ~{width{regzero}}; `ifdef SERV_CLEAR_RAM integer i; initial for (i=0;i