第2章 PCIe物理层详解:差分信号对、LTSSM、速率编码与眼图测试

各位同学,大家好。今天我们聊聊PCIe物理层。说实话,很多工程师做PCIe调试,一上来就盯着事务层或者数据链路层抓包,结果发现链路都还没稳定——问题其实出在物理层。我个人习惯,拿到一块PCIe板子,先看物理层有没有跑通,再看别的。

物理层是PCIe最底层的基础。它负责把数据变成电信号,从发送端传到接收端。说白了,就是解决“怎么把0和1从A点搬到B点”的问题。这一章我们重点讲五个核心知识点:差分信号对、链路训练状态机(LTSSM)、各代速率与编码差异、以及眼图测试基础。

2.1 差分信号对(Tx/Rx)

PCIe物理层用的是差分信号传输。什么是差分信号?简单说,就是用两根线传一个信号。一根传正相,一根传反相。接收端看的是两根线的电压差。

为什么要这么麻烦?抗干扰能力强。你想想看,外部噪声来了,两根线上受到的干扰几乎一样,一相减,噪声就被抵消了。我在项目中遇到过一块板子,单端信号串扰严重,换成差分对之后,问题直接消失。

PCIe的每个Lane包含两组差分对:一组发送(Tx+ / Tx-),一组接收(Rx+ / Rx-)。注意,Tx和Rx是分开的,全双工工作。也就是说,发送和接收可以同时进行,互不干扰。

关键点:差分对的PCB布线要求等长、等宽、紧耦合。我见过不少新手,差分对走线一长一短,结果信号质量一塌糊涂。记住,差分对内的两根线,长度差不要超过5mil。

2.2 链路训练状态机(LTSSM)

链路训练状态机,英文叫LTSSM(Link Training and Status State Machine)。这是PCIe物理层最核心的状态机。它负责上电后把链路从“死”状态一步步带到“活”状态。

LTSSM有十几个状态,但常用的就几个:

  • Detect:检测对端有没有设备。发送检测信号,看有没有回应。
  • Polling:尝试建立基本连接。交换训练序列。
  • Configuration:协商链路宽度和速率。比如,两端都支持x4,那就用x4。
  • L0:正常工作状态。数据可以传输了。
  • L0s / L1:低功耗状态。省电用的。
  • Recovery:链路出错了,尝试恢复。

嗯,这里要注意:LTSSM的每个状态都有超时机制。如果某个状态卡住了,比如一直停在Polling,那链路就起不来。我曾经调试过一块FPGA板卡,上电后链路死活不亮,抓逻辑分析仪一看,LTSSM卡在Detect状态——原来是PCB上有一根差分线虚焊了。

调试技巧:用逻辑分析仪抓LTSSM状态跳转,是定位物理层问题的利器。我习惯先看Detect到Polling的跳转是否正常,再看Configuration阶段协商出的宽度和速率对不对。

2.3 Gen1/Gen2/Gen3/Gen4/Gen5 速率与编码差异

PCIe从Gen1到Gen5,速率翻倍增长。但编码方式也在变。我们直接看表格:

代际 单通道速率 编码方式 有效数据率
Gen1 2.5 GT/s 8b/10b 2.0 Gbps
Gen2 5.0 GT/s 8b/10b 4.0 Gbps
Gen3 8.0 GT/s 128b/130b 7.877 Gbps
Gen4 16.0 GT/s 128b/130b 15.754 Gbps
Gen5 32.0 GT/s 128b/130b 31.508 Gbps

看到没?Gen1和Gen2用的是8b/10b编码。什么意思?每传8位有效数据,实际要发10位。多出来的2位用于直流平衡和时钟恢复。开销是20%。

到了Gen3,编码改成128b/130b。每128位有效数据,只加2位开销。效率从80%提升到98.46%。为什么能改?因为Gen3引入了加扰(Scrambling)技术,不再需要8b/10b那种复杂的直流平衡机制。

我个人觉得,Gen3是一个分水岭。从Gen3开始,物理层设计难度陡增。速率高了,编码效率高了,但对信号完整性的要求也高了。我在调试Gen3链路时,经常遇到因为PCB走线阻抗不匹配导致的误码问题。

注意:Gen3及以上的128b/130b编码,对时钟恢复电路(CDR)要求更高。如果CDR锁定不好,链路会频繁进入Recovery状态。我曾经遇到一个案例,板卡在Gen3下频繁断链,降级到Gen2就稳定了——最后发现是参考时钟抖动超标。

2.4 眼图测试基础

眼图是什么?说白了,就是把很多个比特的波形叠加在一起,看信号质量。好的眼图,眼睛睁得又大又圆。差的眼图,眼睛眯成一条缝,甚至闭着。

眼图测试是物理层调试的必备手段。我每次拿到新板子,第一件事就是上示波器看眼图。主要看几个指标:

  • 眼高(Eye Height):眼睛垂直方向的开度。太小了说明噪声大或者幅度不够。
  • 眼宽(Eye Width):眼睛水平方向的开度。太小了说明抖动大。
  • 抖动(Jitter):信号边沿的随机偏移。分随机抖动和确定性抖动。
  • 占空比失真(DCD):高电平和低电平的宽度不一致。

举个例子,Gen3的速率是8 GT/s,一个UI(单位间隔)只有125ps。你想想看,125ps里要完成信号跳变、稳定、采样,对PCB和连接器的要求有多高。我见过一块板子,因为连接器阻抗不连续,眼图几乎闭合,链路根本跑不到Gen3。

实战建议:眼图测试时,建议用示波器的时钟恢复功能,而不是外部触发。因为PCIe的时钟是内嵌在数据流里的,用CDR恢复出来的时钟做眼图,才更接近实际接收端看到的情况。

2.5 避坑指南与个人经验

最后,分享几个我踩过的坑:

  • 差分对等长:我曾经有一块板子,差分对长度差了30mil,结果Gen2都跑不稳。后来重新布线,控制在5mil以内,问题解决。
  • AC耦合电容:PCIe的Tx端必须串AC耦合电容,通常是100nF。我见过有人用错了电容值,导致低频分量丢失,链路训练失败。
  • 参考时钟:PCIe的参考时钟(100MHz)质量直接影响眼图。抖动太大的时钟,会让眼图变差。我建议用频谱仪看时钟的相位噪声。
  • LTSSM超时:如果链路训练卡在某个状态,先检查硬件连接,再检查软件配置。有时候是BIOS里没开对应的PCIe端口。

好了,这一章的内容就到这里。物理层是PCIe的基石,搞懂了差分信号、LTSSM、速率编码和眼图,你就能解决80%的物理层问题。下一章我们讲数据链路层,看看TLP包是怎么封装和校验的。

记住,调试PCIe,从物理层开始。别一上来就抓事务层包,先看看你的眼图睁没睁开。