symbiflow-arch-defs
symbiflow-arch-defs

DPR16X4C

Component Diagram

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

Internal Diagram

/home/docs/checkouts/readthedocs.org/user_builds/rw1nkler-symbiflow-arch-defs/checkouts/latest/ecp5/primitives/slice/DPR16X4C/DPR16X4C.sim.v

Verilog File

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