CRC多项式注意事项和Verilog代码生成

CRC多项式注意事项和Verilog代码生成

  • 前言
  • CRC如何计算
  • CRC 在线生成Verilog

前言

CRC多项式广泛用在通信测试过程中,主要能够快速并且有效的检测数据是否出错,但我在PCIe通信的实际测试中,接近2TB的伪随机数(M序列),在无任何数据保护的措施,也无丢失和错误,说明PCIe通信还是比较可靠。但是为了更好的说明传输的数据的完整性,故想增加CRC校验的方式,出错的TLP包并不重传,仅记录。

CRC如何计算

在网上有许多CRC计算的内容,这一块就不赘述了,但是在看明白计算后还是会发现和实际应用依然有一些不同,这是需要注意的地方

  • CRC的多项式的16进制如何表达?

比如USB 协议 CRC-5 多项式是 x 5 + x 2 + 1 x^5+x^2+1 x5+x2+1

它的二进制应该 100101 也就是 0x25,但是实际表达的时候用的是0x05,因为默认多项式的二进制项最高位是1

再比如CRC多项式 x 4 + x 3 + 1 x^4+x^3+1 x4+x3+1 二进制表达 1 1 0 0 1 但是实际用16进制表达的时候用的是0x09

  • CRC多项式校准的序列要保证首位都是1

比如 0 0 0 1 与 0 0 1 这两个二进制序列得到的CRC余项是相等,所以为了解决这种情况才会有 输入反转 ,输出反转, 输出异或 ,初始值等“预处理措施"。

  • 输入反转 ,输出反转, 输出异或 ,这几个好理解,但是初始值用作什么呢?

    而通常就是初始值,就是导致程序的计算和你手工计算不相等的主要原因。

假设需要计算序列 1 0 0 1 0 0 0 1 的余项,初始值 0x1f,

CRC多项式 x 5 + x 2 + 1 x^5+x^2+1 x5+x2+1

首先计算该序列与初始值作异或运算

1 0 0 1 0 0 0 1

​ 1 1 1 1 1

异或结果:

​ 0 1 1 0 1 0 0 1

如果这个序列(1 0 0 1 0 0 0 1)更长,在这个例子中也只要和最左边5个二进制位异或,也就是从左边起异或(余项长度相同)的长度,得到后的结果在进行常规的模2运算。

CRC 在线生成Verilog

搜索outputlogic.com,输入

  • CRC多项式的16进制的值。
  • 需要一次时钟校验数据的位宽。

就可以得到verilog代码,非常好用!

CRC多项式注意事项和Verilog代码生成_第1张图片
参数:64位的CRC多项式,一次时钟处理128位。
上图是自动生成的verilog代码综合后的图,极其恐怖,前后可能串了100多层,,除非了解优化手段或有其他并行算法,否则看看有没有时序报错,没有直接用就好了。

你可能感兴趣的:(Xilinx,PCIe)