1. 为什么电源工程师要操心跳过协议的PCIe
先讲一个我自己的经历。几年前有块定制服务器主板要改版,我负责电源那一摊,自认为只要把各路电压的纹波、时序、效率做好就万事大吉。结果系统联调时,插上一块高功耗加速卡,开机直接触发过流保护,整机爬不起来。排查到最后,问题不在12V输出能力,而在PCIe插槽的供电分配和卡的上电时序配合上。从那以后我就明白,做服务器电源,完全绕不开PCIe。
很多人觉得PCIe是高速信号的事,是逻辑工程师和硬件工程师的战场。这句话对了一半。PCIe在物理上是一个总线接口,但在系统层面,它同时定义了数据通道、工作状态和供电边界。你的电源设计最终要落到PCIe卡上:插槽给卡供多少瓦、辅助供电怎么接、卡在休眠和唤醒之间切换时负载怎么跳变、热插拔瞬间的浪涌电流怎么抑制。这些问题全部压在你电源工程师肩上,不是你不想碰就能不碰的。
这篇文章的目标读者,就是像我一样以电源为主业、但没时间啃完几百页具体协议文档的工程师。我会直接用电源的视角,把PCIe里跟供电、功耗、时序、可维护性相关的部分拆出来讲清楚。读完你会发现,协议栈里那些TLP、DLLP之类的概念你完全可以当不存在,但有几张表、几个时间参数、几个功率边界,你是必须烂熟于心的。
哪些是"该背的"?一言以蔽之:跟瓦特、伏特、安培、时序相关的。哪些是"不该背的"?数据包怎么组、重传怎么处理、仲裁怎么调度。电源工程师只需要知道链路在什么速率、什么宽度下工作,以及它对应什么功率等级和电源管理状态。拿这个标准去圈范围,PCIe对电源人来说就是一个很清爽的题目,远没有传闻中那么吓人。
2. PCIe链路基础:电源工程师需要知道的几个数字
2.1 从一条lane到x16:链路宽度决定什么
PCIe的基本物理单元叫lane,中文常译作通道,本质是一对差分发送线加一对差分接收线。一个lane可以同时收发,所以是全双工。设备之间可以只用一条lane,也可以并联多条lane,常见组合有x1、x2、x4、x8、x16,读作"乘一""乘十六"。
你只需要留下一个印象:lane数量越多,接口越宽,卡能占用的物理空间和供电需求通常也越大。x1多用于网卡、低端扩展卡,x16几乎专属于GPU、高规格加速卡、NVMe AIC。服务器里最常见的x16,也是功耗大头。对于电源设计,链路宽度直接和插槽功率上限绑定,这点下一节细讲。
2.2 速率代际:GT/s不是Gbps
PCIe从最早的Gen1一直走到现在,普通人最容易混淆的就是速率单位。规范里用的单位是GT/s,也就是每秒十亿次传输。它不是我们熟悉的Gbps,因为中间还有编码开销。
早期Gen1用的8b/10b编码,每传8比特数据要额外带2比特开销,所以2.5GT/s实际有效带宽只有2Gbps左右。到Gen3以后换成128b/130b编码,开销降到约1.5%,16GT/s就能给出约14Gbps以上的有效带宽。
作为电源工程师,你真正需要关心的不是带宽算术,而是速率代际带来的功耗和噪声敏感度变化。越高代际的链路,信号幅度更小、边沿更快,对电源纹波和噪声的容忍度越差。如果板级设计把PCIe高速对的电源和别的负载混在一起,供电质量稍差就可能让链路误码率上升,表现就是系统里设备莫名其妙掉链子。这种事在实验室里非常常见,最后查出来不是信号走线问题,而是电源纹波超标。
我给你一张简化表,直接存到工作笔记里就行:
| 代际 | 单lane传输速率 | 有效数据速率约 | 编码方式 | 典型应用 |
|---|---|---|---|---|
| Gen1 | 2.5 GT/s | 2 Gbps | 8b/10b | 老设备、兼容测试 |
| Gen2 | 5 GT/s | 4 Gbps | 8b/10b | 部分存储和网卡 |
| Gen3 | 8 GT/s | 约7.9 Gbps | 128b/130b | 服务器主流很长一段时间 |
| Gen4 | 16 GT/s | 约15.8 Gbps | 128b/130b | 当前服务器主力 |
| Gen5 | 32 GT/s | 约31.5 Gbps | 128b/130b | 新一代平台 |
| Gen6 | 64 GT/s | 约63.9 Gbps | 1b/1b+PAM4 | 前沿平台 |
3. 供电设计的第一张表:PCIe插槽与辅助供电的功率边界
3.1 75W插槽供电的来龙去脉
标准PCIe插槽本身能提供的功率,规范定义大约为75W,其中12V最多贡献66W左右,3.3V贡献其余部分。这个数字怎么来的?插槽引脚数量有限,电流引脚有载流上限,连接器和PCB走线还要考虑压降与发热。75W是兼顾机械尺寸、引脚载流和可靠性的结果。
实际设计时,我不建议你去想把12V到底算69W还是66W这类细节,只要记住"单插槽75W"这个锚点。很多工程师犯的错误,是以为把插槽的12V引脚拉到足够粗就一定能持续给到75W。这在理论上是成立的,但你还要考虑整个服务器背板的总功率预算、插槽附近PCB的铜厚、以及连接器本身的额定电流。尤其是PCIe Riser卡这种结构,先经过一个转接座,再走一段PCB,如果铜箔宽度不足或者过孔数量不够,电压跌落会导致高功耗卡满载掉压,轻则性能下降,重则直接复位。
3.2 6pin和8pin辅助供电的正确理解
超过75W的卡,靠插槽就不够了,于是有了辅助供电连接器。传统的6pin额定75W,8pin额定150W。注意"额定"这个词,它指的是连接器和线缆在通用环境下的安全载流能力,不代表卡一定会消耗这么多,更不代表你随便拿个电源就能超规格硬扛。
有些显卡或者加速卡会有双8pin、甚至三8pin供电,那是厂商为了应对瞬态功耗和合规裕量设计出来的。服务器场景里大型加速卡往往通过8pin或12VHPWR接口供电,你需要根据整卡峰值功耗来算输入电流。以单张卡350W为例,12V电流接近30A,如果主板供电走线和连接器压降大,卡端电压可能跌到11.4V以下,已经接近ATX规范里12V的容差下限。
我实际做过的某项目里,遇到过一块跨平台加速卡,设计上需要x16插槽75W加双8pin共375W。结果我们最初只用额定8A的连接器,满载跑压力测试时连接器表面温度直接冲到90度以上,后来才意识到是连接器在服务器密闭风道里散热条件比开放机箱差太多,被迫整体降额设计。
3.3 高功耗卡时代的供电变化
如果你做的是新一代服务器电源,一定会遇到12VHPWR这类新接口,它在消费市场叫16pin,标称600W。服务器方向上,供电越来越集中到12V单路,3.3V主要给控制、管理电路使用。
这里给一个原则性建议:设计PCIe供电时,不要只看卡的平均功耗,一定要留出1.2到1.5倍的峰值裕量,并且验证动态响应。很多卡在负载突变的瞬间会吃掉远高于平均值的电流,而这种跳变正好发生在电源管理状态切换的瞬间,也就是下一节要讲的L0和L1状态切换。
4. 功耗管理状态与ASPM:为什么你的电源在待机时还在耗电
4.1 L0、L0s、L1、L2这些状态在电源眼里是什么
PCIe链路的电源管理状态,对逻辑工程师来说是一堆状态机,对电源工程师来说就是一句话:你的电源在不同时间点要提供给设备多大的电流。
先记四个状态:
- L0:正常工作状态,链路全速收发,功耗最高。
- L0s:链路空闲时快速进入的待机状态,恢复快,但省电效果有限。
- L1:链路深度休眠,时钟和电路大量关闭,功耗显著降低。L1下面还有L1.1和L1.2子状态,L1.2连参考时钟都停掉,省电效果最好,但唤醒延迟也最长。
- L2/L3:主电源基本关闭,设备只剩辅助电源供电,用于做唤醒检测,功耗极低。
L2/L3这地方是电源工程师的主战场。PCIe设备在L2状态仍然需要3.3V辅助供电来维持唤醒逻辑,如果你在做整机待机功耗预算,一定要把插槽上所有设备的辅助供电电流加进去。我见过一个存储背板项目,40多个盘位,每个盘片的PCIe控制器在待机时吃几十毫安辅助电流,几十个加起来,愣是把待机功耗从目标值里吃掉了一大块,最后不得不退回更深的设备电源状态才压回来。
4.2 ASPM到底是谁说了算
很多服务器工程师对ASPM这个词又爱又恨。爱是因为它确实省电,恨是因为某些设备在ASPM开启后会因为时钟或电源问题出现链路不稳定。
ASPM全称Active State Power Management,直译就是活动状态电源管理。它本质上是一套硬件自动协商机制。OS和系统固件允许ASPM之后,链路在空闲时不需要软件干预,硬件自己就能把链路压到L0s或L1。省电效果明显,但对电源设计提出了一个隐形要求:恢复时要有能力处理电流突变。
举个例子,一个NVMe盘平时在L1.2状态几乎不耗电,主机一个IO下来,要求它几百微秒内切回L0并完成数据传输。对盘端电源来说,这就是一个从毫安级到安培级的电流阶跃。如果盘上的电源管理芯片动态响应慢,电压跌落超过允许范围,轻则触发复位,重则数据出错。服务器电源工程师如果只按稳态额定电流选型和测试,这种瞬态问题很难在早期暴露。
做服务器整机时,我的建议是:如果你发现整机待机功耗超标,不要只盯着主电源的效率,也要检查PCIe设备是否真的进入了L1.2或L2。很多设备因为驱动或固件配置问题,实际停在L0s而不是L1,功耗会差一个数量级。用功率计确认待机功耗,再逐一移除PCIe设备做对比,就能精确找到耗电大户在哪。
5. 上电时序、浪涌与热插拔:最容易踩的电源坑
5.1 PERST#信号和电源稳定时间的配合
PCIe设备复位信号叫PERST#,它直接控制设备是否开始初始化链路。规范要求PERST#必须在电源稳定之后释放,具体时间要求是电源达到稳定工作范围后至少延迟100ms,另外在PERST#下降沿之前也要保证电源已经持续稳定了一段时间。
这句话翻译成电源工程师的话就是:你的电源输出不能和PERST#释放同时发生,必须先稳定,再放行。很多主板和扩展板设计时,会用电源好信号(PG)去控制PERST#时序,就是为了保证这一点。
我在某次修改存储背板设计时,曾经忽略了这个时序配合,以为只要12V和3.3V起来了,盘片就能直接工作。结果固件调试时发现盘片初始化经常超时,后来在示波器上抓时序,发现PERST#释放时3.3V还在爬升尾巴上。调整了电源好信号的延迟之后,问题就消失了。这类问题最坑的地方在于它不是每次都复现,时好时坏,让人很难第一时间联想到电源时序。
5.2 热插拔的浪涌:像个突发的洪水
服务器PCIe插槽的一大卖点就是支持热插拔。工程师拿着卡,往运行中的服务器插槽里一推,卡就识别了。但这个过程对电源来说就是一场小型的灾难演练。
卡插入瞬间,插槽引脚由短到长依次接触,接地引脚先接通,然后是电源引脚,最后是信号引脚。这样设计是为了避免信号线上带电插拔产生损坏,但对于电源通路来说,电源引脚接通的一瞬间,卡的输入电容相当于从零开始充电,会产生极大的浪涌电流。
如果一个高功耗卡上有几千微法的电容,热插拔瞬间的浪涌电流可能达到几十上百安培,持续时间几百微秒。这股电流会让连接器打火、PCB敷铜过热,甚至把前级电源模块的保护电路打掉。
标准做法是给卡端加热插拔控制器,或者至少做软启动,用MOS管和RC延时把电容充电电流限制在合理范围内。如果你在做服务器主板端,一定要在插槽前级预留足够的旁路电容和电流检测点,不然排查浪涌问题时会很痛苦。我见过某公司的一块背板,为了省成本省掉了输入软启动电路,第一批样品在客户那里热插拔测试就烧掉了三块卡,最后全部返工。省下的成本还不够一次远程更换的差旅费。
5.3 插入检测与管理通道的电源含义
PCIe插槽上有一组叫PRSNT#的引脚,用来让系统感知卡是否插入。卡插入后,PRSNT#被拉低,热插拔控制器和BMC之类管理单元就会启动电源建立流程。
这里有一个容易被忽略的点:给PRSNT#供电的电源域必须始终保持有效,不能跟主12V开关绑在一起。卡拔出后,管理单元还要保持工作状态上报事件。所以在服务器主板上,用于热插拔检测的控制电路通常挂在3.3V辅助电源上,也就是常说的AUX电源。凡是跟热插拔相关的控制、指示、检测电路,一律不考虑用主电源,这点务必在原理图设计阶段就刻进脑子里。
6. 实测验证:示波器与功率计的使用要点
6.1 测PCIe电源纹波的正确姿势
很多工程师测12V纹波时习惯随手拿个普通探头,地线夹子拉得老长。这在低速电路上可能糊弄过去,但PCIe设备动不动就是几十安培的动态电流,地线环路稍大,抓到的全是噪声,根本分不清是电源的问题还是测量方法的问题。
正确做法是用差分探头或者在探头尖端接一个弹簧地,把测量环路缩到最小。带宽建议至少开到500MHz,因为PCIe高速链路对电源高频噪声敏感。测量点要选在PCIe插槽端子的根部,离卡最近的位置,不能挑电源模块输出电容上测,那里的电压与卡端实际电压可能有几十毫伏甚至上百毫伏的差异。
我在实验室的习惯是:先测稳态纹波,再测动态负载,最后做连续热插拔压力测试。稳态通过不代表动态通过,动态通过不代表热插拔扛得住,几个测试要分开做,记录各自的波形和数据。
6.2 用电子负载模拟PCIe卡的负载跳变
PCIe设备在L0和L1之间切换时,电流变化率非常快。实测时,如果没有真实卡,就用电子负载的动态模式来模拟。设定一个从低电流跳到高电流的波形,上升时间设在几十微秒级别,重复频率低一些,然后观察12V跌落幅度是否超过规范容差。
以12V为例,ATX规范里容差通常为±5%,也就是11.4V到12.6V。动态负载造成的跌落如果低于11.4V,就是不合格。要注意,很多电子负载的动态模式在高电流跳变时本身就会引入电压尖峰,所以要先标定负载本身的性能,再下结论。
如果测出来跌落超标,优先检查插槽前级的输入电容是否足够,其次检查电源模块的环路带宽和控制模式,最后再检查PCB走线的寄生电感。顺序不要反,因为多数情况下问题出在局部电容和走线,而不是远端电源模块本身。
6.3 用功率计确认ASPM是否真的生效
IPC和BMC配置里能开到ASPM,不代表实际就能进入L1.2。要验证很简单:用功率计记录整机在不同状态下的输入功率,然后对比插卡和不插卡、开启和关闭ASPM之间的差值。
有个更直接的方法,就是看单槽位的辅助电源电流。卡在L2状态时,12V几乎为零,3.3V辅助电流很小,通常在几十毫安到几百毫安之间。如果测出来远超这个量级,说明卡根本没有进入深睡眠。这时候不要急着怪电源,多半是卡的驱动配置、SolidWorks或者系统固件的PCIe电源管理策略问题。
我自己的经验是:做服务器电源测试时,一定要留出"状态切换"这一项。很多奇怪的问题,比如某块卡在系统重启后找不到设备,其实是L2复活过程中主电源建立过快,卡的复位释放却又太晚,导致链路训练超时的窗口问题。这类问题靠信号分析仪未必抓得到,反而是用示波器同步抓12V和PERST#最直接。
6.4 一张快速自检清单
最后给一张通用自检清单,适合在投板前过一遍:
- [ ] 检查所有PCIe插槽的12V和3.3V供电是否满足规范引脚定义
- [ ] 确认PRSNT#和PWRBRK#相关控制电路挂在辅助电源域
- [ ] 确认PERST#释放时序比电源稳定时间晚至少100ms
- [ ] 按整卡峰值功耗留足1.2到1.5倍电流裕量
- [ ] 用电子负载动态模式测试L0到L1切换时的电压跌落
- [ ] 热插拔测试至少连续20次,记录连接器温升和浪涌波形
- [ ] 实测待机功耗,确认PCIe设备进入了目标电源状态
这几项全部过一遍,不敢说万无一失,但绝大多数与PCIe相关的电源问题都能在设计阶段暴露出来,而不是等到客户现场再抓狂。
实际上,我现在拿到一块新服务器主板或者背板,第一件事就是看PCIe供电部分有没有遵循这些基本规则。数据协议那一层有专门的工程师跟,我守好瓦特、伏特、安培和时序这四分地,大家配合起来反而顺。你做电源这行,终究绕不开PCIe这个坎,与其等出问题再学,不如先把这几个数字刻进脑子,遇到情况时能多一条排查方向。