module crc1(data, crcin, crcout);
input [7:0] data;
input [15:0] crcin;
output [15:0] crcout;
reg [15:0] crcout;
// CRC-16, polynomial = 0x11021, transmit msb first, 8 bits per group
task get_crc;
output [15:0] crcout;
input [7:0] data;
input [15:0] crc;
reg [15:0] crcout;
begin
crcout[0] = crc[12] ^ crc[8] ^ data[4] ^ data[0];
crcout[1] = crc[13] ^ crc[9] ^ data[5] ^ data[1];
crcout[2] = crc[14] ^ crc[10] ^ data[6] ^ data[2];
crcout[3] = crc[15] ^ crc[11] ^ data[7] ^ data[3];
crcout[4] = crc[12] ^ data[4];
crcout[5] = crc[13] ^ crc[12] ^ crc[8] ^ data[5] ^ data[4] ^ data[0];
crcout[6] = crc[14] ^ crc[13] ^ crc[9] ^ data[6] ^ data[5] ^ data[1];
crcout[7] = crc[15] ^ crc[14] ^ crc[10] ^ data[7] ^ data[6] ^ data[2];
crcout[8] = crc[15] ^ crc[11] ^ crc[0] ^ data[7] ^ data[3];
crcout[9] = crc[12] ^ crc[1] ^ data[4];
crcout[10] = crc[13] ^ crc[2] ^ data[5];
crcout[11] = crc[14] ^ crc[3] ^ data[6];
crcout[12] = crc[15] ^ crc[12] ^ crc[8] ^ crc[4] ^ data[7] ^ data[4] ^ data[0];
crcout[13] = crc[13] ^ crc[9] ^ crc[5] ^ data[5] ^ data[1];
crcout[14] = crc[14] ^ crc[10] ^ crc[6] ^ data[6] ^ data[2];
crcout[15] = crc[15] ^ crc[11] ^ crc[7] ^ data[7] ^ data[3];
end
endtask
always @(data, crcin)
get_crc(crcout, data, crcin);
endmodule
|