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)呢? –