| 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 |