System verilog 使用CRC32验证以太网数据包
我想计算以太网数据包的crc32,并检查是否收到了正确的数据。我想将crc实现为一个系统Verilog函数。我将使用verilog中的代码来计算数据宽度为8位的crc32。我有以下问题:System verilog 使用CRC32验证以太网数据包,system-verilog,ethernet,crc,crc32,System Verilog,Ethernet,Crc,Crc32,我想计算以太网数据包的crc32,并检查是否收到了正确的数据。我想将crc实现为一个系统Verilog函数。我将使用verilog中的代码来计算数据宽度为8位的crc32。我有以下问题: 在以太802.3标准的情况下,我相信crc是为数据计算的,其中数据={目标地址、源地址、长度和有效负载}。如果数据中有遗漏,请更正 从理论上讲,数据附加了(多项式长度-1)个零,在将数据消息作为输入发送到crc32函数之前,我是否必须附加类似的零 一旦计算了crc,现在我必须知道我收到的数据是否正确。那么,我是
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
函数nextCRC32_D8(字节无符号数据[]);
位[7:0]d;
位[31:0]newcrc,crc,c;
int i;
crc=0;
对于(i=0;i
对
CRC-32算法,无论是在软件还是硬件上,都可以并且被设计为避免在消息中附加零位的数学伪影。我还没有检查你发布的代码的属性
您完全按照传输时所做的操作,即通过有效负载(而不是CRC本身)计算地址上的CRC,然后将其与传输数据包中的CRC进行比较。如果您愿意,您可以通过CRC进行计算,并根据特定的“余数”检查结果值,0xC704DD7B
。该值不太透明,但确实有效
对
CRC-32算法,无论是在软件还是硬件上,都可以并且被设计为避免在消息中附加零位的数学伪影。我还没有检查你发布的代码的属性
您完全按照传输时所做的操作,即通过有效负载(而不是CRC本身)计算地址上的CRC,然后将其与传输数据包中的CRC进行比较。如果您愿意,您可以通过CRC进行计算,并根据特定的“余数”检查结果值,0xC704DD7B
。该值不太透明,但确实有效
(3)的答案是肯定的。@EJP关于(2)呢?关于(3)的答案是肯定的。@EJP关于(2)呢?