写在前面:
1、本文参考来源PCIe 6.2,2024.02.25
2、仅作为个人学习记录和分享,转载请注明出处
3、个人能力有限,协议的理解均基于个人,如有错误还望指出
4、主要是介绍物理层中Flit的格式以及打包/解包过程
目录
一、简介
首先确定一点:当PCIe链路工作在64.0GT/S或者更高的速率时,其使用的是Flit Mode(FM),并且为1b/1b的编码模式。在FM下,数据在物理层的主要形式为(如图1所示)236Bytes TLP+6Bytes DLLP+8Bytes CRC+6Bytes FEC,其中TLP为Transaction Layer Packet;DLLP为Data Link Layer Packet‘;CRC为Cyclic Redundancy Check,其是根据TLP和DLLP来计算的校验结果,用于对TLP和DLLP的数据保护;FEC为Forward Error Correction,主要是用来解决PCIe数据传输中的First Bit Error Rate(FBER)问题的,同时也是对TLP+DLLP+CRC的保护。
图1 物理层中的FM下的数据格式
在PCIe的每条lane的传输中,以Symbol(8bit)作为基本的传输单元,并且其采用PAM4进行传输。一般来说,我们将一个Symbol,也就是8bit用S7S6S5S4S3S2S1S0来进行表示,其在传输时,虽然以Symbol以基础单位,但是会以两个Sn为单位进行大端传输,也就是S1S0/S3S2/S5S4/S7S6这样的顺序进行传输。PAM4为Pulse Amplitude Modulation 4-level,即四电平脉冲幅度调制,相较于之前版本的PCIe中的NRZ多了两组电平信号,也就是采用4电平信号进行传输,可以传输2bit内容,眼图上来说呈现三眼的状态。一般来讲PAM4虽然传输速率更快但是易受干扰性更高,但是这部分在此不做讨论。
图2 PAM4示意图
FM下的数据打包和解包的过程如图3和图4所示。对发送方来说,首先将236Bytes TLP和6Bytes DLP进行CRC计算,产生8Bytes大小的CRC,然后将236Bytes TLP、6Bytes DLLP和8Bytes CRC进行FEC计算,产生6Bytes大小的FEC。然后在每条lane上分别以Symbol为单位进行1bit的加扰操作,完成后进行2bit的格雷码编码,然后就是做一些发送预编码和PAM4的相关工作并发出。
对接收方来说,基本上就是发送方的逆过程,最终会还原为236Bytes TLP和6Bytes DLP。
图3 64.0GT/s下FM的打包示意图
图4 64.0GT/s下FM的解包示意图
二、数据流
从上文的介绍中可知FM下的数据主要包括236Bytes TLP和6Bytes DLLP(CRC和FEC在此不讨论)
1. TLP Bytes
TLP在Flit的位置为Bytes 0到Bytes 235,如图5所示。在链路层级的重试中只有TLP会被重放,DLLP不会。
图5 Flit数据示意图
一般来说,不管是否有TLP需要传输,Flit对应的内容上都必须被填上TLP。TLP可能被分割到不同的Flit中,也可以在同一笔Flit中填充多个TLP。对TLP Bytes来说,其需要遵循如下规则:
- 使用NOP TLP来填充内容,如果其不存在TLP需要发送的话。但是NOP TLP需要进行4DW对齐,包括其后跟随的正式TLP。
- NOP TLP不消耗Credit
- 对于一般的TLP范围(Bytes 0到Bytes 127喝Bytes 128到Bytes 235)来说,其中不允许包含超过8个TLP,并且允许接收方检查此规则,并且在接收端口的Data Link Protocol Error中进行记录
- 允许通过Flit_status来判断TLP是否被poison或者为无效。如果TLP为无效则需要被接收方丢弃并且释放Credit,此外如果TLP为无效或者被poison,Flit中此TLP之后的内容均由NOP TLP填充
2. DLLP Bytes
Flit下的DLLP包含了6个Bytes,其结构如图6所示。
图6 DLLP Bytes结构
图6中各个域的解释如表1所示
表1 DLLP Bytes域解释
域名 | 位置 | 描述 |
---|---|---|
Flit Usage | DLP0-Bit 7:6 | 00b--IDLE Flit或者NOP Flit 01b--Payload Flit 其他为保留状态 |
Prior Flit was Payload | DLP0-Bit 5 | 0b--曾经是IDLE Flit或者NOP Flit 1b--曾经是Payload Flit |
Type of DLLP Payload | DLP0-Bit 4 | 0b--DLLP Payload 1b--Optimized_Update_FC或者Flit_Marker |
Replay Command | DLP0-Bit 3:2 | 00b--传输Flit的明确的序列号 01b--来自接收方的Ack,表示接收的最后有效的Flit的序列号 10b--需要重放的未确认的Flit的Nak,表示接收的最后有效的Flit的序列号 11b--要重放的单个Flit的Nak,表示接收的最后有效的Flit的序列号 |
Flit Sequence Number | DLP0-Bit 1:0+DLP1-Bit 7:0 | Flit的序列号 |
DLLP Payload | DLP2+DPL3+DLP4+DLP5 | |
Optimized_Update_FC | ||
Flit_Marker |
对接收方来说允许检查Flit Usage的保留值、Flit_Marker中Flit_status(包含Last TLP Nullified和Last TLP Poisoned的状态指示)的编码保留、无效的序列号、违反TLP打包规则错误,并且记录在接收端口的Data Link Protocol Error中。