module rom #( parameter string FILE_NAME = "", parameter integer unsigned ADDR_W = 8, parameter integer unsigned DATA_W = 8 ) ( input logic clk_i, input logic cs_i, input logic [ADDR_W-1:0] address_i, output logic [DATA_W-1:0] rdata_o ); localparam ROM_SIZE = 2**ADDR_W; logic [DATA_W-1:0] rom [ROM_SIZE-1:0]; logic [DATA_W-1:0] rdata; always_ff @(posedge clk_i) if (cs_i) rdata <= rom[address_i]; assign rdata_o = {DATA_W{cs_i}} & rdata; initial begin static integer fd = $fopen(FILE_NAME, "rb"); static integer rv = $fread(rom, fd); end endmodule : rom