PCIe PHY layer:Link training过程的LTSSM状态机跳转

  1. TS(Training Sequences)用于初始化bit align,symbol align,exchange PHY parameter。TS1主要检测PCIe链路配置信息,TS2确认TS1的检测结果
  2. EIOS(Electrical Idle Ordered Set Sequence),Tx进入Electrical Idle之前,必须发送EIOS,Electrical Idle状态下Tx差分电压接近0mV
  3. EIEOS(Electrical Idle Exit Ordered Set),在发TS1之前或linking training过程中会时不时发送一段低频的IEOS,用于Rx端的Electrical Idle exit circuitry可以检测到电路离开Electrical Idle状态
  4. FTS(Fast Training Sequence)序列主要使接受Rx重新获得bit/symbol lock
  5. SKIP序列,进行时钟补偿,补偿300ppm的漂移,PHY发送一定数量个字符之后必须发送SKIP序列,Elastic Buffer收到SKIP序列之后要补偿相差
  6. Receiver Detect序列,用于识别Rx是否上电,因为Rx上电阻抗50欧姆,不上电则有kΩ级别,发送一个脉冲波形,通过检测电流大小能检测到对端是否有设备
  7. Link Training and Status State Machine (LTSSM)
    PCIe PHY layer:Link training过程的LTSSM状态机跳转_第1张图片
  8. Detect:检测远端阻抗以确定是否有设备
    a) Detect.Quiet时,Tx处于Electrical Idle状态,LinkUp清0,以及其他复位动作
    b) 只要有lane退出Electrical Idle,就进入Detect.Active,此时双方检测对端阻抗,确定是对端否有设备
    c) 只要有某条/几条lane的双方均检测到对端有Rx,则进入Polling,其他没有检测成功的lane进入Electrical Idle,一条lane也没有则回到Quiet
    PCIe PHY layer:Link training过程的LTSSM状态机跳转_第2张图片
  9. Polling:发送和回复TS,bit lock,symbol lock,lane polarity在此阶段确定
    a) Polling.Active,Tx向对端发送1024个TS1(其中lane/link number均填为PAD),对端Rx接收到TS1后通过其Loopback发送回来
    b) 当我的Rx收到8个连续的TS1(compliance位为0,或Loopback位为1)或者收到8个TS2(可能两端设备LTSSM不同步,对方设备已经进入Polling.Configuration状态),这3种情况下我就进入Polling.Configuration
    c) Polling.Configuration:此时我的TX发送TS2(lane/link number为PAD,linkup为0
    d) 当我在Polling.Configuration时收到8个连续的TS2,并且在收到一个TS2之后再发出去16个TS2之后进入Configuration状态
    e) Polling.Active时发送的TS1序列为RX经loopback在由TX发出去的,所以收到的TS1和准备发送的TS1相同,而且两端设备异步发TS1;而Polling.Configuration是对端设备重新生成的序列,当两端设备都收齐TS2序列后,将基本同步进入Configuration状态。从这个角度说TS2序列是为了同步“异步发送的TS1”
    f) 另外还有Polling.Compliance(做均衡)/Polling.Speed(切速率)等子状态,很多设备不支持
    PCIe PHY layer:Link training过程的LTSSM状态机跳转_第3张图片
  10. Configuration:Rx/Tx协商link number,lane number,当recovery出现错误没有进入L0也可能先进Configuration
    a) 首次从Polling进入Configuration时LinkUp=0,从recovery进入该状态是LinkUp=1
    b) Configuration.Idle时,PCIe链路设置完毕,当收到对端8个Idle序列并且向对端发送16个Idle序列之后将LinkUp值1,数据链路层从DL_Inactive进入DL_Init,物理层进入L0
    PCIe PHY layer:Link training过程的LTSSM状态机跳转_第4张图片
  11. Recovery:用于切换data rate,或者从L0经过Recovery.Rcvrlock再到Configuration去切换link width,此时bit lock,symbol lock,block alignment会重新建立
    a) 如果设备希望切速率,系统软件置directed_speed_change=1,然后进入Recovery.Rcvrlock,同时向对端发送TS1(link/lane number都是之前协商好的值,speed change bit为1)
    b) 对端接到8个speed change bit=1的TS1之后也发送speed change bit=1的TS1
    c) 两个设备发送TS1的同时检测接收的TS1,如果连续收到8个TS1或TS2(对端已经进入rcvrcfg),并且speed change bit与directed_speed_change位相同,则进入recovery.rcvrvfg
    d) Recovery.rcvrcfg:发送TS2序列进行同步(与polling.configuration阶段相同,TS2来同步两端的设备都进入xxxxcfg阶段)。通过比较speed_change位与directed_speed_change位是否相同,决定进入recovery.speed还是recovery.idle
    e) 如果标志位都是0表明切换过速率了,就进入recovery.idle,反之进入speed状态
    f) Recovery.idle之后进入L0或其他状态
    g) 另外recovery.equalization子状态又有3个Tx equalization子状态
    h) L0进Recovery之后进configuration切换link width的情况有
    i. 设备在L0时希望切宽度,系统软件置upconfigure_capable=1,设备进入recovery.rcvrlock,并且检测到directed_speed_change=0,说明是设备向切宽度而不是速度,然后进入configuration
    ii. Recovery.rcvrcfg时TS2的lane/link number不一致,会进入configuration
    PCIe PHY layer:Link training过程的LTSSM状态机跳转_第5张图片
  12. L0:正常工作状态,此时才会有TLP。L0进入recovery有5种情况
    a) 当两端都支持高速率,并且系统软件将directed_speed_change置1
    b) 想切link宽度,系统软件置upconfigure_capable=1,
    c) 正常工作的lane中又收到对端发送TS1/TS2,说明对端想改速度或者宽度并进入recovery了;或者对方发EIOS进入Electrical Idle,
    d) 任意一条lane都没有收到EIOS,但是推断对方所有lane都进入了Logical Idle状态。If Electrical Idle is detected/inferred on all Lanes 40 without receiving an EIOS on any Lane,
    e) Link errors:Framing Errors, loss of Block Alignment, Elasticity Buffer Overflow/Underflow, or loss of Lane-to-Lane de-skew会导致LTSSM从L0跳转到Recovery
    f) 在PCIe链路中,只要一方进入recovery,对方就会收到TS1,两端都将进入recovery
  13. L0s/L1/L2:省电模式
  14. Disabled/Loopback/Hot Reset等其他状态
  15. 一些重要的点
    a) Link Width协商只存在于Configuration阶段,Recovery/L0无法改变;
    b) Link Speed在Polling阶段都是2.5G,只会在Recovery阶段发生变化;
    c) 切速度只会在recovery阶段,切宽度只会在configuration阶段
    d) LinkUp状态位在首次进入Configuration状态为0,之后Recovery/L0以及再次进入Configuration都是1;
    e) Link training在Configuration/Recovery阶段为1,其他阶段为0

你可能感兴趣的:(集成电路,PCIe)