module usb3_crc_dpp16 (

input 	wire	[15:0]	di,
input	wire	[31:0]	q,
output	wire	[31:0]	crc_out,
input	wire			rst,
input	wire			clk

);

wire [31:0]	c;
wire [15:0] d = {	di[0 ],di[1 ],di[2 ],di[3 ],di[4 ],di[5 ],di[6 ],di[7],
					di[8 ],di[9 ],di[10],di[11],di[12],di[13],di[14],di[15]};
						
assign crc_out = ~{	c[0],  c[1],  c[2],  c[3],  c[4],  c[5],  c[6],  c[7], 
					c[8],  c[9],  c[10], c[11], c[12], c[13], c[14], c[15],
					c[16], c[17], c[18], c[19], c[20], c[21], c[22], c[23], 
					c[24], c[25], c[26], c[27], c[28], c[29], c[30], c[31]};

assign	c[0] = q[16] ^ q[22] ^ q[25] ^ q[26] ^ q[28] ^ d[0] ^ d[6] ^ d[9] ^ d[10] ^ d[12];
assign	c[1] = q[16] ^ q[17] ^ q[22] ^ q[23] ^ q[25] ^ q[27] ^ q[28] ^ q[29] ^ d[0] ^ d[1] ^ d[6] ^ d[7] ^ d[9] ^ d[11] ^ d[12] ^ d[13];
assign	c[2] = q[16] ^ q[17] ^ q[18] ^ q[22] ^ q[23] ^ q[24] ^ q[25] ^ q[29] ^ q[30] ^ d[0] ^ d[1] ^ d[2] ^ d[6] ^ d[7] ^ d[8] ^ d[9] ^ d[13] ^ d[14];
assign	c[3] = q[17] ^ q[18] ^ q[19] ^ q[23] ^ q[24] ^ q[25] ^ q[26] ^ q[30] ^ q[31] ^ d[1] ^ d[2] ^ d[3] ^ d[7] ^ d[8] ^ d[9] ^ d[10] ^ d[14] ^ d[15];
assign	c[4] = q[16] ^ q[18] ^ q[19] ^ q[20] ^ q[22] ^ q[24] ^ q[27] ^ q[28] ^ q[31] ^ d[0] ^ d[2] ^ d[3] ^ d[4] ^ d[6] ^ d[8] ^ d[11] ^ d[12] ^ d[15];
assign	c[5] = q[16] ^ q[17] ^ q[19] ^ q[20] ^ q[21] ^ q[22] ^ q[23] ^ q[26] ^ q[29] ^ d[0] ^ d[1] ^ d[3] ^ d[4] ^ d[5] ^ d[6] ^ d[7] ^ d[10] ^ d[13];
assign	c[6] = q[17] ^ q[18] ^ q[20] ^ q[21] ^ q[22] ^ q[23] ^ q[24] ^ q[27] ^ q[30] ^ d[1] ^ d[2] ^ d[4] ^ d[5] ^ d[6] ^ d[7] ^ d[8] ^ d[11] ^ d[14];
assign	c[7] = q[16] ^ q[18] ^ q[19] ^ q[21] ^ q[23] ^ q[24] ^ q[26] ^ q[31] ^ d[0] ^ d[2] ^ d[3] ^ d[5] ^ d[7] ^ d[8] ^ d[10] ^ d[15];
assign	c[8] = q[16] ^ q[17] ^ q[19] ^ q[20] ^ q[24] ^ q[26] ^ q[27] ^ q[28] ^ d[0] ^ d[1] ^ d[3] ^ d[4] ^ d[8] ^ d[10] ^ d[11] ^ d[12];
assign	c[9] = q[17] ^ q[18] ^ q[20] ^ q[21] ^ q[25] ^ q[27] ^ q[28] ^ q[29] ^ d[1] ^ d[2] ^ d[4] ^ d[5] ^ d[9] ^ d[11] ^ d[12] ^ d[13];
assign	c[10] = q[16] ^ q[18] ^ q[19] ^ q[21] ^ q[25] ^ q[29] ^ q[30] ^ d[0] ^ d[2] ^ d[3] ^ d[5] ^ d[9] ^ d[13] ^ d[14];
assign	c[11] = q[16] ^ q[17] ^ q[19] ^ q[20] ^ q[25] ^ q[28] ^ q[30] ^ q[31] ^ d[0] ^ d[1] ^ d[3] ^ d[4] ^ d[9] ^ d[12] ^ d[14] ^ d[15];
assign	c[12] = q[16] ^ q[17] ^ q[18] ^ q[20] ^ q[21] ^ q[22] ^ q[25] ^ q[28] ^ q[29] ^ q[31] ^ d[0] ^ d[1] ^ d[2] ^ d[4] ^ d[5] ^ d[6] ^ d[9] ^ d[12] ^ d[13] ^ d[15];
assign	c[13] = q[17] ^ q[18] ^ q[19] ^ q[21] ^ q[22] ^ q[23] ^ q[26] ^ q[29] ^ q[30] ^ d[1] ^ d[2] ^ d[3] ^ d[5] ^ d[6] ^ d[7] ^ d[10] ^ d[13] ^ d[14];
assign	c[14] = q[18] ^ q[19] ^ q[20] ^ q[22] ^ q[23] ^ q[24] ^ q[27] ^ q[30] ^ q[31] ^ d[2] ^ d[3] ^ d[4] ^ d[6] ^ d[7] ^ d[8] ^ d[11] ^ d[14] ^ d[15];
assign	c[15] = q[19] ^ q[20] ^ q[21] ^ q[23] ^ q[24] ^ q[25] ^ q[28] ^ q[31] ^ d[3] ^ d[4] ^ d[5] ^ d[7] ^ d[8] ^ d[9] ^ d[12] ^ d[15];
assign	c[16] = q[0] ^ q[16] ^ q[20] ^ q[21] ^ q[24] ^ q[28] ^ q[29] ^ d[0] ^ d[4] ^ d[5] ^ d[8] ^ d[12] ^ d[13];
assign	c[17] = q[1] ^ q[17] ^ q[21] ^ q[22] ^ q[25] ^ q[29] ^ q[30] ^ d[1] ^ d[5] ^ d[6] ^ d[9] ^ d[13] ^ d[14];
assign	c[18] = q[2] ^ q[18] ^ q[22] ^ q[23] ^ q[26] ^ q[30] ^ q[31] ^ d[2] ^ d[6] ^ d[7] ^ d[10] ^ d[14] ^ d[15];
assign	c[19] = q[3] ^ q[19] ^ q[23] ^ q[24] ^ q[27] ^ q[31] ^ d[3] ^ d[7] ^ d[8] ^ d[11] ^ d[15];
assign	c[20] = q[4] ^ q[20] ^ q[24] ^ q[25] ^ q[28] ^ d[4] ^ d[8] ^ d[9] ^ d[12];
assign	c[21] = q[5] ^ q[21] ^ q[25] ^ q[26] ^ q[29] ^ d[5] ^ d[9] ^ d[10] ^ d[13];
assign	c[22] = q[6] ^ q[16] ^ q[25] ^ q[27] ^ q[28] ^ q[30] ^ d[0] ^ d[9] ^ d[11] ^ d[12] ^ d[14];
assign	c[23] = q[7] ^ q[16] ^ q[17] ^ q[22] ^ q[25] ^ q[29] ^ q[31] ^ d[0] ^ d[1] ^ d[6] ^ d[9] ^ d[13] ^ d[15];
assign	c[24] = q[8] ^ q[17] ^ q[18] ^ q[23] ^ q[26] ^ q[30] ^ d[1] ^ d[2] ^ d[7] ^ d[10] ^ d[14];
assign	c[25] = q[9] ^ q[18] ^ q[19] ^ q[24] ^ q[27] ^ q[31] ^ d[2] ^ d[3] ^ d[8] ^ d[11] ^ d[15];
assign	c[26] = q[10] ^ q[16] ^ q[19] ^ q[20] ^ q[22] ^ q[26] ^ d[0] ^ d[3] ^ d[4] ^ d[6] ^ d[10];
assign	c[27] = q[11] ^ q[17] ^ q[20] ^ q[21] ^ q[23] ^ q[27] ^ d[1] ^ d[4] ^ d[5] ^ d[7] ^ d[11];
assign	c[28] = q[12] ^ q[18] ^ q[21] ^ q[22] ^ q[24] ^ q[28] ^ d[2] ^ d[5] ^ d[6] ^ d[8] ^ d[12];
assign	c[29] = q[13] ^ q[19] ^ q[22] ^ q[23] ^ q[25] ^ q[29] ^ d[3] ^ d[6] ^ d[7] ^ d[9] ^ d[13];
assign	c[30] = q[14] ^ q[20] ^ q[23] ^ q[24] ^ q[26] ^ q[30] ^ d[4] ^ d[7] ^ d[8] ^ d[10] ^ d[14];
assign	c[31] = q[15] ^ q[21] ^ q[24] ^ q[25] ^ q[27] ^ q[31] ^ d[5] ^ d[8] ^ d[9] ^ d[11] ^ d[15];

endmodule