前言
- 把PCIe链路比作出租车,电气闲相当于出租车停车熄火,逻辑闲相当于出租车挂空挡。
- 长时间接不到单,为了省油我要熄火,上客后要重新启动热车;
- 临时等客我就挂空挡,上客后挂挡随时走。
1. 电气闲
1.1 电气闲定义
PCIe电气闲是PCIe链路的一种低功耗状态,处于电气闲状态的PCIe链路其差分信号线之间理论上没有电势差(<20mV),链路驱动器处于高阻态。
1.2 有序集
1.2.1 电气闲有序集、序列
电气闲有序集(EIOS)用于通知链路进入低功耗模式。Gen1/Gen2中,EIOS由1COM + 3IDL共4个符号组成;Gen3~5中,EIOS由16个66h符号组成。
电气闲有序集序列(EIOSQ)是由一个或多个EIOS组成的序列。发送速率为5.0GT/s (Gen2)时,EIOSQ由两个连续的EIOS组成,其他速率下(Gen1/3/4/5)EIOSQ由一个EIOS组成。(想想为什么5GT/s时要发送两遍EIOS?是怕接收端接收出错吗?解答见评论区。)
发送器在进入电气闲低功耗模式之前必须给接收器发送电气闲有序集序列,发送器发出有序集后无需等待响应即可进入电气闲,接收器接收到有序集序列后进入电气闲。
➢ EIOS有序集的接收与截断
Gen1/2速率下,EIOS由1个COM和3个IDL组成,接收端在收到1个COM和2个IDL后即可判定为接收到了EIOS。(思考:为什么要提前做出判断?)
Gen3/4/5速率下,EIOS由16个66h组成。若连续发送多个EIOS,除最后一笔EIOS外,之前任何EIOS都必须完整发送16个66h符号。考虑到128b/130b编码时,存在内部时钟边界跟符号边界未对齐的情况,发送器最后一笔EIOS的16个符号未发送完毕便停止发送进入EI状态,称之为EIOS有序集的截断。接收端在收到4个66h符号后即可断定收到了EIOS,EIOS截断并不会导致接收端接收EIOS异常。
1.2.2 电气闲退出有序集
电气闲退出有序集(EIEOS),顾名思义,用于发送器通知接收器退出电气闲。
Gen1(2.5GT/s)没有低功耗状态,即只有发送速率在5GT/s及以上时才会用到EIEOS。
Gen2(5GT/s)速率时,EIEOS由1COM + 14EIE + 1D10.2组成。⚠️EIEOS最后一个符号D10.2虽然是D字符,但是是不做scramble的。Spec之前的版本对这一点解释比较模糊,导致有些设备在实现的时候做了scramble,因此建议在具体实现的时候通融一点,加不加扰都支持。
Gen3/4/5速率是,EIEOS由16个全0或全1的符号组成。
Gen3(8GT/s)速率时,从symbol0开始,1个symbol为1组,相邻组相间发送符号全零00h或全一ffh。即偶数symbol(0/2/4/6/8/10/12/14)上发送00h、奇数symbol(1/3/5/7/9/11/13/15)上发送ffh来表示EIEOS,这样一来能够获得8个0b和8个1b交替的低频pattern。
Gen4(16GT/s)速率时,从symbol0开始,每2个symbol为1组,相邻组相间发送符号全零00h或全一ffh。即symbol0/1/4/5/8/9/12/13上发送00h、symbol2/3/6/7/10/11/14/15上发送ffh来表示EIEOS,这样一来能够获得16个0b和16个1b交替的低频pattern。
Gen5(32GT/s)速率时,从symbol0开始,每4个symbol为1组,相邻组相间发送符号全零00h或全一ffh。即symbol0/1/2/3/8/9/10/11上发送00h、symbol4/5/6/7/12/13/14/15上发送ffh来表示EIEOS,这样一来能够获得32个0b和32个1b交替的低频pattern。
图1 EIEOS有序集
电气闲退出有序集序列(EIEOSQ)是由一个或多个EIEOS组成的序列。目前只有32GT/s速率时EIEOSQ由两个背靠背的EIEOS组成,其他速率由1个EIEOS组成。
1.3 电气闲进入与退出
1.3.1 进入电气闲
发送器发送电气闲有序集告知接收器该链路要进入电气闲状态。发送器在发出电气闲有序集后20UI内应进入电气闲状态,且进入电气闲后至少应持续50UI时间。接收器在收到电气闲有序集中的2个IDLE符号即可进入电气闲状态。处于电气闲状态的链路,由于传输线上没有任何信息传输,接收器PLL无法恢复出时钟信号。
➢ 如何判断进入电气闲?
接收端设备有两种方式来判断是否要进入电气闲:
模拟电路直接检测法,直接根据PHY的模拟电路tx_ei,rx_ei信号直接判断是否进入电气闲状态。
推断法。根据接收到的有序集进行推断,不同传输速率、LTSSM处于不同状体时的推断条件不同,具体如下表所示。
表1 电气闲推断条件
1.3.2 退出电气闲
发送器发送EIEOS、FTS或TS1/TS2有序集以告知接收器该链路即将退出电气闲状态,发送器在发出EIEOS、FTS或TS1/TS2有序集后10UI时间内应进入L0。接收器检测到查分信号线上出现电势差(>60mV),此时接收器PLL能够恢复出时钟信号,并重新开始进行收发器间的位同步、符号同步。
2. 逻辑闲
2.1 逻辑闲定义
在长时间的工作过程中,PCIe链路上显然不会一直发送有效的数据。即便PCIe有能力这么干(一直传输有效数据),发送端主机也很难说一直有活儿给PCIe去干。考虑到收发端通过数据流进行PLL同步,当链路上临时没有数据包要发送时候(链路逻辑闲),发送器继续发送逻辑闲符号(00字符),从而实现维持位锁定和符号锁定的目的。
2.2 逻辑闲序列
逻辑闲序列在所有通路上同时发送。
逻辑闲序列为D类字符,需要经过加扰、编码才能发送。
逻辑闲序列处于包的帧结构之外,即不在STP/EDB或STP/END控制符之间。
发送逻辑闲期间,SKIP有序集也是在周期性发送的。(时钟偏差补偿不能落下啊)
发送完逻辑闲之后,STP/SDP必须放置到symbol0发送,其他情况可以放在symbol0/4/8/12/16等能够被4整除的symbolN上。(想想为社么?提示:逻辑闲在包的帧结构之外)
3. 总结
电气闲与逻辑闲的关系:没啥关系。
电气闲是真的闲,链路上没有数据包在发送,PLL失锁。
逻辑闲是暂时的闲,是在没有数据包要发送时发送的占位符号,目的是保持收发PLL同步。
参考
PCI Express Base Specification Revision 5.0 Version 1.0 (22 May 2019)
PCI Express Technology - Comprehensive Guide to Generation1.x, 2.x and 3.0. Mike Jacson, Ravi Budruk, MindShare, Inc.
PCI、PCI-X和PCI Express的原理及体系结构,马锦明,朱剑冰 等著