[FPGA 实现及PCIe IP 核知识点] PCIe为什么要增加Precoding?

(本文将根据PCIe Spec Gen5 对Precoding模块进行功能验证)

从PCIe Gen5开始,标准引入了一项新的功能:Precoding。虽然标准本身并没有解释为什么需要增加该功能,但根据PCISIG在Training中的一些解释,Precoding可以有效的降低Burst errors(突发连续)的影响。

1.png

PCIe的接收端通过EQ TS2请求对端TX打开Precoding,当data rate低于32.0 GT/s的时候,发送端TX将不打开Precoding。当Precoding 打开后,所带来的不良影响是Bit Error Rate(BER)将上升为之前的两倍。

那么Precoding是如何帮助到Burst Error,又是为何会double BER呢?

我们可以从Precoding的工作原理入手。如上图所示,在发送端,当Precoding打开后,从加扰器(Scrambler)送出来的bit,不直接由TX发送出去,而是与前一个bit进行异或再发送。对于没有前一个bit的第一个bit,则与1进行异或。我们可以通过下图来表示整个过程:

2.png

图中,我们以0xB4举例,其二进制bit stream为’1011_0100’,其中最右边的bit0最先发送。Bit0的原始数据是0,由于是第一个发送的bit,所以没有前一个bit的信息,这时候原始bit0的0与1进行异或得到1。这是通过precoding后的第一个bit,然后该bit被用作与原始bit1的异或,以此类推。最终0xB4通过precoding后会得到0x93。

如果链路上没有发生任何的错误,那么接收端也将获得0x93的信息,那么该bit stream也需要通过接收端的precoding模块,该模块与发送端不同,具体线路可以参考图1,计算过程如下图所示:

3.png

如上图所示,0x93的二进制bit stream为’1001_0011’,其中最右侧的bit0是第一个收到的bit。其计算逻辑是接收到的bit与前一个接收到的bit进行异或。但接收到的bit0之前没有收到任何bit,所以这里规定与1进行异或得到0。接下来到接收到的bit1就可以与接收到的bit0进行异或了,得到结果作为通过该precoding模块的bit1的结果。以此类推,你将得到整个8bit的结果,正好与发送的信息一致。如果发送的bit多于8,只需要将该过程一直执行下去即可。

当你已经掌握了precoding在发送端和接收端的基本工作原理以后,你就可以设计一个完整的precoding仿真模型。通过该仿真模型,我们可以比较容易的了解precoding的能力。该模型的整体思路如下:

用户输入原始的十六进制数(例如4位十六进制数)

模型将4位十六进制数转换成16-bit的二进制bit stream

模型将二进制bit stream,通过TX Precoding模块转换成实际TX 发送的bit stream

模型提供两种bit error注入方法,分别为XOR和Override

XOR将会把置1的位置bit翻转

Override会根据Mask信息将置1的位置替换成Overridge的信息

模型接收端接收到的bit stream将是通过了其中一种错误注入后的bit stream

模型将接收到的bit stream通过RX precoding模块转换成最终的数据。

为了方便起见,我们可以采用Excel来完成模型开发,如下图所示:

4.png

实验一:

我们发送的是0xB4B4,得到的也是0xB4B4,所以当发送的bit stream和接收到的bit stream一致的时候,数据可以很好的还原。

实验二:

当我们翻转bit stream中的1个bit,例如bit7,如下图所示:

5.png

从结果看,通过接收端precoding模块后,还原的数据信息错了两个bit,分别是bit7和bit8。这也是为什么说开启precoding后会double BER的原因。

实验三:

如果我们连续翻转4个bit,例如从bit7一直到bit10,如下图所示:

6.png

神奇的事情发生了,当链路上的bit stream被连续翻转多个bit后,实际接收端通过precoding模块后,出现翻转的bit下降到了两个,分别是bit7和bit11。这就是为什么precoding可以降低burst error影响的原因。

实验四:

如果我们直接覆盖掉bit7到bit11的值全是1,如下图所示:

7.png

从结果看,还是和之前的结论一致,override了以后,主要看究竟翻转了哪些bit,在本实验中,由于bit7-bit10本身就是1,所以实际的翻转发生在bit10,所以由bit10衍生了两个bit的error。

文章最后,可能大家会有疑虑,什么时候才会产生burst error?这个需要先了解接收端的一个常用模块DFE(Decision Feedback Equalizer)的工作原理。由于篇幅有限,这里给出一些结论,通常类似0101的时钟pattern比较容易使得DFE产生burst error。否则,在不考虑DFE误动作的影响下,链路上比较常见的error还是Override类型的error,至于会override几个bit就要看真实的链路质量了。

Reference:

PCI Express® Base Specification Revision 5.0 Version 1.0
https://pcisig.com/sites/default/files/files/PCI-SIG-Seamless_Transition_to_PCIe_5.0_in_System_Implementations_FINAL.pdf

编辑 重设标签(回车键确认) 标为违禁 关闭 合并 删除
匿名用户

匿名