|  | module DPR16X4C ( | 
|  | input [3:0] DI, | 
|  | input WCK, WRE, | 
|  | input [3:0] RAD, | 
|  | input [3:0] WAD, | 
|  | output [3:0] DO | 
|  | ); | 
|  | // For legacy Lattice compatibility, INITIVAL is a hex | 
|  | // string rather than a numeric parameter | 
|  | parameter INITVAL = "0x0000000000000000"; | 
|  |  | 
|  | function [63:0] convert_initval; | 
|  | input [143:0] hex_initval; | 
|  | reg done; | 
|  | reg [63:0] temp; | 
|  | reg [7:0] char; | 
|  | integer i; | 
|  | begin | 
|  | done = 1'b0; | 
|  | temp = 0; | 
|  | for (i = 0; i < 16; i = i + 1) begin | 
|  | if (!done) begin | 
|  | char = hex_initval[8*i +: 8]; | 
|  | if (char == "x") begin | 
|  | done = 1'b1; | 
|  | end else begin | 
|  | if (char >= "0" && char <= "9") | 
|  | temp[4*i +: 4] = char - "0"; | 
|  | else if (char >= "A" && char <= "F") | 
|  | temp[4*i +: 4] = 10 + char - "A"; | 
|  | else if (char >= "a" && char <= "f") | 
|  | temp[4*i +: 4] = 10 + char - "a"; | 
|  | end | 
|  | end | 
|  | end | 
|  | convert_initval = temp; | 
|  | end | 
|  | endfunction | 
|  |  | 
|  | localparam conv_initval = convert_initval(INITVAL); | 
|  |  | 
|  | reg [3:0] ram[0:15]; | 
|  | integer i; | 
|  | initial begin | 
|  | for (i = 0; i < 15; i = i + 1) begin | 
|  | ram[i] <= conv_initval[4*i +: 4]; | 
|  | end | 
|  | end | 
|  |  | 
|  | always @(posedge WCK) | 
|  | if (WRE) | 
|  | ram[WAD] <= DI; | 
|  |  | 
|  | assign DO = ram[RAD]; | 
|  |  | 
|  | endmodule |