0
我想为以太网数据包计算crc32并检查是否收到了正确的数据。我想实现crc作为System Verilog函数。我将使用online crc value generator获取verilog中的代码来计算数据宽度为8位的crc32。我有以下问题:使用CRC32验证以太网数据包
在情况下,以太网802.3标准,相信CRC计算用于数据,其中数据= {目的地址,源地址,长度和有效载荷}。纠正我,如果我缺少数据中的某些东西。
从理论上讲,数据会附加(polynomial_length-1)个零点,在发送数据消息作为crc32函数的输入之前,是否需要类似地追加?
一旦crc计算出来,现在我必须知道我的数据是否正确。那么,我是否必须再次将计算出来的crc值作为crc32函数的输入传递给crc32函数,以检查是否将零作为函数输出,以确保接收到正确的数据,这是正确的吗?如果不告诉我如何检查我是否收到了正确的数据。提前致谢。
下面是我打算使用的crc32函数的SV版本。
function nextCRC32_D8(byte unsigned data[]);
bit [7:0] d;
bit [31:0] newcrc, crc,c;
int i;
crc=0;
for (i=0; i<data.size(); i++) begin
d = data[i];
c = crc;
newcrc[0] = d[6]^d[0]^c[24]^c[30];
newcrc[1] = d[7]^d[6]^d[1]^d[0]^c[24]^c[25]^c[30]^c[31];
newcrc[2] = d[7]^d[6]^d[2]^d[1]^d[0]^c[24]^c[25]^c[26]^c[30]^c[31];
newcrc[3] = d[7]^d[3]^d[2]^d[1]^c[25]^c[26]^c[27]^c[31];
newcrc[4] = d[6]^d[4]^d[3]^d[2]^d[0]^c[24]^c[26]^c[27]^c[28]^c[30];
newcrc[5] = d[7]^d[6]^d[5]^d[4]^d[3]^d[1]^d[0]^c[24]^c[25]^c[27]^c[28]^c[29]^c[30]^c[31];
newcrc[6] = d[7]^d[6]^d[5]^d[4]^d[2]^d[1]^c[25]^c[26]^c[28]^c[29]^c[30]^c[31];
newcrc[7] = d[7]^d[5]^d[3]^d[2]^d[0]^c[24]^c[26]^c[27]^c[29]^c[31];
newcrc[8] = d[4]^d[3]^d[1]^d[0]^c[0]^c[24]^c[25]^c[27]^c[28];
newcrc[9] = d[5]^d[4]^d[2]^d[1]^c[1]^c[25]^c[26]^c[28]^c[29];
newcrc[10] = d[5]^d[3]^d[2]^d[0]^c[2]^c[24]^c[26]^c[27]^c[29];
newcrc[11] = d[4]^d[3]^d[1]^d[0]^c[3]^c[24]^c[25]^c[27]^c[28];
newcrc[12] = d[6]^d[5]^d[4]^d[2]^d[1]^d[0]^c[4]^c[24]^c[25]^c[26]^c[28]^c[29]^c[30];
newcrc[13] = d[7]^d[6]^d[5]^d[3]^d[2]^d[1]^c[5]^c[25]^c[26]^c[27]^c[29]^c[30]^c[31];
newcrc[14] = d[7]^d[6]^d[4]^d[3]^d[2]^c[6]^c[26]^c[27]^c[28]^c[30]^c[31];
newcrc[15] = d[7]^d[5]^d[4]^d[3]^c[7]^c[27]^c[28]^c[29]^c[31];
newcrc[16] = d[5]^d[4]^d[0]^c[8]^c[24]^c[28]^c[29];
newcrc[17] = d[6]^d[5]^d[1]^c[9]^c[25]^c[29]^c[30];
newcrc[18] = d[7]^d[6]^d[2]^c[10]^c[26]^c[30]^c[31];
newcrc[19] = d[7]^d[3]^c[11]^c[27]^c[31];
newcrc[20] = d[4]^c[12]^c[28];
newcrc[21] = d[5]^c[13]^c[29];
newcrc[22] = d[0]^c[14]^c[24];
newcrc[23] = d[6]^d[1]^d[0]^c[15]^c[24]^c[25]^c[30];
newcrc[24] = d[7]^d[2]^d[1]^c[16]^c[25]^c[26]^c[31];
newcrc[25] = d[3]^d[2]^c[17]^c[26]^c[27];
newcrc[26] = d[6]^d[4]^d[3]^d[0]^c[18]^c[24]^c[27]^c[28]^c[30];
newcrc[27] = d[7]^d[5]^d[4]^d[1]^c[19]^c[25]^c[28]^c[29]^c[31];
newcrc[28] = d[6]^d[5]^d[2]^c[20]^c[26]^c[29]^c[30];
newcrc[29] = d[7]^d[6]^d[3]^c[21]^c[27]^c[30]^c[31];
newcrc[30] = d[7]^d[4]^c[22]^c[28]^c[31];
newcrc[31] = d[5]^c[23]^c[29];
end
return newcrc;
endfunction
对(3)的回答是肯定的。 – EJP
@EJP(2)呢? –