2016-06-17 165 views
0

我想为以太网数据包计算crc32并检查是否收到了正确的数据。我想实现crc作为System Verilog函数。我将使用online crc value generator获取verilog中的代码来计算数据宽度为8位的crc32。我有以下问题:使用CRC32验证以太网数据包

  1. 在情况下,以太网802.3标准,相信CRC计算用于数据,其中数据= {目的地址,源地址,长度和有效载荷}。纠正我,如果我缺少数据中的某些东西。

  2. 从理论上讲,数据会附加(polynomial_length-1)个零点,在发送数据消息作为crc32函数的输入之前,是否需要类似地追加?

  3. 一旦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 
+0

对(3)的回答是肯定的。 – EJP

+0

@EJP(2)呢? –

回答

2
  1. 正确。
  2. CRC-32算法,无论是在软件和硬件,都可以被设计来避免在消息中附加零位的数学假象。我没有检查你的发布代码的财产。
  3. 你完成的是传输过程,即通过有效负载计算地址上的CRC(CRC本身上的而非),然后将其与传输数据包中的CRC进行比较。如果你愿意的话,你可以计算通过CRC的所有方式,并根据特定的“残差”值检查结果,0xC704DD7B。这是不太透明的,但它确实有效。