参考大佬:https://blog.csdn.net/zhuzongpeng/article/details/78995340
PCIE硬核内部使用了Serdes实现了高速数据传输,在可以正常通讯之前必要要进行链路初始化与训练(Link initialization & training),链路初始化与训练是完全有FPGA内部IPcore自己完成的(链路初始化与训练类似于xilinx selectIO 调节Tap和bitslish),理论上用户不需要做处理(是否有操作详见IPcore规格书)。LTSSM在PCIE结构中位置
3
LTSSM状态机涵盖了11个状态,包括Detect,Polling,Configuration,Recovery,L0,L0s,L1,L2,Hot Reset,Loopback,Disable,逻辑转换关系如下
这11个状态大致可以分成4大类。Detect->Polling->Configuration->L0. L0是PCIe链路可以正常工作收发TLP包的状态。
Detect
检测原理:通过集成在发送器Transmitter中接收器检测receiver detection电路实现,电路的功能在于检测接收器等效对地阻抗Zrx是否在40~60Ω之间,当对端设备灭有插入或者PCIE链路芯片在复位或者为上电等异常状态下其阻抗也会呈现开路状态。
这是物理层的初始状态,仅在Gen1 2.5 GT/s速率下使用,或是从数据链路层转换而来,或是在reset之后,或者从其他状态(Disable, Polling, Configuration,Recovery等)转换。总之,Detect状态是PCIe链路训练的开端。因为在这个状态时,发送端TX需要检测接收端RX是否存在且(TX和RX是相对的,连接的两个设备都相互检测)可以正常工作,如果检测正常,才能进入其他状态。Detect状态主要包含了两个子状态:Detect.Quiet和Detect.Active.
1)从其他状态或者Reset之后,处于Detect.Quiet,TX处于Electrical Idle状态(Electrical Idle状态指的是发送器D+和D-保持在同一个恒定电平下,接收器差分信号两端电压都是0V),LinkUP清零。当超过12ms或者所有Lane均退出Electrical Idle时,则从Dectect.Quiet转换进入Detect.Active。
(2)Detect.Active在这个状态Detect.Active就会开启检测RX工作。判断RX是否存在就是通过Detect logic电路比较RC时间常数的大小: RX不存在,RC时间常数比较小,反之,RC时间常数比较大。如果所有的未配置Lane都检测到接收器的存在,设备立马进入Polling状态。如果所有Lane都没有检测到接收器存在则进入Detect.Quiet状态(一个Lane指的是一组发送差分信号和一组接收差分信号)。一个Lane检测到了设备在位,但也有未配置的Lane未检测到接收器在位。此情况下回首先等待12ms,然后再次进行接收器在位检测。如果检测结果与上次一致,且检测到在位的Lane可以组成1个或多个Link,则设备进入Polling状态。(那么如何判断能否组成Link呢?这主要看设备的特性。Link指的是设备到设备的一个链接,一个Link可以是X4链路宽度,则指的是4个Lane组成该链路。如果一个设备有4个Lane,那么一种可能其只支持1个Link,即只有一个控制器,此时若只有Lane 0检测到接收器在位,那么可以形成一个X1宽度的Link,而若只有Lane 1检测到接收器在位,那么久无法形成Link,设备就会退回到Detect.Quiet子状态。如果这个设备支持4个Link,那么设备就可以协商成4个X1的链路,此时只有Lane 1检测到接收器在位也可行形成1个Link,设备会进入Polling状态。链路两端的设备LTSSM是独立运行的,所以有时两端设备所处的状态会出现不一致的现象。例如上文的例子,链路两侧的设备都是X4且都检测到了Lane 1接收器在位,但是一个只支持1个Link而另一个可以支持4个Link,此时现象回事一个回到Detect.Quiet子状态而另一个会进入Polling状态。两个设备的训练状态机会独立运行同时又互相影响,因此常常需要从两个角度去分析才能找到定位问题的线索)
只有TX和RX所有lane均检测到对端存在设备,则进入Polling,其他没有检测成功的lane进入Electrical Idle,一条lane也没有则回到Quiet。
Detect可能遇到的问题
各种原因导致连接断开或者连接不良会导致Delect出现异常,使得链路卡在Detect状态。表现在数据链路上是发送信号线上都是0V电平或者24ms间隔的脉冲信号(24ms是由Detect.Quiet子状态的12ms超时和Detect.Active状态中等待12ms组成)。
1、物理连接
这种情况多数是电容失效导致的,失效后短路、断路或容值偏移都会导致检测不到对端在位;另外连接器装配、芯片焊接不良也有可能出现此现象
2、对端设备处在复位或断电状态下,或是PCIe控制器未配置或使能,则会检测不到接收器在位。在FPGA使用PCIe IP核的情况下,大量配置需要编程人员调整。其中检测接收器在位的阈值寄存器在默认值不合理的情况下则会导致误判为接收器不在位。默认值是经过大量验证的,一般情况下不会出现这种情况。
当出现Detect相关问题,首先排除两端电源,复位,时钟状态。其实排查链路是否有失效器件或者连接器问题。当都难以判断的时候是可以尝试在耦合电容连接接收器的一侧接50Ω电阻到GND,若此时设备可以通过Detect到达Polling状态或之后的状态,则基本可以确定问题在对端设备或是耦合电容之后的链路中。在耦合电容后接电阻到GND后,可以保证在位检测电路可以正常检测到接收器在位,因此若设备正常则会进入到下一个状态。反之如果操作之后还是卡在Detect状态,则需要仔细排查本端设备的问题。
Polling
进入这个状态后,TX和RX之间通过发送TS1、TS2和OS序列来确定Bit Lock、Symbol Lock和Lane极性反转问题。
Bit Lock: 在Bit传输过程中,RX PLL锁定TX Clock频率,这个过程称为RX实现"Bit Lock"。
Symbol Lock: RX端串并转化器知道如何区别一个有效的10-bit Symbol,这个过程称为“Symbol Lock”. 这里用到的是COM控制符。
Polling状态主要包含了三个子状态:Polling.Active, Polling.Configuration, Polling.Compliance.
Polling.Active::这是从这是链路从Detect退出后进入的状态,在这个状态下,发送端需要在所有Lane至少发送1024个TS1序列,因为接收端需要通过接收到的TS1序列来实现Bit/Symbol Lock. 由于发送端和接收端不是同时退出Detect状态,所以,TS1序列交流可能不会同步。此时,链路出于Gen1(2.5GT/s), Symbol time=4ns(10b/2.5Gb/s), 发送1024个TS1序列(16 symbols)至少需要64us(1024*16*4ns).
Polling.Configuration: 当发送端TX发送完至少1024个TS1并且接收端RX连续收到8个TS1或者TS2,此时TS1和TS2中的Link/Lane区域由PAD填充, 那么,链路进入Polling.Configuration状态。处于此状态,发送端停止发送TS1序列,改为发送TS2序列,此时Link/Lane区域仍然由PAD填充,这个过程也会完成极性反转的问题,为进入下一个状态作准备。
Polling.Compliance: 这个状态主要是通过发送不同的Pattern来测试发送端以及设备连接是否符合Spec要求。
Configuration
这个状态工作就是通过发送TS1、TS2来确定Link/Lane number。
Link Number Negotiation:Downstream在TS1中设定Link number, 此时Lane number=PAD,并发送给Upstream. 而Upstream回的第一个TS1中,Link num仍然是PAD。此时,Upstream也处于Configuration.LinkWidth.Start状态。之后Upstream回的TS1中Link number则是设定值,此时, Upstream率先进入Configuration.LinkWidth.Accept状态。到这里,Link Number Negotiation就完成了。
Lane Number Negotiation:当Downstream看到Upstream返回的TS1中Link number已经是设定值,那么就认为Link num已经协商成功,然后就开始准备设定Lane number,此时Downstream链路也接着进入Configuration.LinkWidth.Accept状态. 由于在录这个Trace时有过滤重复的TS序列,所以,我们看到一个TS1序列对应了三个状态:Configuration.LinkWidth.Accept,Configuration.LaneNum.Wait,Configuration.LaneNum.Accept. 这个三个状态发送的TS1序列一样,Link number和Lane number都已设定。当Upstream收到Downstream设定Lane number的TS序列之后,也很快进入了Configuration.LaneNum.Accept状态。
Confirm Lane/Link Number:双方通过发送TS2序列,对之前设定的Link/Lane number进行确认,这个过程,LTSSM处于Configuration.Complete. 确认没有问题之后,就准备进入下一个状态L0。
L0
进入这个状态时,PCIe链路就可以愉快的开始正常工作了。这个状态可以传输TLP,DLLP等报文。
LTSSM其他状态可以去看看文章刚开始大佬的链接