PCIe 从 Gen1 一路走到 Gen6链路速率翻了二十多倍可 PCB 板材、连接器、封装这些东西的损耗曲线却不会跟着变好反而在 16GHz 这个奈奎斯特点上越来越难看。很多刚入行的朋友看服务器主板或者加速卡原理图会看到一堆名字很像的芯片Retimer、Redriver、Buffer、Switch、Driver有的挂在链路中间有的挂在时钟树旁边乍一看都是中继的意思实际上干的活差了十万八千里。我自己在调试 Gen4/Gen5 链路的时候就因为把 Redriver 当成 Retimer 用白折腾了整整两天链路死活训练不到 32GT/s。这篇就把 PCIe 信号链上这五类器件的边界、选型逻辑、参数计算和排查套路完整讲一遍面向的是做硬件设计、SI 仿真、服务器/存储整机架构以及需要看懂原理图的工程师小白也能跟下来。1. 先把损耗这本账算明白才知道为什么要插器件要理解这几类器件的差别绕不开一个前提PCIe 每一代对信道损耗的预算都在收紧而物理介质的损耗在频率上是单调上升的。如果这本账算不清楚选型就是拍脑袋放错器件或者放多了器件都是常见事故。1.1 PCIe 各代的速率与奈奎斯特频率先摆基础数据。PCIe Gen1 是 2.5GT/sGen2 是 5GT/sGen3 是 8GT/sGen4 是 16GT/sGen5 是 32GT/s到了 Gen6 变成 64GT/s 但改用 PAM4 调制。NRZ 调制下奈奎斯特频率等于速率的一半所以 Gen5 的奈奎斯特点是 16GHzGen6 虽然线速率翻倍但 PAM4 每个符号携带 2bit符号率仍是 32GBd奈奎斯特点还在 16GHz 附近这也是为什么 Gen6 的板材挑战没有想象中那么翻倍但对信噪比的要求高得多。这里插一句很多人会问Gen5 32G 是不是要 32GHz 带宽不是的NRZ 只看 16GHz但也别只看奈奎斯特这一个点实际眼图是宽频段叠加的结果5GHz 到 20GHz 这一整段都影响很大。仿真的时候如果只扫一个点会误导判断。1.2 信道损耗预算与介质损耗PCIe Base Spec 给出的端到端信道损耗预算大致是这样一个量级Gen3 在 4GHz 约 -22dBGen4 在 8GHz 约 -28dBGen5 在 16GHz 约 -36dB。注意这个数字是包含封装、连接器、走线、过孔在内的总账不是单纯 PCB 走线。那 FR4 类的板材在 16GHz 是什么水平大概 1dB/inch 甚至更高不同叠层和铜箔粗糙度差别很大。你拿 10inch 走线加上两个连接器各 1.5dB、封装 2-3dB总共很容易就冲到 18-20dB看起来离 36dB 还有余量但那是理想情况。一旦上到背板加 cable或者走线绕得比较长预算就绷不住了。打个比方这就像在一条很长的走廊里喊话走几米还能听清走到二十米对方就只能听到嗡嗡声。Redriver 相当于在中间加个扩音喇叭把声音放大但噪声也一起放大Retimer 相当于中间站个人听清你说的话再重新清晰地喊给下一个人噪声不会累积。这个类比基本能解释两者的核心差别。1.3 为什么要分层而不是一颗万金油理论上一颗 Retimer 能解决所有问题——它数字重定时抖动不累积几乎能恢复全部损耗预算。但现实里为什么不全都用 Retimer三个原因成本、功耗、延迟。Retimer 一个通道的功耗可能在几百毫瓦一颗 16 通道的 Gen5 Retimer 轻松到十几瓦Redriver 同规格可能只有它的三分之一甚至更低。成本上 Retimer 也贵不少。延迟方面Redriver 是纯模拟通路延迟在亚纳秒到几纳秒量级Retimer 要走 CDR 恢复时钟、重新采样、再发射通常会引入十几到几十纳秒。这个延迟在大多数场景无感但在 P2P点对点如 GPU 之间直接通信和某些对时序敏感的应用里就得掂量。提示链路预算够用绝不加器件。每加一颗器件都引入插损、阻抗不连续和额外的电源噪声属于能不加就不加的东西。所以实际工程里的分层逻辑是能在 PCB 层面靠叠层、走线优化搞定的就不加器件搞不定且是短距离中等损耗的上 Redriver长距离、背板、cable 或者超预算的上 Retimer需要拓扑扩展一个上行口对多个设备的上 Switch时钟分配相关的用 Buffer 或 Clock Driver。2. 五类器件逐个拆开看边界到底在哪这五类名字经常被混用尤其是 Redriver 和 Buffer很多厂商的数据手册直接写 Linear Redriver/Buffer让人以为是一个东西。下面逐个讲清楚它们各自在做什么以及它们在链路里的位置。2.1 Redriver纯模拟的信号调理不碰数据Redriver 本质是一个模拟信号调理芯片内部核心是连续时间线性均衡器CTLE加增益放大。它的工作方式很朴素信号进来经过一段频率相关的增益曲线对高频衰减做补偿再放大输出。它不恢复时钟不做数据采样不知道链路上跑的是 PCIe 还是别的什么对协议完全透明。它最大的优势就是延迟极低、成本低、功耗低、设计简单——不需要参考时钟不需要配置有些型号上电即用。缺点是抖动会累积因为它把输入信号的抖动和噪声一起放大了。而且它不是无限的增益和均衡能力有上限一般单颗 Redriver 能补的损耗在 8 到 12dB 量级具体看型号和 EQ 设置。典型应用是主板上 PCIe slot 的前级、M.2 riser、短距离 NVMe 背板、OCP 网卡的 host 侧。它的位置一般在发送端附近因为要趁信号还没彻底衰减之前先补一把。2.2 Retimer带 CDR 的数字重建站Retimer 内部有完整的时钟数据恢复CDR电路它的工作流程是接收端先把信号均衡、采样恢复出数据和时钟然后用一个本地干净的低抖动时钟重新发射出去。也就是说抖动在它这里被截断了前端累积的抖动不会传到后端。代价就是延迟、功耗、成本都上去了。而且 Retimer 需要参考时钟通常是 100MHz 差分还需要管理接口I2C 或 SMBus做配置和状态读取设计复杂度明显上升。还有一个关键点Retimer 不是完全透明的。在 Gen4/Gen5 时代Retimer 需要参与链路训练比如处理带内 SKP 有序集Gen5 对 SKP OS 结构做了改动引入了 Retimer 需要识别和转发的格式还要支持 Retimer presence detect 机制让上下游知道链路中间有个 Retimer、有几个。所以 Retimer 是要懂协议的这也是它和 Redriver 最本质的分界。典型应用是服务器背板、GPU 底座和 riser cable、PCIe over cable、多连接器加持的长链路。2.3 BufferPCIe 语境下最容易踩坑的一个词Buffer 这个词在 PCIe 领域有两个完全不同的指向混淆它会直接导致选型错误。第一个指向是时钟 BufferClock Buffer这是 PCIe 时钟架构里最常用的器件。一颗 CPU 只有几路 100MHz 差分参考时钟输出但主板上可能有 slot、NVMe 背板、Switch、多个 Retimer 都需要 100MHz 参考。Clock Buffer 的作用就是把一路输入时钟扇出fanout成多路输出保证所有下游器件时钟同源从而满足 common clock 架构。这类器件关注的是附加抖动additive jitter、输出路数、是否支持零延迟ZDB等指标和信号链本身的数据通路没关系。第二个指向是 Linear Buffer它其实就是 Redriver 的另一种叫法。很多厂商尤其是一些老料号在命名上把线性均衡放大类的器件叫 Buffer功能上和 Redriver 完全一致。所以看到原理图上写着 Buffer必须看它的信号网络挂在 CLK 网络上就是时钟扇出挂在 PETp/PETn 这类数据对上就是 Redriver 换了个名字。这一点新人特别容易搞错我就见过有人拿时钟 buffer 去补数据链路的损耗白忙一场。2.4 Switch拓扑扩展的交通枢纽Switch 和前几类完全不是一个维度的东西。Retimer 和 Redriver 是管道里的中继而 Switch 是路口。它内部是一组 PCI-PCI 桥一个上行端口upstream port对多个下行端口downstream port把一条 PCIe 链路扩展成多条。Switch 参与 PCIe 枚举会占用总线号空间每个下行端口后面挂的设备都会被 CPU 枚举到拥有自己的 BDF。它的优势是能扇出多个设备、支持热插拔、可以配 ACS 等特性控制 P2P 通信。缺点是每一个 Switch 跳转都会引入额外的延迟通常在百纳秒量级功耗和成本也都不低而且它的上行端口本身也需要一颗驱动能力较强的 PHY。典型应用是 NVMe JBOF 扩展框、GPU 服务器多卡连接、多主机共享存储、需要把有限的 CPU lane 分给很多设备的场景。2.5 Driver身份最多、最容易和软件驱动搞混Driver 这个词在 PCIe 信号链里有好几个身份得按场合区分。第一种是 PHY 内部的 TX Driver也就是 SerDes 发送端的输出级。它负责把高速串行数据以足够的幅度和预加重FFE驱动到信道上。这部分通常集成在 CPU 或 Switch 的 SerDes 里不单独出现在原理图上但它决定了发送端眼图的开口。第二种是 Clock Driver本质上是差分时钟输出驱动器和前面说的 Clock Buffer 高度重叠很多厂商直接把这两类器件统称。像服务器主板上给多个 PCIe 器件分发 100MHz 参考时钟的芯片手册上经常写 Clock Generator/Buffer/Driver 混着用。第三种是光模块里的 laser driver属于光电转换链路的一部分和铜缆 PCIe 信号链关系不大。需要特别强调这里的 Driver 指的是硬件信号驱动和操作系统里的设备驱动完全是两码事。有时候搜资料会看到 nvidia driver、snappy driver 之类的结果那些是软件层面的别混淆。3. 把五类器件摆到一张表上对比光靠文字描述容易记混下面用表格把关键维度列出来这是我平时给团队做培训时用的版本。3.1 核心特性对比器件类型是否重定时典型延迟是否透明需要参考时钟参与链路训练典型用途Redriver否模拟亚纳秒到几纳秒完全透明不需要否短距 slot 前级、NVMe riserRetimer是CDR十几到几十纳秒部分透明需要是背板、cable、长链路Buffer时钟否皮秒级透明自身即时钟源否100MHz 参考时钟扇出Switch不适用百纳秒量级不透明需要是枚举拓扑扩展、多设备扇出Driver时钟否皮秒级透明自身即时钟源否时钟分发、扇出3.2 选型决策的三个判断维度看到一个新链路问题我通常按这三个维度快速判断损耗量末端总损耗在预算的 70% 以内优先优化 PCB 不加器件70%-95%上 Redriver 试超过预算或者要走背板直接上 Retimer。距离与介质纯 PCB 几英寸Redriver 够超过 15 英寸或者涉及连接器、cableRetimer 更稳。功能需求只是补损Redriver/Retimer要分叉Switch要分时钟Buffer/Driver。注意Retimer 和 Redriver 可以混用链路上同时放一颗 Retimer 加一颗 Redriver 是合法方案前提是损耗预算要重新分配不能简单相加。4. 选型实战从损耗预算算到具体放置位置光讲概念不够下面用一个接近真实的例子把整个选型过程走一遍。假设我们要做一块 Gen5 的加速卡底座CPU 到一个 PCIe slot 之间要经过连接器和一段 riser cable。4.1 损耗预算的具体计算先建立损耗清单数值是量级实际要用厂商的 S 参数模型跑仿真CPU 封装 焊球约 2dB 16GHz主板走线 6 inch 约 1dB/inch约 6dB板对板连接器一对约 3dBriser cable 4 inch约 4dB加速卡封装约 2dB加起来大约 17dB。Gen5 预算 36dB看起来还有余量不对这只是典型值加上阻抗不连续、过孔 stub、连接器谐振实际全频段积分损耗可能到 25-28dB这时候未必要 Retimer但 Redriver 是明显需要的因为它能补 8-12dB把眼图重新拉开。如果换成 20inch 走线加 8inch cable再加两组连接器损耗直接冲到 40dB 以上那就必须用 Retimer因为 Redriver 的补偿能力顶不住而且高频抖动累积问题会显现。4.2 Redriver 的增益和 EQ 设置怎么定以常见的某款线性 Redriver 为例它的可配置参数主要有三块CTLE 增益对应高频补偿量需要和链路的高频损耗斜率匹配。链路的损耗斜率如果是 1dB/inch红外那种缓慢下降的曲线用低档就够如果是连接器带来的陡峭衰减就需要高档 CTLE。输出预加重De-emphasis减小低频、突出高频让远端眼图更平衡。输出摆幅不是越大越好过大反而会让接收端饱和失真。设定方法建议这样走先用 VNA 或者仿真拿到链路 S21 曲线看清楚 16GHz 相对低频掉了多少 dB然后按掉幅的 70%-80% 设置 CTLE 增益。剩下的余量让接收端自己的 CTLE 去补不要全吃掉。这一步如果搞反了会形成过均衡眼图反而更差。举个具体数字链路在 16GHz 衰减 -15dB 相对 1GHz那 Redriver 的 CTLE 就设 10-12dB 区间留 3-5dB 给接收端。这样搭配下来误码率是最低的。4.3 Retimer 放置位置与参考时钟架构的选择Retimer 的位置很有讲究。放在链路中点附近最优因为它把整段损耗切成两半前面一半和后面一半都在各自能力范围内。放在靠近发送端或者接收端都会让另一半链路吃亏。参考时钟架构要提前定清楚Common Clock上下游和 Retimer 共用一路 100MHz 参考用 Buffer 扇出保证同源抖动最小推荐优先。Separate ClockRetimer 用自己的本地时钟源链路两侧时钟独立。这种架构在 SRISSeparate Refclk Independent SSC场景下常见但要注意 ppm 差异和 SSC 处理。我踩过的坑就是 sample 阶段图省事Retimer 用了一颗单独晶振结果链路只训练到 Gen4上不去 Gen5。后来改成从主板 buffer 分发 common clock一次就上去了。所以时钟架构一定要在方案阶段就定死改板成本太高。5. 调试与问题排查实录链路出了问题80% 的坑都集中在训练、时钟和均衡这三块。下面把常见现象和排查顺序整理出来。5.1 链路训练失败或降速的排查顺序遇到链路训练不到目标速率按这个顺序查效率最高先确认参考时钟是否正常用示波器测 100MHz 差分对看幅度、频率、抖动。Retimer 的参考时钟要求比普通器件更严格相位抖动超标会直接导致 CDR 锁不住。读取 LTSSM 状态通过 CPU 或 Switch 的调试接口读链路状态机看卡在哪一步。常见是卡在 Polling 或 Configuration说明物理层没握手成功。检查 Redriver/Retimer 的配置寄存器EQ 增益、输出摆幅是否合理有没有被误配成旁路模式。跑眼图和 BERT如果训练能上但误码率超标就要用示波器抓眼图看是过均衡还是均衡不足。确认 SSC 处理如果链路两侧有一方开了 SSCRetimer 必须支持 SSC passthrough 或对应处理否则训练会随机失败。5.2 常见问题与排查速查表现象可能原因排查动作只能训练到 Gen1/Gen2链路损耗超标或 EQ 未配置测 S21调 CTLE间歇性降速参考时钟抖动或 SSC 配置不一致测时钟质量确认 SSC训练偶发失败电源纹波大Retimer CDR 不稳测 Retimer 供电纹波误码率高过均衡或输出摆幅过大降 CTLE降摆幅枚举不到设备Switch 配置或 PCIe 时钟未到位读 Switch 寄存器测时钟5.3 几个我用真金白银换来的经验经验一不要迷信规格书上的支持 Gen5。很多器件宣传自己支持 Gen5但实际要看它在 16GHz 的 EQ 能力和抗抖动指标不同型号差距很大。选型时必须拿到 S 参数模型自己跑仿真别只看标签。经验二Redriver 和 Retimer 混搭时延时要重新评估。如果链路里既有 Redriver 又有 Retimer总延迟会叠加P2P 场景要算清楚。另外 Redriver 放在 Retimer 前面还是后面对抖动和眼图的影响也不一样一般建议 Redriver 靠发送端、Retimer 靠中间。经验三电源对 Retimer 的影响远超想象。Retimer 内部是敏感的 CDR 和 PLL供电噪声会直接转成时钟抖动。实测下来把 Retimer 的供电纹波从 30mVpp 压到 10mVpp 以内误码率能改善一个数量级。所以 Retimer 的电源去耦一定要做扎实多放几颗小容值电容靠近引脚。经验四Switch 的 ACS 设置会闷死 P2P。如果你用 Switch 做 GPU 之间的 P2P 通信默认配置下 ACS 往往会把 P2P 流量强制绕到 RC性能暴跌。要记得按需求调整 ACS 位允许直接转发。经验五Buffer 的附加抖动要看标准。时钟 Buffer 的 datasheet 一般给两种附加抖动指标一种按 12kHz-20MHz 积分一种按 PCIe 规范带宽积分。买的时候要对齐别拿错指标去对比很多供应商在这上面玩文字游戏。说到底这五类器件的本质区别就是一句话Redriver 是模拟整形Retimer 是数字重建Buffer 管时钟扇出或者只是 Redriver 的别名Switch 管拓扑扩展Driver 管信号和时钟的驱动输出级。把这些边界划清楚选型和调试都不会跑偏。我个人的体会是链路预算能省就省、能不加器件就不加每多加一颗都要为它准备相应的时钟、电源和配置方案阶段的权衡远比事后调试划算。如果你正在做 Gen5 甚至 Gen6 的设计建议在原理图定稿前就把 S 参数仿真跑完把损耗账算到每一段后面会省下大量时间。