/* $Author: karu $ */ /* $Modified by Guangyu Shi $*/ /* $LastChangedDate: 2010-11-7 $ */ /* $Rev: 46 $ */ // Synthesizable memory ////////////////////////////////////// // // Memory -- single cycle version // // written for CS/ECE 552, Spring '07 // Pratap Ramamurthy, 19 Mar 2006 // // This is a word-addressable, // 16-bit wide memory // // All reads happen combinationally with zero delay. // All writes occur on rising clock edge. // Concurrent read and write not allowed. // // On reset, memory loads from file "loadfile_all.img". // (You may change the name of the file in // the $readmemh statement below.) // File format: // @0 // // // ...etc // // If input "createdump" is true on rising clock, // contents of memory will be dumped to // file "dumpfile", from location 0 up through // the highest location modified by a write. // // ////////////////////////////////////// module memory1c (data_out, data_in, addr, enable, wr, clk, rst/*, createdump*/); parameter ADDR_WIDTH = 7; output [15:0] data_out; input [15:0] data_in; input [ADDR_WIDTH-1 :0] addr; input enable; input wr; input clk; input rst; // input createdump; wire [15:0] data_out; reg [15:0] mem [0:2**ADDR_WIDTH-1]; reg loaded; reg [16:0] largest; // integer mcd; // integer i; // assign data_temp_0 = mem[addr]; // assign data_temp_2 = mem[{addr+8'h1]; assign data_out = (enable & (~wr))? {mem[addr]}: 0; initial begin loaded = 0; largest = 0; /* for (i = 0; i< 65536; i=i+1) begin mem[i] = 8'd0; end */ end always @(posedge clk) begin if (rst) begin // first init to 0, then load loadfile_all.img if (!loaded) begin $readmemh("loadfile_all.img", mem); loaded = 1; end end else begin if (enable & wr) begin mem[addr] = data_in[15:0]; // The actual write // The actual write // if ({1'b0, addr} > largest) largest = addr; // avoid negative numbers end /* if (createdump) begin mcd = $fopen("dumpfile", "w"); for (i=0; i<=largest+1; i=i+1) begin $fdisplay(mcd,"%4h %2h", i, mem[i]); end $fclose(mcd); end */ end end endmodule // memory1c // DUMMY LINE FOR REV CONTROL :0: