`timescale 1ns / 1ps `define MEMORY_IMAGE_FILE "code/maelstrom.hex" // VERSION 1.1 // Memory module module bram(idclk, iaddr, iout, daddr, din, dout, dwe, vclk, vaddr, vout); input idclk; input [15:0] iaddr; output [15:0] iout; input [15:0] daddr; input [15:0] din; output [15:0] dout; input dwe; input [15:0] vaddr; output [15:0] vout; input vclk; reg [15:0] RAM [65535:0]; reg [15:0] read_iaddr; reg [15:0] read_daddr; reg [15:0] read_vaddr; integer f; initial begin f = 0; f = $fopen(`MEMORY_IMAGE_FILE, "r"); if (f == 0) begin $display("Memory image file %s not found", `MEMORY_IMAGE_FILE); $stop; end $fclose(f); $readmemh(`MEMORY_IMAGE_FILE, RAM, 0, 65535); end always @(posedge idclk) begin #1; if (dwe == 1'b1) RAM[daddr] <= din; read_iaddr <= iaddr; read_daddr <= daddr; end always @(posedge vclk) begin read_vaddr <= vaddr; end assign #(1) iout = RAM[read_iaddr]; assign #(1) dout = RAM[read_daddr]; assign #(1) vout = RAM[read_vaddr]; endmodule // bram