`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 28.02.2019 10:33:38
// Design Name: 
// Module Name: memory
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////


module memory #(
    parameter WORD_SIZE = 32,
    parameter ELEM_SIZE = 8,
    parameter MEM_SIZE = 1024,
    parameter ADDR_SIZE = $clog2(MEM_SIZE),
    parameter INIT_FILE = "none"
)(
    input clock,
    input wr_en,
    input rd_en,
    input [ADDR_SIZE-1:0] address,
    input [WORD_SIZE-1:0] data_in,
    output [WORD_SIZE-1:0] data_out
);

    parameter ELEM_PER_WORD = WORD_SIZE/ELEM_SIZE;
    parameter SCALING = $clog2(ELEM_PER_WORD);

    reg [WORD_SIZE-1:0] ram [0:MEM_SIZE-1];
    
    initial
        $readmemh(INIT_FILE, ram);
        
    always@(posedge clock)
        if(wr_en) 
            ram[address>>SCALING] <= data_in;
            
    assign data_out = (rd_en) ? ram[address>>SCALING] : {WORD_SIZE{1'bx}};

endmodule
