3、PCIe物理层SI设计:PCIe Gen3/4/5的电气特性、眼图模板、抖动分析
各位好,咱们接着聊PCIe的物理层。前面讲了协议和拓扑,今天要啃的这块骨头,是真正决定你的板子能不能跑起来的关键——电气特性、眼图模板和抖动分析。
说实话,PCIe从Gen3开始,信号速率直接翻倍到8GT/s,到了Gen5更是飙到32GT/s。这个速度下,信号在PCB上走几英寸,眼图就可能闭了。我当年第一次调Gen3的时候,以为跟Gen2差不多,结果板子打回来,眼图惨不忍睹……嗯,从那以后,我再也不敢轻视物理层设计了。
3.1 电气特性:从Gen3到Gen5的演进
先看一张表,把三代标准的电气参数对比一下,心里有个底。
| 参数 | PCIe Gen3 (8 GT/s) | PCIe Gen4 (16 GT/s) | PCIe Gen5 (32 GT/s) |
|---|---|---|---|
| 比特率 | 8.0 GT/s | 16.0 GT/s | 32.0 GT/s |
| 编码方式 | 128b/130b | 128b/130b | 128b/130b |
| 差分摆幅 (Vpp-diff) | 0.8 ~ 1.2 V | 0.4 ~ 1.0 V | 0.3 ~ 0.8 V |
| 去加重 (De-emphasis) | -3.5 dB / -6 dB | 可编程 (最高 -12 dB) | 可编程 (最高 -15 dB) |
| CTLE 范围 | 0 ~ 12 dB | 0 ~ 18 dB | 0 ~ 24 dB |
| 参考时钟抖动 (RMS) | < 1.0 ps | < 0.5 ps | < 0.3 ps |
看到没?速率越高,摆幅反而越小。为什么?因为高频下,大摆幅带来的功耗和串扰问题更严重。Gen5的差分摆幅最低只有0.3V,信号跟蚊子腿似的,稍微有点噪声就没了。
我个人习惯,设计Gen4/5的时候,第一件事就是看链路预算。从发送端到接收端,PCB损耗、连接器损耗、过孔损耗,一项项算清楚。我曾经有个项目,Gen4链路长了2英寸,结果眼高直接掉了40%。后来加了中继器才救回来。
3.2 眼图模板:合格与不合格的分界线
眼图模板,说白了就是一把尺子。你的信号眼图必须完全落在模板外面,才算合格。
PCIe的眼图模板,主要看两个指标:眼高 (Eye Height) 和 眼宽 (Eye Width)。
- 眼高:信号在垂直方向上的开度。Gen3要求≥100mV,Gen4要求≥50mV,Gen5要求≥25mV。
- 眼宽:信号在水平方向上的开度。Gen3要求≥0.4UI,Gen4要求≥0.35UI,Gen5要求≥0.3UI。
重点来了:Gen5的眼高只有25mV,这是什么概念?一个普通的电源噪声就能把它吃掉。所以Gen5的PCB设计,对电源完整性要求极高。我建议,Gen5的PDN阻抗,目标值要控制在10mΩ以下。
眼图模板的形状,不同代际也不一样。Gen3是六边形模板,Gen4/5变成了更复杂的形状,中间还有凹陷。为什么?因为接收端的CTLE和DFE会把信号均衡成那样。你想想看,如果发送端不做预加重,信号到了接收端早就歪了。
3.3 抖动分析:把噪声拆开来看
抖动,就是信号边沿偏离理想位置的程度。PCIe的抖动分析,核心是把总抖动 (TJ) 拆成随机抖动 (RJ) 和确定性抖动 (DJ)。
公式很简单:TJ = DJ + 2 × n × RJ。这里的n取决于误码率要求,PCIe要求BER=1e-12,所以n≈14。
我一般用双狄拉克模型来分离RJ和DJ。具体做法是:
- 测不同BER下的抖动值
- 画出一条曲线
- 外推到BER=1e-12
嗯,这里要注意,双狄拉克模型有个假设——RJ是高斯分布的。但实际上,有些噪声源(比如电源噪声)不是纯高斯。所以算出来的TJ可能偏乐观。我曾经吃过这个亏,仿真时TJ过了,实测却没过。后来发现是电源噪声的周期性成分没被模型捕捉到。
3.4 避坑指南:我踩过的几个雷
避坑1:参考时钟的抖动
我曾经遇到一个Gen4项目,眼图总是差一点点。查了三天,最后发现是参考时钟的RMS抖动超标了0.1ps。换了个低抖动的晶振,问题解决。记住,Gen5的参考时钟抖动要求<0.3ps RMS,选型时一定要留余量。
避坑2:过孔的残桩效应
Gen3的时候,过孔残桩长一点问题不大。到了Gen4/5,残桩超过10mil,信号质量就明显下降。我的做法是:用背钻工艺把残桩去掉,或者改用微盲孔。如果实在没办法,至少保证残桩长度<8mil。
避坑3:AC耦合电容的选型
PCIe链路中必须串AC耦合电容,通常用0.1uF或0.22uF。但电容的寄生参数会影响高频性能。我建议用0402封装的X7R电容,ESL要<0.5nH。曾经有个同事用了0603的电容,结果Gen4眼图直接闭了。
3.5 仿真与测试:纸上谈兵不如动手
理论说再多,不如跑一次仿真。我常用的流程是:
- 通道仿真:用IBIS-AMI模型,跑1000万个比特,看眼图和BER。
- 抖动预算:把TX抖动、通道抖动、RX抖动加起来,看是否超过1UI。
- 实测验证:用实时示波器抓眼图,用TDR看阻抗连续性。
这里给个代码片段,用Python简单算一下抖动预算:
# 抖动预算计算示例
UI = 1 / 32e9 # Gen5: 32 GT/s, 1 UI = 31.25 ps
TJ_max = 0.3 * UI # 眼宽要求 0.3 UI
RJ_rms = 0.2e-12 # 随机抖动 0.2 ps RMS
DJ = 5e-12 # 确定性抖动 5 ps
TJ = DJ + 2 * 14 * RJ_rms
print(f"总抖动: {TJ*1e12:.2f} ps")
print(f"允许最大抖动: {TJ_max*1e12:.2f} ps")
if TJ < TJ_max:
print("抖动预算通过")
else:
print("抖动预算超标,需要优化")
跑完仿真,别忘了看眼图模板。我习惯把模板和实测眼图叠在一起看,哪里碰了模板,哪里就有问题。
3.6 小结
PCIe Gen3/4/5的物理层设计,说白了就是跟损耗和抖动做斗争。速率越高,斗争越激烈。我的经验是:
- Gen3:注意PCB走线长度和过孔设计
- Gen4:必须考虑去加重和CTLE的配合
- Gen5:电源完整性和参考时钟抖动是重中之重
最后说一句,别完全相信仿真。仿真通过了,不代表实测就能过。我见过太多仿真完美、实测翻车的案例。所以,打样回来后,第一件事就是上示波器看眼图。嗯,这才是最靠谱的。