
1. 项目背景与设计动机拆解1.1 为什么要做SXM2转PCIe这件事手里攒了几块SXM2接口的计算卡想塞进普通ATX机箱里用起来这事儿在二手硬件圈子里不算新鲜。SXM2这个接口本身是板对板的高速连接器原本设计是直接贴在服务器主板上的通过一套完整的供电和散热体系来支撑。但问题在于普通玩家手里根本没有对应的服务器主板而那些板子往往又大又贵功耗和噪音也不是家用环境能接受的。于是把SXM2转成标准PCIe插槽这个需求就冒出来了。这个转接卡要解决的核心问题其实有三个层面。第一是物理接口的转换SXM2的板对板连接器和PCIe金手指在引脚定义、间距、固定方式上完全不同需要一块PCB来做中介。第二是供电SXM2模组的功耗远超标砖PCIe插槽能提供的75W必须引入外部供电。第三是NVLink信号SXM2模组之间的高速互联走的是NVLink协议如果要做多卡互联这部分信号也得引出来并且保证完整性。我最初接触这个需求是帮朋友折腾一套双卡配置他手里有两块SXM2的计算卡想组一个低成本的计算节点。市面上的成品转接方案要么价格离谱要么只支持单卡NVLink直接没引出来。所以决定自己画一版把供电、散热和NVLink都考虑进去。1.2 目标用户与适用场景这个转接卡设计主要面向几类人。一是手里有SXM2模组但缺少配套主板的硬件爱好者想把这些计算卡利用起来做推理或者训练。二是做小规模算力集群的团队需要一种低成本的SXM2部署方案。三是对高速信号完整性感兴趣的硬件工程师想拿这个项目练手NVLink这种超高速差分信号的PCB设计。适用场景包括单卡工作站、双卡NVLink互联的计算节点以及需要多卡但预算有限的实验室环境。不过要提前说清楚这不是一个即插即用的消费级产品涉及到外部供电改造、散热方案定制和BIOS层面的兼容性调试需要一定的动手能力和硬件调试经验。1.3 方案选型背后的取舍逻辑做这个转接卡第一个要决定的就是PCB层数和叠层结构。SXM2的引脚密度非常高NVLink信号速率在25Gbps以上PCIe Gen4也是16Gbps的速率。这种级别的信号双层板想都不要想四层板勉强能跑PCIe但NVLink肯定废。最终选择的是六层板方案叠层结构是信号-地-信号-信号-地-信号把高速信号夹在地平面之间保证有完整的参考平面。连接器的选择也很关键。SXM2那一侧的连接器必须和模组上的公座匹配这个在市面上能买到的型号不多需要确认间距和引脚数。PCIe那一侧用的是标准的x16金手指但要注意金手指的厚度和镀金质量劣质金手指插拔几次就接触不良了。NVLink的输出用的是高密度差分连接器选的是0.5mm间距的板对板连接器支持差分对走线。供电方案上最初考虑过直接从PCIe插槽取电加上辅助供电但算了一下功耗就放弃了。SXM2模组的峰值功耗可以到300W以上PCIe插槽的75W加上一个8pin的150W也不够稳定。最后用的是双8pin外接供电通过多相Buck电路转换成模组需要的各路电压。这个后面会详细展开。2. 供电系统设计与实操要点2.1 SXM2模组的供电需求分析SXM2模组的供电不是单一电压而是多路电源轨。以常见的计算卡为例核心电压通常在0.8V到1.1V之间电流可以到200A以上。显存供电一般是1.35V左右电流也在几十安培。还有1.8V的辅助电压和3.3V的IO电压。这些电压的时序也有要求核心电压和显存电压的上升顺序不能乱否则可能触发模组的保护机制甚至损坏芯片。我在设计供电的时候第一步就是确认模组的供电规格书。不同型号的SXM2模组供电需求差异很大不能照搬。比如有的模组核心电压是0.85V有的是1.0V电流需求也不一样。这个必须拿到准确的规格参数才能开始设计否则后面全是白费功夫。供电的另一个关键是动态响应。计算卡在跑推理或者训练的时候负载变化非常剧烈电流可能在微秒级别内从几十安培跳到两百安培。如果供电电路的瞬态响应跟不上电压就会跌落轻则降频重则死机。所以输出电容的选型和布局非常关键要用低ESR的陶瓷电容加上大容量的聚合物电容组合并且尽量靠近模组的供电引脚放置。2.2 多相Buck电路的设计与器件选型核心供电用的是多相Buck拓扑选了八相控制器搭配DrMOS功率级。为什么用八相而不是四相因为八相可以把每相的电流降到25A左右这样电感和小型化的MOSFET都能用散热也更好处理。四相的话每相要扛50A以上电感和MOSFET的尺寸都得加大布局难度上升不说热集中问题也更严重。控制器选的是支持PMBus的型号这样可以通过I2C接口实时监控每相的电流、电压和温度。调试的时候这个功能太有用了能直接看到哪一相负载不均或者温度异常。DrMOS选的是耐压30V、导通电阻在5毫欧以下的型号开关频率设在400kHz左右。频率太高开关损耗大太低的话电感体积又上去了400kHz是个比较平衡的点。电感的选型要注意饱和电流。每相25A的直流电流峰值可能到30A以上电感的饱和电流至少要留30%的余量也就是选40A以上的。感值方面算下来每相用0.22微亨比较合适纹波电流控制在直流电流的30%左右。输出电容用了22颗100微法的陶瓷电容加上4颗470微法的聚合物电容总容量超过4毫法ESR控制在1毫欧以下。2.3 供电时序控制与保护电路多路电压的上电时序不能乱来。一般的要求是3.3V和1.8V先上然后是显存电压最后是核心电压。掉电的时候顺序反过来。这个时序控制可以通过电源管理IC来实现也可以用CPLD或者单片机来做。我用的是电源管理IC自带的时序控制功能通过配置电阻设定每路的延迟时间。保护电路方面每一路输出都加了过流保护和过压保护。过流保护是通过检测DrMOS的电流反馈来实现的阈值设在额定电流的1.5倍。过压保护用的是比较器加锁存器的方式一旦检测到输出电压超过设定值的15%就立刻拉低使能信号关断输出。还有温度保护在电感附近放了NTC热敏电阻温度超过100度就触发降额或者关断。注意调试供电的时候千万不要直接上模组先用电子负载测试每一路输出的电压精度和纹波。确认没问题了再接模组否则一旦电压异常可能直接烧掉昂贵的计算卡。2.4 外接供电接口与线缆选择外接供电用的是两个8pin的PCIe供电接口每个接口能提供150W的功率两个加起来300W。但实际使用中建议留余量因为电源的8pin接口标称150W是在特定条件下的实际能稳定输出的可能只有120W左右。所以如果模组峰值功耗超过250W建议用三个8pin或者改用服务器电源的供电接口。线缆的选择也不能马虎。从电源到转接卡的供电线截面积至少要18AWG长度尽量控制在30厘米以内。线太长或者太细都会导致压降模组端看到的电压可能比电源输出低0.1V以上在大电流下这个压降会严重影响稳定性。我实测过用20AWG的线在200A电流下压降超过0.15V后来换成16AWG才解决问题。转接卡上的供电输入部分要加足够的滤波电容防止线缆电感引起的电压振铃。每个8pin接口旁边放了两个470微法的电解电容和一个10微法的陶瓷电容用来吸收线缆电感带来的高频噪声。3. 散热方案设计与实测数据3.1 SXM2模组的散热特点与挑战SXM2模组的散热和普通PCIe显卡完全不同。普通显卡有风扇和散热器直接吹就行了。SXM2模组通常是一个裸芯片加上均热板需要外部提供强制风冷或者液冷。而且SXM2模组的发热密度极高核心面积小但功耗大热流密度可以超过100瓦每平方厘米。这意味着散热器的接触面和导热材料的性能非常关键。我一开始想用普通的CPU散热器改一下但发现接触面压力不够而且SXM2模组的固定孔位和CPU散热器完全不匹配。后来定制了一块铜质均热板厚度5毫米上面焊接了铝质鳍片。均热板和模组之间用的是相变导热垫厚度0.2毫米导热系数标称12瓦每米每开尔文。散热器的固定方式也很讲究。SXM2模组对安装压力有要求压力不够导热垫接触不良压力太大又可能压裂芯片。我用的是一套弹簧螺丝通过调整弹簧的压缩量来控制压力。实测下来每个螺丝的扭力控制在0.3牛米左右比较合适四个螺丝均匀拧紧不要一次拧到底。3.2 风冷与液冷方案的对比实测风冷方案用的是两个92毫米的高静压风扇转速3000转串联推拉。实测在室温25度、模组满载250W的情况下核心温度稳定在78度左右显存温度82度。这个温度对于计算卡来说是可以接受的但风扇噪音比较大双风扇全速运转的时候噪音超过50分贝。液冷方案用的是120毫米冷排加上定制的水冷头。水冷头的接触面是纯铜镀镍内部有微水道。实测同样条件下核心温度降到了62度显存温度68度。噪音方面水泵加上冷排风扇的噪音在35分贝左右比风冷安静很多。但液冷方案的成本高不少而且有漏液风险需要定期检查管路。散热方案核心温度显存温度噪音成本维护难度双92mm风冷78°C82°C50dB低低120mm液冷62°C68°C35dB高中从数据看液冷优势明显但如果你只是偶尔跑一下计算任务风冷完全够用。液冷更适合长时间满载运行的场景。3.3 散热器安装的注意事项与踩坑记录安装散热器的时候踩过一个大坑。第一次装的时候导热垫没撕保护膜结果开机温度直接飙到95度然后降频。拆下来一看导热垫还是崭新的保护膜完好无损。这个错误听起来很低级但在实际操作中真的很容易犯尤其是晚上熬夜装机的时候。另一个坑是螺丝拧紧的顺序。SXM2模组的固定孔是对角分布的必须按照对角顺序逐步拧紧每次拧半圈分三轮拧到位。如果一次性把一个螺丝拧死模组的PCB可能会因为受力不均而弯曲严重的话会导致BGA焊点开裂。我朋友的一块模组就是这么废掉的教训惨痛。还有一点是风扇的供电。转接卡上预留了风扇接口但风扇的启动电流比较大如果直接从转接卡取电可能会拉低其他电压。建议风扇单独从电源取电或者用转接卡上的风扇接口但加一个缓启动电路。我试过用转接卡直接带两个3000转的风扇结果开机瞬间12V电压跌到10.5V模组直接启动失败。3.4 温度监控与动态调速实现转接卡上预留了I2C接口可以接温度传感器。我在均热板旁边和供电电感附近各放了一个TMP102温度传感器通过I2C读到单片机再由单片机控制风扇的PWM信号。调速曲线是这样的温度低于50度风扇停转50到70度线性升速70度以上全速。这个调速逻辑是用单片机实现的代码很简单就是一个查表加线性插值。但要注意风扇的PWM频率一般用25kHz比较好太低会有可闻噪音太高有些风扇可能不兼容。我试过用1kHz的PWM风扇发出明显的嗡嗡声换成25kHz就安静了。温度监控的数据还可以通过串口输出到电脑上方便实时观察。我写了一个简单的Python脚本用pyserial读串口数据然后画温度曲线。调试散热方案的时候这个工具帮了大忙能直观看到不同负载下的温度变化趋势。4. NVLink信号完整性设计与仿真4.1 NVLink信号的基本特征与设计难点NVLink是高速差分信号SXM2上的NVLink版本通常是每通道25Gbps或者50Gbps。差分对的阻抗要求是100欧姆允许偏差正负10%。信号从模组出来经过连接器、PCB走线、再到另一块模组整个链路的损耗必须控制在一定范围内否则眼图会闭合误码率上升。设计难点主要有三个。第一是连接器的阻抗不连续SXM2连接器的引脚间距很小差分对在连接器内部的阻抗和PCB上的阻抗不匹配会产生反射。第二是PCB走线的损耗25Gbps的信号在FR4板材上的损耗大约是每英寸0.5dB如果走线太长损耗会累积。第三是串扰NVLink的差分对之间距离很近如果走线平行距离过长近端串扰和远端串扰都会影响信号质量。为了解决这些问题我在PCB设计上做了几件事。差分对的走线尽量短从连接器到NVLink输出连接器的距离控制在50毫米以内。差分对的间距保持3倍线宽以上减少串扰。在连接器焊盘下面挖空参考平面补偿连接器带来的阻抗不连续。走线用了弧形转角而不是45度角减少阻抗突变。4.2 差分对走线与阻抗控制实操差分对的阻抗控制是PCB设计中最核心的部分。我用的板材是FR4介电常数在4.3左右。要得到100欧姆的差分阻抗需要根据叠层结构计算线宽和间距。六层板的叠层是顶层信号-地-信号-信号-地-底层信号。NVLink走线放在顶层和底层参考第二层和第五层的地平面。用Polar SI9000算了一下线宽0.15毫米、间距0.2毫米的时候差分阻抗大约是98欧姆在允许范围内。但实际加工出来的板子阻抗会有偏差所以我在板子上放了阻抗测试条打样回来先用TDR测一下实际阻抗。实测结果是102欧姆偏差2%可以接受。走线的时候要注意差分对的两根线必须严格等长。长度偏差控制在5mil以内否则差分信号会转换成共模信号导致EMI问题。我用的方法是蛇形绕线来补偿长度差但蛇形绕线的幅度不能太大否则也会引入阻抗不连续。一般绕线幅度控制在3倍线宽以内。提示差分对过孔也是阻抗不连续的重要来源。如果NVLink信号需要换层尽量用两个过孔同时换并且在过孔旁边加接地过孔。过孔的焊盘尺寸要尽量小反焊盘尺寸要尽量大减少寄生电容。4.3 信号完整性仿真与眼图分析PCB打样之前我用ADS做了信号完整性仿真。仿真的流程是先提取走线的S参数模型包括连接器、走线和过孔。然后把S参数导入ADS的通道仿真器加上发送端的IBIS-AMI模型和接收端的模型跑眼图分析。仿真结果看在25Gbps的速率下眼高大约是150毫伏眼宽大约是0.6个UI。这个结果不算特别好但考虑到FR4板材的损耗已经可以接受了。如果要用50Gbps的NVLinkFR4肯定不够得换Megtron 6或者更高级的板材成本会翻好几倍。仿真中还发现了一个问题连接器焊盘处的阻抗不连续导致回波损耗在15GHz左右有个峰值。后来在焊盘下面挖了地平面回波损耗改善了大约3dB。这个优化在仿真里看很明显实际测试的时候眼图也确实好了一些。4.4 实际测试与常见信号问题排查板子回来之后用误码仪测了NVLink的误码率。在25Gbps下跑了一个小时误码率低于10的负15次方算是通过了。但测试过程中也遇到了一些问题这里整理一下排查思路。第一个问题是眼图闭合。一开始测的时候眼图几乎看不到后来发现是参考时钟的问题。NVLink需要一个参考时钟我最初用的是PCIe的100MHz时钟但NVLink对时钟的抖动要求更严格。换了一个低抖动的晶振之后眼图明显打开了。第二个问题是串扰。两块模组同时跑NVLink的时候误码率比单块高了一个数量级。用近场探头扫了一下发现是NVLink差分对之间的串扰。后来在差分对之间加了接地过孔墙串扰降低了大约10dB误码率也恢复正常了。第三个问题是连接器的接触不良。NVLink的高密度连接器对插拔次数有限制我反复插拔了十几次之后有一对差分信号的误码率突然升高。检查后发现是连接器的弹片变形了换了新的连接器就好了。所以调试的时候尽量少插拔或者用延长线来减少连接器的磨损。问题现象可能原因排查方法解决方案眼图闭合参考时钟抖动大用相位噪声分析仪测时钟换低抖动晶振误码率高差分对间串扰近场探头扫描加接地过孔墙信号时好时坏连接器接触不良检查连接器弹片更换连接器特定通道误码走线阻抗不连续TDR测试优化焊盘和过孔5. PCIe接口设计与兼容性调试5.1 PCIe金手指设计与信号引出PCIe那一侧用的是标准的x16金手指但SXM2模组出来的PCIe信号不一定是x16的。有的模组只引出x8有的引出x16但实际只用了x8的带宽。设计的时候我按照x16全引出这样兼容性最好。金手指的厚度选了1.6毫米的板厚这是PCIe卡的标准厚度。金手指的镀金厚度也很重要。太薄了插拔几次就磨穿了太厚了成本高。我选的是镀金厚度30微英寸这是行业里比较常见的规格。金手指的倒角也要注意一般是45度倒角方便插入插槽。倒角的角度和深度要符合PCIe CEM规范否则可能插不进去或者接触不良。PCIe的差分信号从SXM2连接器出来之后经过PCB走线到金手指。这段走线的阻抗也要控制在100欧姆差分对之间的间距要足够。因为PCIe Gen4的速率是16Gbps虽然比NVLink低但也不能马虎。我在走线的时候尽量让差分对走在同一层减少过孔换层。5.2 PCIe枚举过程与常见兼容性问题PCIe设备上电之后系统会进行枚举。枚举的过程是首先检测设备是否存在然后读取配置空间分配总线号和地址最后加载驱动。这个过程中如果任何一个环节出问题设备就无法被识别。我遇到的最常见问题是设备无法枚举。表现是开机之后系统里看不到设备lspci也找不到。排查下来有几个原因。一是参考时钟没有正确送到模组模组没有产生PCIe的时钟信号。二是PERST信号没有正确拉低模组没有复位。三是供电时序不对模组在PCIe枚举之前没有完成上电。还有一个问题是枚举成功但带宽不对。比如模组支持Gen4 x16但系统只识别到Gen1 x1。这个通常是信号完整性问题导致的链路训练失败。PCIe的链路训练会从Gen1开始逐步尝试更高的速率。如果高速率的信号质量不好链路就会降速。用lspci -vv可以看到当前的链路速率和宽度。注意PCIe的链路训练状态机LTSSM有多个阶段包括Detect、Polling、Configuration、Recovery等。如果链路训练失败可以用PCIe协议分析仪抓取LTSSM的状态转换定位问题出在哪个阶段。5.3 BIOS设置与系统兼容性调整不同主板对PCIe设备的兼容性差异很大。有的主板BIOS里有Above 4G Decoding选项这个必须打开否则大地址空间的设备无法识别。还有Resizable BAR选项如果模组支持的话打开可以提升性能。另外PCIe的速率可以手动设置如果Gen4不稳定可以降到Gen3试试。我在几块不同的主板上测试过。华硕的主板兼容性最好基本上插上就能识别。技嘉的板子有时候需要手动设置PCIe速率为Gen3。微星的板子遇到过一个问题就是Above 4G Decoding打开之后系统无法启动后来更新BIOS才解决。还有一个坑是电源的PCIe供电接口。有些电源的8pin接口不是标准的PCIe供电而是CPU供电两者的引脚定义不同。插错了可能烧毁转接卡。插之前一定要确认电源接口的标识PCIe供电一般是62pin的组合CPU供电是44pin。5.4 实测带宽与延迟数据用CUDA的bandwidthTest测了一下PCIe的带宽。在Gen4 x16下主机到设备的带宽大约是25GB/s设备到主机大约是27GB/s。这个数据接近Gen4 x16的理论上限说明信号完整性没问题。延迟方面用cudaMemcpy测的小数据包延迟大约是1.5微秒也在正常范围内。如果降到Gen3 x16带宽大约是12GB/s差不多是Gen4的一半。所以如果主板支持Gen4尽量用Gen4。但前提是信号完整性要过关否则链路训练失败反而会降到Gen1。NVLink的带宽也测了一下。双卡互联的情况下卡到卡的带宽大约是200GB/s双向延迟大约是0.5微秒。这个数据比PCIe高了一个数量级所以如果要做多卡训练NVLink是必须的。6. 常见问题排查与避坑经验汇总6.1 供电类问题速查供电问题是最容易出问题的环节也是后果最严重的。这里整理一个速查表方便快速定位。现象可能原因排查方法解决措施开机无反应供电时序错误用示波器测各路电压的上电顺序调整时序控制电阻满载死机供电瞬态响应不足用示波器测满载时的电压跌落增加输出电容某路电压偏低线缆压降过大测电源端和模组端的电压差换更粗的线缆供电发热严重某相负载不均用热像仪看各相温度检查DrMOS和电感随机重启过流保护误触发测电流波形看是否有尖峰调整过流阈值供电调试的时候示波器是必不可少的工具。最好用差分探头测电压避免地线环路引入噪声。测电流的话可以用电流探头或者采样电阻。我一开始用万用表测电压结果满载的时候万用表读数跳来跳去根本看不清后来换了示波器才看到电压上有几百毫伏的纹波。6.2 信号完整性类问题速查信号完整性问题比较隐蔽有时候设备能识别但性能不达标有时候干脆不识别。现象可能原因排查方法解决措施设备不识别参考时钟缺失测时钟信号是否有输出检查时钟电路链路降速信号损耗过大测走线损耗和眼图缩短走线或换板材误码率高串扰或反射近场扫描或TDR测试加屏蔽或优化阻抗偶发错误连接器接触不良插拔测试更换连接器特定通道失败走线或过孔问题逐通道测试优化布局布线信号完整性的调试需要一些专业设备比如误码仪、TDR、矢量网络分析仪。这些设备价格不菲个人玩家可能没有。一个替代方案是用PCIe协议分析仪虽然不能直接测眼图但可以看到链路训练的过程和错误计数间接判断信号质量。6.3 散热与结构类问题速查散热问题相对直观温度高了就会降频或者死机。现象可能原因排查方法解决措施温度过高导热垫接触不良拆开看导热垫压痕重新安装散热器风扇不转供电不足或PWM信号问题测风扇接口电压单独供电或换风扇噪音大风扇转速过高调整调速曲线换低噪音风扇模组弯曲螺丝拧紧顺序错误目视检查PCB按对角顺序重新拧温度波动大散热器松动检查螺丝扭力重新拧紧到规定扭力散热器安装的时候我建议用扭力螺丝刀。普通的螺丝刀很难控制扭力容易拧过头或者拧不够。扭力螺丝刀虽然贵一点但能避免很多问题。我用的是一把0.1到0.6牛米范围的扭力螺丝刀调到0.3牛米每个螺丝拧到咔嗒一声就停。6.4 个人实操心得与最后分享这个项目前前后后折腾了差不多三个月打样了三次PCB烧过一块模组还好是便宜的测试卡踩过的坑不计其数。最大的体会是高速信号设计不能靠猜必须仿真加实测。我一开始觉得NVLink走线短一点就行了结果仿真发现连接器处的阻抗不连续才是主要问题。后来优化了焊盘和过孔眼图才达标。另一个体会是供电设计要留足余量。我最初设计的供电是四相每相50A理论上够用。但实际跑满载的时候有一相的温度明显比其他相高后来发现是布局不对称导致电流不均。改成八相之后每相25A温度均匀多了可靠性也上去了。最后分享一个小技巧调试的时候在关键节点上预留测试点。比如每路供电的输出、NVLink的差分对、PCIe的参考时钟都留了测试焊盘。这样用探头测的时候不用到处找点直接戳测试焊盘就行。测试焊盘要尽量小减少对信号的影响一般用0.5毫米直径的焊盘就够了。这个转接卡后续还可以扩展的地方不少。比如加一个PCIe Switch芯片把x16拆成两个x8支持两块模组同时跑PCIe。或者加一个BMC芯片实现远程监控和开关机。再或者把NVLink的连接器换成光模块接口支持更远距离的互联。这些方向都有意思等有时间了再慢慢折腾。