Я хочу рассчитать crc32 для пакета ethernet и проверить, получили ли я правильные данные. Я хочу реализовать crc как функцию System Verilog. Я буду использовать online crc value generator, чтобы получить код в verilog для вычисления crc32 с шириной 8 бит. У меня есть следующие вопросы:Использование CRC32 для проверки пакета ethernet
В случае, стандарта Ethernet 802.3, я считаю, CRC вычисляется для данных, где данные = {адрес назначения, адрес источника, длина и полезной нагрузки}. Исправьте меня, если я что-то упустил в данных.
Теоретически, данные добавляются в число (нуль) числа (polyomial_length-1), нужно ли добавлять аналогично перед отправкой сообщения данных в качестве входа в функцию crc32?
Как только вычисляется crc, теперь я должен знать, правильно ли получены мои данные. Итак, нужно ли передавать данные вместе с вычисленным значением crc в качестве входа в функцию crc32 еще раз, чтобы проверить, получаю ли я нули в качестве вывода функции, чтобы обеспечить получение правильных данных, правильно ли это? Если не сообщите мне, как проверить, получили ли я правильные данные. Заранее спасибо.
Ниже представлена версия SV-функции crc32, которую я намерен использовать.
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)? –