link trainning 通过LTSSM(Link Training and Status State Machine)完成。在这个过程中,可以发现并确定如下:
训练时序由位对齐,符号对齐和交换物理层参数三个部分组成,
TS1和TS2用来传输PCIE链路的配置信息
TS1 Ordered Set的具体符号描述如下
TS2 Ordered Set的具体符号描述如下
在发送器进入电气空闲状态时,必须发送EIOS Ordered Set
EIEOS用作确保能够检测到电气空闲退出状态,当使用128/130b时,还用于块对齐
EIEOS在5.0GT/s的符号格式(8/10b)和8.0GT/s的符号格式(128/130b)如下
gen3的EIEOS数据块格式如下
在training的过程中,TS1和TS2的符号6-15作为链路极性标志,如果极性反转,则
在L0s到L0过渡时用于位锁定和符号锁定,FTS的符号信息如下
作为数据块的开始符号,在 Configuration.Idle, Recovery.Idle, 和 Tx_L0s状态下传输,SDS的符号信息如下
链路错误主要发生在解码错误,帧错误,符号丢失,缓冲区溢出或丢失,块对齐,错误通常发生在L0状态,也会在L0到Recovery上发生。如不在L0状态上发生的链接错误,LTSSM状态机不会转换到Recovery上。
协商的行为主要是先从2.5GT/s上启动Link Training,然后在Training Sequence(TS1/TS2)中可以获取支持的速率大小,然后以2.5GT/s的速率走到L0状态,然后从L0走到Recovery状态,重新开始以新的速率Link Training。
对于pcie的带宽根据pcie的协议版本来决定,同样的pcie的总体带宽根据lane的数量来决定。
对于pcie来说,gen3可以兼容gen1,对于lane来说,可以将x8拆分成x4+x4。
对于pcie的lane顺序来说,lane可以交织,也就是lane0可以接lane3,lane1接lane2,lane2接lane1,lane3接lane0
也就是说,对于pcie3.0 x16来说。可以作为单纯的x16的gen3连接,也可以作为2个x8.或4个x4,或16个x1,同时对于每个lane,都可以是gen3(8GT)或gen2(5GT)或gen1(2.5GT)
LTSSM状态机如下所示
每个阶段的解释如下
对于LTSSM状态机的状态情况下的Link Status如下图
从上图可以知道,例如LinkUp状态,在Configuration时可能是1可能是0,这是指的如果是从detect--->polling--->configuration,则此时是0,到recivery才是1.但是如果是从recovery或其他状态进入configuration,则此时的link up是1
Detect的默认状态从Quiet开始,然后默认以2.5GT/s进行均衡,均衡完成之后,等待12ms超时或电气空闲状态Broken后,进入Active,在进入active后的再一个12ms内检测接收器,如果在lane上接收到Detection Sequence,则进入Polling,否则进入quiet。
发送器先进入Active状态
如果在Configuration状态
其他细节不详述,(见4.2.6.3)如下图所示
Recovery的子状态机如下所示,不详述
L0没有子状态机,如果处于L0,在改变Link Width时进入Recovery,也可以进入L0s,或L1或L2状态。
通过FTS可以进入L0状态
当长时间没有TLP和DLLP时,发送端通知接收端进入L1状态,如果接收端不同意则进入L0s状态,如果同意则进入L1状态
L2状态属于更节能的状态,所以都会重新Detect,与L0,L0s,L1不同的是,它们都是通过Recovery
Disabled没有子状态机,当禁用标志位起来时就是Disabled状态机,如果标志清空,则重新进入Detect
回环通过配置进入,如果退出回环则重新detect,状态机如下
Hot Reset没有子状态机,默认通过控制进入Hot Reset,或者接收两个连续的TS1,并带有Hot Reset标志作为进入Hot Reset
PCIE3.0默认速度在8.0GT/s,为了提高信号的质量,从3.0开始提供了链路均衡。后面每个版本都额外均衡一次。对于PCIE3.0,Tx端发送Rx EQ的均衡设置,Rx做出响应,最终获得一个最优的均衡组合 和眼图(信号质量)
对于pcie而言,先基于2.5GT/s进行传输,然后由一方发送更改速度请求,从而另一方发送均衡请求,进入Recovery状态,进行均衡,最后确定PCIE的速度。其均衡的步骤总共有四步,对于Downstream Port来说有1-3阶段,对于Upstream Port来说有0-3阶段。因为第一个阶段是从DSP发送TS2 Ordered Set给USP做均衡。
当均衡完成,信号从LTSSM状态机的Recovery.RcvrLock,Recovery.RcvrCfg,Recovery.Idel转向L0状态,如下图
整个均衡的过程如下图
对于均衡过程中发送的Presets的格式如下
均衡也是属于LTSSM状态机的开始或组成部分(基于Recovery),对于上电过程,默认先以2.5GT/b的速率从Detect--->Polling--->Configuration--->L0--->Recovery,最后进入Recovery。然后再通过动态链路均衡(上文)来发起调速请求。如下是LTSSM状态机
PCIE的物理层框图如下
对于PCIE的传输编码,如果在pcie1.0和pcie2.0,则使用8/10b的编码,如果是pcie3.0及以上,则使用128/130b传输编码
对于pcie3.0,默认是8GT/s,如果传输编码大于等于8GT/s,则默认使用128/130b编码,如果pcie3.0在L0状态,则默认是2.5GT/s传输,则此时使用8/10b编码。
8/10b编码的作用是为了维持DC平衡,也就是电信号的0和1均匀分布(避免出现5个连续的1或0),8/10b的编码模型只在低于8GT/s下使用,故有必要介绍一下。8/10b的意义在于将8bit的信息按照3bit+5bit分割,填充成4bit+6bit作为10b使用。填充图解如下
这里填充还分为rd+和rd-模式。RD(running disparity),+/-是1的个数减去0的个数.默认选择rd-
其逻辑为,先默认按照rd-编码,如果是完美平衡码,则不变,如果不是,则转换极性作为rd+编码。 例如:D.x.3(011),其对应的4B码字有两种:1100和0011,此时RD为负,则取1100作为其对应的4B码字作为输出,发现是完美编码
再例如D.x.4(100),其对应的4B码字有两种:1101和0010,若此时RD为负,则取1101作为其对应的4B码字作为输出,但不是完美编码,1101的1的个数大于0的个数,则转换成相反极性,故转换极性为rd+,则默认编码为0010
如下图
对于特殊的符号编码,如下可知
上述举例
具体图解如下:
对于TLP,包组成如下,这里物理层会在DLLP的TLP包上追加前缀符号STP和后缀符号END
对于DLLP,包组成如下,这里物理层会在DLLP的包上追加前缀符号SDP和后缀符号END
如果是x1,则物理层按照上述编码即可,如下图
如果是x2,则数据是均匀分布,以TLP包为例,STP在lane0的开头,END在lane1的结束,如图
如果是x4,则如图
在8/10b的编码下,数据发送是先加扰在编码,数据接收是先解码在解扰。加扰解扰是通过LSFR(Linear Feedback Shift Registers)
LSFR计算方式不想明白,这里不介绍了。
128/130b编码是在8GT/s速度以上,也就是pcie最后速度协商在pcie gen3以上启用。
128/130b的编码是在原128b上添加2b的头,H0和H1,类型如下:
与8/10b不一样的是,在多lane的情况下,128/130b会在每个lane上传输H0/H1头,对于每个数据内容,按照小端方式存放
如下是1lane的传输方式
如下是4lane的传输方式
在link training的阶段,可以通过特殊的有序集来判断块对齐,这个特殊的有序集就是电气空闲退出有序集(EIEOS),下面是通过EIEOS来判断对齐状态的逻辑
数据块由Framing Tokens 和 TLPS 和DLLPS组成,它以SDS Ordered Set开始,以SKP Ordered Set结束。
对于Framing Tokens主要有如下几类
上述几类令牌的具体格式如下所示
所以对于TLP和DLLP的整体包格式图如下
如上图,TLP包含STP+TLP Prefix(如有)+TLP Header+TLP Payload+TLP 摘要(如有)+LCRC。 如果一个TLP有3DW的Header,1DW的payload,不包括TLP摘要,则整体TLP的length的长度为6=1(Tokens)+0(TLP Prefix)+3(TLP Header)+1(Payload)+0(TLP digest)+1(LCRC)
对于DLLP则简单了,就是在DLLP上加上SDP的Token,即SDP+DLLP+CRC
对于x8的lane的pcie接口,总包数据传输如下所示
从上面可以知道,对每个lane,H0/H1都是存在的,而Tokens+TLP+DLLP则是均匀遍布在每个lane上。具体为:STP+TLP Header+TLP Payload+LCRC+SDP+DLLP+CRC+IDL+STP....
对于取消TLP是整包示例如下
这里值得注意的是,EDB的Tokens是作为TLP的扩展,它不计算在TLP的lenth字段中,所以TLP包在传输的过程中,会直接带一个EDB作为TLP的取消。
之前提到了SKP作为整个数据库的结束,故如下图展示带SKP Tokens的整包示例
可以看到,在EBS之后,新的包是10+SKP+SKP_END+LSFR。故SKP Ordered Set作为整个数据块的结束
通过LSFR加扰,在128b/130b下,前两位H0/H1不会被加扰,EIEOS Ordered Set,SDS,SKP, EIOS不会加扰,LSFR会在EIEOS发送后加扰(有效数据加扰),在EIEOS接收后解扰(接收器解扰数据)。
数据链路层在事务层下面,它封装了TLP数据包,并加上前缀和后缀,形成了DLLP包。如下是层级关系
DLLP包是完全由硬件完成的
数据链路状态机如下
所有的DLLP包含1dword,前面8bit作为dllp的type,后面作为dllp的type的衍生字段。最后16bit作为crc校验,如下
这里关于dllp type的类型如下
所以根据不同类型的dllp的字段如下
对于数据链路层,先发送了DLLP包出去,里面标明了DLLP的type和DLLP的type对应字段,再加上CRC。然后再发送TLP,这时候的TLP包会包装前缀和后缀,用作标明TLP包的序列号以及TLP的LCRC校验,也就是如下
这里的Sequence ID 和LCRC是对TLP的封装。
所以数据链路层的通信流程如下
这里A是发送者,B是接收者,A会发送TLP包给B,所以B会发送ACK/NAK的DLLP给A接收,这里的DLLP就包含两个部分,一个是1dword+16bit crc的DLLP,一个是包装TLP包加上Sequence和LCRC的完整TLP包。
上面已经知道DLLP包括自定义的DLLP字段以及会在TLP添加前缀和后缀。这里根据文档描述,讲述DLLP的发送和接收流程
NEXT_TRANSMIT_SEQ:存放下一个待发TLP包的序列号,TLP包前缀。 AckNak_Seq_Num:DLLP的ACK/NAK字段,存放最后成功接收TLP的序列号 ACKD_SEQ:存放最近收到的序列号(从DLLP的ACK/NAK返回)
所以先判断下一个待发TLP的序列号,不能大于总Counter(4096)的一半。 如果ACKD_SEQ(存放的序列号)和AckNak_Seq_Num(DLLP的ACK/NAK)不相等,则意味着上一次的包发送成功,开始发下一个包,则清空原来的retry buffer,将新的包的序列号加载到ACKD_SEQ,开始发送,如果接收到ACK,则成功,如果为NAK,则重发。
将NEXT_RCV_SEQ:这里是一个计数器,对TLP包计数加1,用来判断NEXT_TRANSMIT_SEQ和自己是否相等
先计算收到的TLP包的LCRC值,然后判断物理层确定TLP是否有效,再获取这次接收到的TLP包的DLLP的后缀LCRC,判断自己计算的LCRC和DLLP的LCRC是否匹配,最后判断当前TLP包的序列号是否等于NEXT_RCV_SEQ,如果等于,将NEXT_RCV_SEQ自增加1,开始处理TLP包,发送ACK,否则发送NAK。