svgb/rtl/ram.sv

40 lines
715 B
Systemverilog

module ram #(
parameter DATA_W = 8,
parameter ADDR_W = 8
)(
input logic clk,
input logic nreset,
input logic cs_i,
input logic [ADDR_W-1:0] address_i,
input logic we_i,
input logic [DATA_W-1:0] wdata_i,
output logic [DATA_W-1:0] rdata_o
);
localparam RAM_SIZE = 2**ADDR_W;
logic [DATA_W-1:0] ram [RAM_SIZE-1:0];
logic [DATA_W-1:0] rdata;
logic we;
assign we = cs_i & we_i;
always_ff @(posedge clk) begin
if (we)
ram[address_i] <= wdata_i;
end
always_ff @(posedge clk or negedge nreset) begin
if (!nreset)
rdata <= '0;
else
rdata <= ram[address_i];
end
assign rdata_o = {8{cs_i}} & rdata;
endmodule