ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

PEX88096 PCIe 4.0交换芯片硬件设计实战:从电源时钟到链路调试

PEX88096 PCIe 4.0交换芯片硬件设计实战:从电源时钟到链路调试 1. 项目缘起与整体设计思路1.1 为什么盯上PEX88096这颗芯片第一次接触PEX88096是在一个多卡加速器的项目里。当时系统需要把上游主机的PCIe 4.0 x16链路拆成多路下行分别接GPU、NVMe阵列和一块采集卡同时还要保证各设备之间的通信不经过主机CPU。市面上能选的PCIe 4.0交换芯片不多博通的PEX88000系列是绕不开的一档而PEX88096是其中端口密度和灵活性都比较均衡的一颗——96 lane的规格可以灵活配置成x16、x8、x4甚至x2的下行端口支持Spread Spectrum时钟、支持SRIS/SRNS两种参考时钟架构这些特性在真实系统里非常关键。我选它的核心理由有三条。第一PCIe 4.0每lane 16GT/s的速率在x16配置下能跑到约32GB/s的单向带宽对于多路NVMe或者GPU互联来说带宽余量足够。第二它支持真正的非透明桥NTB和DMA这意味着可以做多主机之间的点对点通信而不只是简单的fan-out。第三博通给的参考设计文档和SDK相对完整虽然上手门槛不低但踩坑之后能跑通后续量产的可维护性比一些冷门方案强得多。需要说明的是本文讲的“硬件参考设计”不是照抄官方EVB而是基于官方参考设计做裁剪和适配落到一块能实际投产的板子上。官方EVB是拿来评估芯片功能的电源、时钟、调试接口都做得很冗余直接抄会带来成本和面积上的浪费。所以我的思路是保留核心的电源树、时钟树、配置电路和高速信号拓扑砍掉评估用的冗余部分同时把调试手段做扎实方便后期定位问题。1.2 整体方案框架与关键取舍整块板子的功能框图可以这样理解上游是一个PCIe 4.0 x16的金手指或者线缆连接器接入PEX88096的上行端口下行分出若干路分别走不同的连接器或板对板连接器。芯片旁边挂一颗SPI Flash用于上电配置再配一颗I2C EEPROM做备份或者参数存储。时钟部分用一颗PCIe 4.0合规的时钟发生器给芯片和下游设备提供参考时钟。电源部分从12V输入经过多级DCDC和LDO产生芯片需要的各路电压。这里有几个关键取舍值得展开说。第一个取舍是上行端口宽度。官方参考设计默认给的是x16上行但实际项目里如果主机侧只有x8那x16就是浪费。我最终选了x16上行原因是这颗芯片的端口划分是固定分组的上行端口占用的lane组如果改窄剩下的lane不一定能灵活分配给下行反而可能造成lane浪费。所以宁可上行做满把灵活性留给下行。第二个取舍是SPI Flash的容量和型号。PEX88096上电时从SPI Flash读取配置官方推荐的是16MBit2MB起步的Flash。我实测下来如果只是存一份配置2MB够用但如果要做双镜像主备配置切换就得4MB。最终选了4MB的W25Q32系列兼容性好供货稳定。这里要注意Flash的读取速率会影响上电时间PEX88096支持到50MHz的SPI时钟选Flash时一定要确认它支持这个速率否则上电会变慢。第三个取舍是时钟架构。PCIe 4.0对时钟抖动的要求比3.0严得多参考时钟的RMS抖动要控制在0.5ps以内具体数值看规范版本。我选的是支持PCIe 4.0的专用时钟发生器而不是用普通晶振加分频器。原因是专用芯片内部有针对PCIe的扩频和抖动衰减设计能省掉很多调试时间。如果项目对成本极度敏感也可以考虑从上游主机取参考时钟但那样就失去了独立时钟域的灵活性。提示PEX88096的参考时钟输入支持Common Clock和Independent Reference两种模式选哪种取决于上游主机和下游设备是否共享同一个时钟源。如果上下游时钟不同源必须用Independent Reference模式并且要确保SRISSeparate Reference Independent Spread配置正确否则链路训练会失败。2. 核心电路细节与实操要点2.1 电源树设计与上电时序PEX88096的电源轨比较多粗略数一下有核心电压典型0.9V或1.0V看具体型号、IO电压1.8V、辅助电压3.3V、以及给SerDes用的模拟电压通常也是0.9V或1.0V但要求更干净。官方数据手册里会给一个推荐的上电时序一般是核心电压先上然后IO最后辅助电压或者反过来具体顺序一定要以最新版数据手册为准。我踩过的一个坑是一开始为了省事把核心电压和SerDes模拟电压用同一路DCDC供电结果链路训练时误码率偏高。后来分开供电SerDes那一路加了LC滤波和低噪声LDO误码率立刻降下来了。所以我的建议是SerDes的模拟电源一定要单独处理哪怕多花几毛钱的LDO成本也比后期调试链路强。上电时序的控制我用的是电源监控芯片加使能链的方式。具体做法是第一路DCDC输出正常后通过电源监控芯片的PGPower Good信号去使能第二路依次类推。这样不需要额外的时序控制器成本低且可靠。需要注意的是每路电源的上升时间要控制好太快可能导致浪涌电流过大太慢可能触发芯片内部的欠压复位。一般建议控制在1ms到10ms之间。电源轨典型电压电流需求估算供电方式关键要求核心电压0.9V8A~12A多相DCDC纹波30mVSerDes模拟0.9V3A~5ALDO或低噪声DCDC纹波10mVPSRR高IO电压1.8V1A~2ADCDC纹波50mV辅助电压3.3V0.5A~1ADCDC或LDO纹波50mV电流需求这一列是我根据实际项目估算的不同配置下会有差异。比如下行端口全开且跑满带宽时核心电流会明显上升。建议在画板前用博通提供的功耗估算工具算一遍留出30%以上的余量。2.2 时钟电路与参考时钟选择时钟部分我单独拿出来讲因为PCIe 4.0对时钟太敏感了。PEX88096需要一路100MHz的参考时钟输入这路时钟的质量直接决定了链路能不能稳定跑在16GT/s。我选用的时钟发生器支持PCIe 4.0 Common Clock架构输出RMS抖动实测在0.3ps左右留足了余量。时钟走线要注意几点第一走差分线阻抗控制到100欧姆第二尽量短最好控制在5厘米以内第三远离电源电感和高速数据线避免耦合噪声。如果板子上有多路时钟需求可以用一颗时钟发生器出多路但要注意各路之间的 skew 要控制好。还有一个细节是时钟的扩频Spread Spectrum配置。如果上游主机开启了扩频下游设备也开启扩频那两边要匹配否则链路训练会出问题。我的做法是如果系统里所有设备都支持扩频就统一开启如果有设备不支持就统一关闭。PEX88096的扩频配置是通过SPI Flash里的配置字来设置的改起来不算麻烦但一定要在打板前确认好。注意时钟发生器的电源一定要干净最好用独立的LDO供电并且在LDO输出端加π型滤波。我见过因为时钟电源噪声导致链路随机掉线的案例排查了很久才定位到。2.3 SPI Flash配置电路与烧录方式SPI Flash是PEX88096上电启动的关键。芯片上电后会从Flash读取配置数据如果读不到或者数据校验失败芯片就不会正常工作。所以这部分电路虽然简单但绝对不能马虎。电路连接上PEX88096的SPI接口有四根线CS、CLK、MOSI、MISO。Flash的选型要注意几点第一支持的最高SPI时钟要大于等于芯片的读取速率第二扇区大小和擦除时间要符合配置更新需求第三最好选带唯一ID的型号方便做防抄板或者授权管理。烧录方式我推荐两种一种是在板烧录通过芯片的调试接口或者专用的烧录座另一种是离线烧录把Flash焊到转接板上用编程器烧。在板烧录方便量产但需要芯片支持离线烧录灵活但多一道工序。我一般是在打样阶段用离线烧录量产时用在板烧录。配置文件的生成要用博通提供的工具把端口配置、时钟配置、电源管理配置等参数填进去生成一个二进制文件再烧到Flash里。这里有个坑不同版本的SDK生成的配置文件格式可能不兼容所以一定要用和芯片固件版本匹配的SDK。我遇到过用新版SDK生成的配置烧到老版芯片上结果芯片根本不启动的情况后来换了匹配版本就好了。3. 完整实操流程与关键环节实现3.1 从原理图到PCB的落地过程原理图阶段我建议先把官方参考设计的原理图完整看一遍理解每一部分的作用然后再动手裁剪。裁剪的原则是电源和时钟部分尽量保留官方设计因为这两块对性能影响最大调试接口和测试点可以按需增减连接器和指示灯可以按项目需求改。PCB布局阶段有几个硬性要求必须遵守。第一PCIe 4.0的差分线要走在内层参考平面要完整不能跨分割。第二差分对的长度匹配要控制在5mil以内过孔数量要尽量少且过孔要做背钻或者优化。第三芯片底部的散热焊盘要打足够多的过孔连接到地平面帮助散热。第四SPI Flash要尽量靠近芯片走线要短且直。我实际画板时把PEX88096放在板子中央上行连接器放在一侧下行连接器放在另一侧这样高速走线最短。电源部分放在板子边缘远离高速信号。时钟发生器放在芯片附近但和高速线保持距离。整个板子做了8层叠层结构是信号-地-信号-电源-地-信号-地-信号。这个叠层兼顾了信号完整性和电源完整性成本也可接受。3.2 上电调试与链路训练实操记录板子回来之后第一步是检查电源。不焊芯片先焊电源部分上电测各路电压是否正常。这一步很重要如果电源有问题焊了芯片再查就麻烦了。我一般会测空载和带载两种情况带载可以用电子负载模拟。电源正常后焊芯片和Flash再次上电。这时候要测芯片的复位信号和时钟信号。复位信号要在上电后保持足够长的时间具体看数据手册。时钟信号要用示波器测看频率和幅度是否正常有条件的话用相位噪声分析仪测抖动。接下来是链路训练。把上游主机和下游设备都接好上电后观察链路是否训练成功。如果失败先查时钟再查复位再查配置。我遇到过一次链路训练失败查了半天发现是Flash里的配置把上行端口宽度设错了改成x16之后就好了。所以配置文件的检查一定要仔细。链路训练成功后用lspci命令看设备是否枚举正常。如果枚举正常但带宽不对可能是链路宽度或者速率没协商到最高。这时候要查配置里的链路速率设置以及上游主机和下游设备的能力。调试阶段检查项工具常见问题电源调试各路电压、纹波万用表、示波器电压偏差大、纹波超标时钟调试频率、幅度、抖动示波器、相噪仪频率偏差、抖动超标链路训练训练状态、误码率芯片调试工具训练失败、误码率高系统枚举设备识别、带宽协商lspci、厂商工具枚举失败、带宽降级3.3 配置文件的生成与烧录细节配置文件是用博通的SDK工具生成的界面不算友好但功能齐全。主要配置项包括端口模式上行/下行、链路宽度、链路速率、时钟模式、扩频开关、电源管理策略等。每一项都要根据实际硬件设计来填填错了轻则功能异常重则芯片不启动。生成配置文件后用编程器烧到SPI Flash里。烧录时要注意第一确认Flash的型号和容量第二确认烧录地址和长度第三烧录后要做校验。我一般会烧两遍第一遍烧第二遍校验确保数据正确。烧录完成后把Flash焊回板子上电测试。如果芯片不启动先查Flash的SPI信号是否正常再查配置文件是否匹配。有时候是Flash的CS信号被其他电路拉住了导致芯片读不到数据。这种问题用示波器抓一下SPI波形就能定位。提示建议在板子上留一个SPI Flash的备用焊盘方便调试时快速更换Flash。另外如果项目支持远程更新配置可以在系统里加一个I2C转SPI的桥接芯片通过I2C接口更新Flash内容这样就不用拆机了。4. 常见问题排查与避坑经验实录4.1 链路训练失败的排查思路链路训练失败是最常见也最头疼的问题。我的排查顺序是先查时钟再查复位再查配置最后查信号完整性。时钟方面重点看频率是否准确、幅度是否足够、抖动是否超标。我遇到过时钟发生器配置错误导致输出频率偏了100ppm结果链路死活训练不上。后来用示波器测了频率才发现问题。复位方面重点看复位信号的时序和电平。PEX88096的复位信号有最低保持时间要求如果复位时间不够芯片可能来不及完成内部初始化。另外复位信号的电平要符合芯片要求不能有毛刺。配置方面重点看端口宽度、链路速率、时钟模式是否和实际硬件匹配。我遇到过一次配置里把上行端口设成了x8但硬件是x16结果只有一半的lane训练成功。改成x16后问题解决。信号完整性方面重点看差分线的阻抗、损耗、串扰。如果板材或者叠层设计不好16GT/s的信号衰减会很大。这时候可能需要换更低损耗的板材或者缩短走线长度。4.2 SPI Flash相关的典型故障SPI Flash相关的故障主要有几类读不到数据、数据校验失败、上电启动慢。读不到数据先查硬件连接包括CS、CLK、MOSI、MISO四根线是否接对Flash的电源是否正常Flash是否损坏。我遇到过Flash的CS信号被一个上拉电阻拉高了导致芯片一直读不到数据去掉那个上拉电阻就好了。数据校验失败一般是配置文件生成有误或者烧录过程出错。重新生成配置文件重新烧录再做校验。如果还是失败换一颗Flash试试。上电启动慢一般是Flash的SPI时钟太慢或者Flash的读取指令不匹配。PEX88096支持多种读取指令要选Flash支持的最快的那种。另外Flash的扇区大小也会影响读取速度小扇区读取快但容量利用率低大扇区反之。故障现象可能原因排查方法解决方案读不到数据硬件连接错误、Flash损坏查线路、换Flash修复连接、更换Flash校验失败配置错误、烧录出错重新生成、重新烧录用匹配版本SDK启动慢SPI时钟慢、指令不匹配测SPI波形换高速Flash、改指令随机掉线电源噪声、时钟抖动测电源纹波、时钟抖动加滤波、换时钟源4.3 高速信号完整性的实战心得PCIe 4.0的信号完整性是绕不过去的坎。我总结了几条实战心得。第一板材选择很重要。普通FR4在16GT/s下的损耗比较大如果走线超过10厘米建议用低损耗板材比如Megtron 6或者类似等级的材料。虽然成本高一些但能省掉很多调试时间。第二过孔设计要优化。每个过孔都会带来阻抗不连续和寄生电容影响信号质量。建议用背钻技术去掉过孔的stub或者用盲埋孔减少过孔长度。如果成本不允许至少要把过孔做大一点减小寄生电容。第三差分对的对称性要做好。长度匹配、间距一致、参考平面完整这些基本功一定要扎实。我见过因为差分对一根线多绕了一个过孔导致眼图闭合的案例所以画板时一定要仔细检查。第四测试点要留够。调试时可能需要测眼图、测抖动如果没有测试点就很麻烦。建议在关键信号上留测试点但测试点的寄生参数要控制好不能影响信号质量。注意PCIe 4.0的接收端一般有均衡器能补偿一部分通道损耗。但如果通道损耗太大均衡器也救不回来。所以设计时要把通道损耗控制在芯片接收端能容忍的范围内具体数值看数据手册。4.4 散热与长期可靠性注意事项PEX88096的功耗不算低满配情况下可能到15W以上所以散热设计不能忽视。我的做法是芯片底部加散热焊盘焊盘上打足够多的过孔连接到地平面地平面再通过导热垫连接到外壳或者散热片。如果机箱内有风道可以把芯片放在风道上。长期可靠性方面要注意几点第一电源的电解电容要选长寿命的避免几年后电容失效第二连接器要选插拔寿命足够的避免反复插拔后接触不良第三Flash要选工业级或者车规级的避免数据丢失。我还建议在板子上加一个温度传感器监控芯片附近的温度。如果温度超过阈值可以通过软件降速或者报警。这个功能在调试阶段可能用不上但量产之后很有价值。5. 配置参数计算与选型对照5.1 链路宽度与带宽的对应关系PCIe 4.0每lane的速率是16GT/s采用128b/130b编码所以每lane的有效带宽是16GT/s × 128/130 ÷ 8 ≈ 1.969GB/s。不同链路宽度的理论带宽如下表。链路宽度原始速率有效带宽单向典型应用x116GT/s1.969GB/s低速外设x232GT/s3.938GB/s中速外设x464GT/s7.877GB/sNVMe、网卡x8128GT/s15.754GB/sGPU、加速卡x16256GT/s31.508GB/s多卡互联、高速采集这个表是理论值实际带宽会受协议开销、流控、软件效率等因素影响一般能达到理论值的70%到90%。做系统设计时要按实际可用带宽来算不能只看理论值。5.2 电源电流的估算方法电源电流的估算我一般用两种方法互相验证。一种是查数据手册里的功耗表按端口配置和工作模式查对应的功耗再除以电压得到电流。另一种是用博通提供的功耗估算工具输入配置参数工具会给出估算结果。两种方法的结果如果差得不多就取较大的那个留足余量。以满配x16上行、8路x8下行为例核心电压0.9V下的电流大约在10A左右SerDes模拟电压0.9V下的电流大约在4A左右。加上IO和辅助电压的电流总功耗大约在15W到18W之间。这个数值会随温度上升而增加所以散热设计要按最坏情况来。5.3 SPI Flash容量与配置镜像的规划SPI Flash的容量规划要看需要存几份配置。如果只存一份2MB够用如果存主备两份4MB够用如果还要存日志或者授权信息8MB更稳妥。我一般选4MB兼顾成本和灵活性。配置镜像的布局也要规划好。我一般把主配置放在Flash的前半部分备配置放在后半部分中间留一些空间存版本号和校验信息。这样更新配置时可以先更新备配置验证通过后再切换避免更新失败导致系统起不来。提示如果项目支持现场更新配置建议在系统里加一个看门狗监控配置更新过程。如果更新失败或者超时看门狗自动回滚到备配置保证系统可用。6. 写在最后的几点个人体会这块板子从立项到跑通前后花了大概三个月其中大部分时间花在调试链路和排查信号完整性问题上。回过头看如果一开始就把电源和时钟做扎实能省掉至少一半的调试时间。所以我的第一条体会是电源和时钟是地基地基不牢后面全是坑。第二条体会是官方参考设计要重视但不能照抄。官方EVB是为了展示芯片的全部功能很多设计是冗余的。实际项目要根据需求裁剪该省的地方省该花的地方花。比如电源和时钟不能省调试接口和测试点不能省但指示灯和冗余连接器可以省。第三条体会是配置文件的管理要规范。不同版本的SDK、不同版本的芯片、不同的硬件配置对应的配置文件都不一样。建议用版本管理工具把配置文件管起来每次改动都记录清楚避免搞混。第四条体会是调试工具要提前准备好。示波器、协议分析仪、芯片调试工具这些在调试阶段缺一不可。如果等到出了问题再去找工具会耽误很多时间。我一般会在项目启动时就确认好需要的调试工具提前借好或者买好。最后分享一个小技巧在板子上留一个串口或者JTAG接口通过它可以看到芯片的内部状态和日志。这个接口在调试阶段非常有用能帮你快速定位问题。虽然会增加一点成本和面积但绝对值得。
返回列表