import cpu_types::*; module ram ( input clk, we, input [31:0] a, wd, input [3:0] write_byte_enable, input dump, output [31:0] rd); reg [31:0] mask; reg [31:0] memory[8092]; assign rd = memory[a[14:2]]; // word aligned parameter LOAD_FILE = 0; parameter string LOAD_FILE_PATH = ""; parameter WRITE_FILE = 0; parameter string WRITE_FILE_PATH = ""; always_comb begin mask = { {8{write_byte_enable[3]}}, {8{write_byte_enable[2]}}, {8{write_byte_enable[1]}}, {8{write_byte_enable[0]}} }; end initial if (LOAD_FILE == 1) begin $display("Loading file %s into memory.", LOAD_FILE_PATH); $readmemh(LOAD_FILE_PATH, memory); end initial begin if (WRITE_FILE == 1) begin wait (dump == 1); #5 $display("Writing memory to file %s.", WRITE_FILE_PATH); $writememh(WRITE_FILE_PATH, memory); end end always_ff @ (posedge clk) if(we) memory[a[14:2]] = (rd & ~mask) | (wd & mask); endmodule