2016-06-17 8 views
0

Я хочу рассчитать crc32 для пакета ethernet и проверить, получили ли я правильные данные. Я хочу реализовать crc как функцию System Verilog. Я буду использовать online crc value generator, чтобы получить код в verilog для вычисления crc32 с шириной 8 бит. У меня есть следующие вопросы:Использование CRC32 для проверки пакета ethernet

  1. В случае, стандарта Ethernet 802.3, я считаю, CRC вычисляется для данных, где данные = {адрес назначения, адрес источника, длина и полезной нагрузки}. Исправьте меня, если я что-то упустил в данных.

  2. Теоретически, данные добавляются в число (нуль) числа (polyomial_length-1), нужно ли добавлять аналогично перед отправкой сообщения данных в качестве входа в функцию crc32?

  3. Как только вычисляется 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 
+0

Ответ на (3) - да. – EJP

+0

@EJP как насчет (2)? –

ответ

2
  1. Correct.
  2. Алгоритмы CRC-32, как в программном, так и в аппаратном обеспечении, могут быть и разработаны, чтобы избежать математического артефакта добавления нулевых битов в сообщение. Я не проверял ваш опубликованный код для этого свойства.
  3. Вы выполняете именно то, что было сделано при передаче, которое должно вычислять CRC по адресам через полезную нагрузку (и не на самом CRC), а затем сравнить это с CRC в переданном пакете. Если вам нравится, вы можете вычислить весь путь через CRC и проверить результат на конкретное значение «остаток», 0xC704DD7B. Это менее прозрачно, что происходит там, но оно действительно работает.

 Смежные вопросы

  • Нет связанных вопросов^_^