1. 从一颗芯片到一块板子:PEX88096参考设计到底在解决什么问题
如果你正在看PEX88096这颗芯片,大概率你面对的场景是这样的:手头有一堆PCIe 4.0的端点设备——可能是NVMe盘阵、GPU加速卡、或者25G/100G网卡——需要把它们全部挂到一台主机下面,而且要求低延迟、高带宽、还不能丢包。CPU自带的PCIe lane不够用,或者拓扑太扁平没法灵活分配,这时候就需要一颗PCIe Switch芯片来当"交通枢纽"。
PEX88096是博通(Broadcom)PEX88000系列里的一款96-lane、PCIe 4.0的交换芯片。96条lane意味着什么?你可以拆成24个x4端口,或者12个x8,或者6个x16,甚至混搭。单lane速率16 GT/s,理论双向带宽接近32 GB/s per lane的聚合能力。这个量级放在存储服务器、AI训练节点、或者多卡推理平台上,基本就是"想怎么连就怎么连"的级别。
但问题来了:芯片本身只是一块硅片,它不会自己工作。你需要一块PCB,上面有电源、时钟、复位、配置EEPROM、散热、连接器、以及最重要的——正确的走线和阻抗控制。这就是"硬件参考设计"存在的意义。博通官方会给一份参考设计文档和原理图,但那份东西通常是给大客户看的,细节多、假设多、而且不会告诉你"为什么这里要放这个电容"或者"为什么这个电阻不能省"。
我写这篇东西的目的很直接:把PEX88096参考设计里那些真正影响你板子能不能跑起来、能不能稳定跑PCIe 4.0速率的点,一个一个拆开讲清楚。不是照抄官方文档,而是从实际画板、打样、调试的角度,告诉你哪些地方容易翻车、哪些参数必须算、哪些"看起来可选"的东西其实不能省。
适合谁看?硬件工程师、SI工程师、系统架构师,以及那些正在评估要不要用PEX88096做板子的人。如果你只是写驱动的,也可以看看,至少能理解为什么有时候链路训练会失败、为什么某些slot的带宽上不去。
2. PEX88096的端口拆分逻辑与参考设计里的拓扑假设
2.1 96 lane不是"随便分"——Station架构决定了你的拓扑上限
PEX88096内部不是简单的crossbar。它采用的是"Station"架构,每个Station包含若干lane,Station之间有内部总线互联。具体来说,PEX88096有多个Station,每个Station可以配置成不同的端口宽度。你在参考设计里看到的"端口分配表",其实就是把物理lane映射到逻辑端口的过程。
这里有个关键点:不是所有lane都能任意组合成x16。有些lane组只能做x4或者x8,因为它们的SerDes通道和Station的绑定关系是固定的。官方参考设计通常会给出几种"推荐配置",比如"24个x4"、"12个x8"、"6个x16"或者"4个x16 + 8个x4"之类的组合。你如果自己乱分,可能会出现某个端口死活训练不到Gen4,或者带宽只有预期的一半。
我的建议是:先确定你的端点设备需要什么宽度,然后去查PEX88096的datasheet里那张"Port Configuration"表,看看哪些组合是官方验证过的。不要自己发明拓扑。参考设计里的默认配置通常是"最通用"的那个,但不一定是最适合你的。
2.2 上行端口和下行端口:参考设计里的"Host Side"和"Endpoint Side"
PEX88096是一个非透明桥还是透明桥?这取决于你的用法。在大多数参考设计里,它被配置成透明交换(Transparent Switch),也就是说,Host看到的是一个大的PCIe域,下面挂了一堆设备。上行端口(Upstream Port)连到Host的Root Complex,下行端口(Downstream Port)连到各个端点。
参考设计里通常会把上行端口固定成x16或者x8,因为Host侧的lane数有限。下行端口则根据你的背板或者线缆方案来定。这里有个坑:上行端口的宽度不能小于下行端口的总和,否则会出现带宽瓶颈。比如你有6个x16的下行端口,上行只有x8,那所有设备共享x8的带宽,性能直接崩。
另外,参考设计里会标注哪些端口支持"热插拔"(Hot-Plug)。如果你要做NVMe热插拔背板,必须用支持Hot-Plug的端口,并且要在PCB上做相应的PRSNT#信号和电源控制。不是所有下行端口都默认支持这个功能,需要看参考设计里的"Port Capability"表。
2.3 参考设计里的"默认配置"是怎么来的
博通的参考设计通常基于一个"典型应用场景":比如存储服务器,上行x16,下行24个x4接NVMe盘。这个配置之所以成为默认,是因为它覆盖了大多数客户的需求,而且lane分配比较均衡。
但如果你做的是AI训练平台,可能需要上行x16,下行4个x16接GPU,再加几个x8接网卡。这时候你就不能直接用默认配置了,得改EEPROM里的配置数据。参考设计里会有一个"Configuration EEPROM"的章节,告诉你哪些地址对应哪些端口设置。这部分我后面会详细讲。
3. 电源树设计:PEX88096不是"接个3.3V就能跑"的芯片
3.1 核心电压、SerDes电压和IO电压:三组电源缺一不可
PEX88096的电源需求比一般PCIe设备复杂得多。它至少需要以下几组电源:
- VDD_CORE:核心逻辑电压,通常是0.9V或1.0V,具体看datasheet。电流可能达到几十安培,取决于你的端口配置和负载。
- VDD_SERDES:SerDes模拟电压,通常是1.2V或1.8V,对噪声极其敏感。
- VDD_IO:IO电压,通常是1.8V或3.3V,用于配置引脚和低速接口。
- VDD_AUX:辅助电压,用于管理接口和热插拔逻辑。
参考设计里会给出每一路电源的电流预算和去耦方案。这里最容易翻车的是VDD_SERDES:如果你用普通的DC-DC给它供电,开关噪声会直接耦合到SerDes输出上,导致眼图闭合、误码率飙升。参考设计通常会建议用LDO给SerDes供电,或者至少用两级滤波。
3.2 去耦电容不是"越多越好",而是要放对位置
参考设计的PCB布局里,去耦电容的摆放位置比数量更重要。PEX88096的BGA下面通常会有大量的0402或0201电容,这些电容必须尽量靠近芯片的电源球。如果放远了,寄生电感会让电容在高频下失效。
我的经验是:对于VDD_CORE,每对电源球至少配一个0.1uF的0402电容,再加几个大容量的钽电容或聚合物电容做低频储能。对于VDD_SERDES,除了0.1uF,还要加0.01uF和1nF的小电容,专门滤高频噪声。参考设计里会给出一个"电容布局图",照着放就行,但要注意你的PCB层叠是否允许在BGA下面放这么多电容。
3.3 上电时序:为什么你的板子有时候"起不来"
PEX88096对上电时序有要求。通常VDD_CORE要先于VDD_SERDES和VDD_IO上电,或者至少同时上电。如果VDD_SERDES先上电,可能会导致内部ESD保护二极管导通,产生大电流,甚至损坏芯片。
参考设计里会有一个"Power-Up Sequence"的时序图,告诉你每路电源之间的延迟要求。通常是用电源管理IC(PMIC)或者CPLD来控制。如果你自己用分立DC-DC做,一定要加使能信号和延时电路。我见过有人因为省了时序控制,结果板子十次上电有三次起不来,查了半天才发现是SerDes电源先到了。
4. 时钟与复位:参考设计里最容易被"简化"掉的部分
4.1 参考时钟:100MHz差分不是随便找个晶振就行
PEX88096需要一个100MHz的差分参考时钟(REFCLK)。这个时钟的抖动要求非常严格,PCIe 4.0对REFCLK的RMS抖动要求通常在1ps以下(具体看规范)。如果你用一个普通的晶振加差分缓冲器,很可能抖动超标,导致链路训练不稳定。
参考设计里通常会推荐用专用的PCIe时钟发生器,比如IDT或Silicon Labs的时钟芯片。这些芯片内置了低抖动的PLL和差分输出,能保证REFCLK的质量。另外,REFCLK的走线必须做100欧姆差分阻抗控制,长度尽量短,远离高速信号和电源。
4.2 复位信号:PERST#不是"拉低再拉高"那么简单
PERST#是PCIe的标准复位信号。参考设计里会告诉你,PERST#必须在电源稳定之后至少保持100ms的低电平,然后再释放。这个时间是为了让芯片内部的PLL锁定、配置EEPROM加载完成。
但实际调试中,我发现很多人忽略了PERST#的"去抖"和"滤波"。如果PERST#上有毛刺,芯片可能会误复位。参考设计里通常会在PERST#上放一个RC滤波,比如10k上拉加100nF到地。另外,PERST#的驱动源也很重要:如果是从Host侧过来的,要确保电平匹配;如果是本地产生的,要用开漏输出加外部上拉。
4.3 配置EEPROM:没有它,芯片就是一块"砖"
PEX88096上电后会自动从EEPROM加载配置数据。如果EEPROM是空的或者数据不对,芯片会使用默认配置,但默认配置可能不是你想要的端口分配。参考设计里会给出EEPROM的型号建议(通常是24C系列或兼容的SPI EEPROM)和烧录方法。
这里有个大坑:EEPROM的I2C地址和速度必须匹配。有些EEPROM默认地址是0x50,但PEX88096可能期望0x51或者别的。参考设计里会写清楚。另外,EEPROM的写保护引脚(WP)一定要处理好,否则配置数据可能被意外修改。
5. PCB走线:PCIe 4.0的16 GT/s不是"随便连"就能跑的
5.1 差分阻抗与插入损耗:你的板材选对了吗
PCIe 4.0的16 GT/s信号在PCB上的衰减非常快。如果你用普通的FR4板材,走线长度超过8英寸,插入损耗可能就超过规范允许的预算了。参考设计里通常会建议用低损耗板材(比如Megtron 6或类似等级),或者至少用FR4但严格控制走线长度。
差分阻抗必须控制在85欧姆(±10%)。这个不是"差不多就行",因为阻抗不匹配会导致反射,直接恶化眼图。参考设计里会给出叠层建议和走线宽度/间距。如果你自己改叠层,一定要重新计算阻抗。
5.2 过孔设计:背钻不是"可选项"
PCIe 4.0的过孔残桩(stub)效应非常明显。如果一个过孔从顶层到底层,残桩长度超过30mil,就会在16 GT/s下产生严重的谐振。参考设计里通常会要求对过孔进行背钻(Back-drill),把残桩控制在10mil以内。
背钻会增加成本,但如果你要做稳定的PCIe 4.0链路,这是必须的。我见过有人为了省钱不做背钻,结果链路只能跑到Gen3,Gen4死活训练不上来。后来做了背钻,问题直接消失。
5.3 走线长度匹配:不是"等长"就行,还要看"相位"
PCIe的差分对内部两条线需要等长,通常要求误差在5mil以内。但很多人忽略了"差分对之间"的等长。如果你有多个lane组成一个端口,比如x16,那么这16对差分线之间的长度差也要控制,通常要求在100mil以内。否则会出现lane间偏斜(skew),影响链路训练。
参考设计里会给出一个"Length Matching Table",告诉你哪些信号组需要等长,容差是多少。照着做就行,但要注意你的PCB设计工具是否支持自动等长绕线。
6. 散热与机械:参考设计里"看不见"但致命的部分
6.1 功耗估算:你的散热器够大吗
PEX88096的功耗取决于端口配置、速率、以及是否开启某些功能。参考设计里通常会给出一个"典型功耗"和"最大功耗"的表格。比如96 lane全跑Gen4,功耗可能在30W到40W之间。如果你不加散热器,芯片结温会迅速超过125°C,然后降速或者宕机。
参考设计里会建议散热器的尺寸和风道要求。我的经验是:如果板子放在1U服务器里,必须用主动散热(小风扇)或者至少用大面积铝挤散热器加导风罩。自然散热在大多数情况下不够。
6.2 BGA焊接与翘曲:不是"贴上去"就行
PEX88096是大型BGA封装,引脚数多、间距小。回流焊时如果温度曲线不对,容易出现虚焊或者翘曲。参考设计里会给出推荐的焊接曲线和PCB厚度建议。通常建议用厚板(比如2.0mm以上)来减少翘曲。
另外,BGA下面的PCB表面处理也很重要。ENIG(化学镍金)是常见选择,但要注意黑盘问题。如果PCB厂工艺控制不好,焊点可靠性会出问题。
7. 调试与验证:板子回来之后怎么"点亮"它
7.1 第一步:检查电源和时钟
板子打样回来,先别急着上电。用万用表测一遍各路电源对地阻抗,确认没有短路。然后上电,用示波器测各路电源的纹波和时序。REFCLK要用高带宽探头测,看频率和幅度是否正常。
如果电源纹波超过50mV,SerDes可能会工作不稳定。如果REFCLK抖动太大,链路训练会失败。这两个是基础,必须先过。
7.2 第二步:读EEPROM和配置寄存器
PEX88096上电后,你可以通过I2C或者SMBus读取EEPROM的内容,确认配置数据是否正确加载。参考设计里会给出寄存器地址和期望值。如果读出来全是0xFF,说明EEPROM没烧录或者I2C通信有问题。
另外,你可以通过厂商提供的工具(比如Broadcom的PEX工具)来读取链路状态和误码率。如果某个端口训练不到Gen4,先看误码率,如果误码率高,说明信号完整性有问题;如果误码率为0但速率上不去,可能是配置问题。
7.3 第三步:链路训练与压力测试
链路训练成功后,用PCIe分析仪或者误码仪做压力测试。参考设计里会建议跑至少24小时的误码测试,误码率要低于1e-12。如果测试中出現误码,先检查走线和连接器,再检查电源噪声。
我自己的经验是:很多链路问题不是芯片本身,而是连接器或者线缆。比如背板连接器的阻抗不连续,或者线缆太长导致衰减过大。参考设计里会给出连接器选型建议,尽量用官方推荐的型号。
8. 几个实际项目中踩过的坑和应对方法
8.1 端口配置改了但没生效
有一次我改EEPROM里的端口配置,把两个x8合并成一个x16,结果上电后还是两个x8。查了半天发现是EEPROM的写保护没关,数据根本没写进去。后来把WP引脚拉低再烧录,问题解决。这个坑很小,但很浪费时间。
8.2 Gen4链路不稳定,Gen3正常
另一个项目里,板子跑Gen3很稳,Gen4偶尔训练失败。用示波器看眼图,发现眼高勉强达标,但眼宽不够。后来发现是走线长度太长,插入损耗超标。换了低损耗板材,缩短走线,问题解决。所以PCIe 4.0对板材和走线长度真的敏感,不要心存侥幸。
8.3 散热不足导致降速
还有一个案例是板子跑了一段时间后,带宽突然下降。查温度发现芯片结温到了110°C,触发了降速保护。后来加了小风扇,温度降到80°C以下,带宽恢复。所以散热设计一定要留余量,不要按典型功耗算,要按最大功耗算。
9. 参考设计之外:你还需要考虑的系统级问题
9.1 与Host的兼容性
PEX88096虽然标准PCIe,但不同Host的Root Complex行为可能不同。比如有些Host对链路训练的超时时间要求更严,或者对某些配置空间寄存器的处理不一样。参考设计里通常不会覆盖所有Host,你需要自己测试。
9.2 热插拔与电源管理
如果你要做热插拔,除了硬件上的PRSNT#和电源控制,还需要软件层面的支持。参考设计里会给出硬件接口,但驱动和ACPI配置需要你自己搞。这部分容易出问题,建议先用评估板验证。
9.3 电磁兼容
PCIe 4.0的16 GT/s信号辐射很强,如果板子要做认证,EMC是个挑战。参考设计里会给出一些布局建议,比如差分线尽量走内层、包地、加屏蔽罩等。但最终还是要靠测试和整改。
10. 写在最后:一些个人体会
PEX88096是一颗很强大的芯片,但它的参考设计不是"抄作业"就能搞定的。你需要理解每一部分的设计意图,然后根据你的实际场景做调整。电源、时钟、走线、散热,这四个环节任何一个出问题,板子都跑不起来。
我的建议是:第一版板子尽量贴近参考设计,不要自己发明。等第一版跑通了,再根据实际需求做优化。另外,调试工具要提前准备好,比如高带宽示波器、PCIe分析仪、误码仪,这些能帮你快速定位问题。
最后,如果你在画板过程中遇到不确定的地方,优先查官方datasheet和参考设计文档,其次查PCIe规范。网上的资料很多是错的,或者只适用于特定场景。自己算一遍、测一遍,比什么都靠谱。