2016-06-17 28 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。這是不太透明的,但它確實有效。