
我从十几年前第一次做PCIe网卡时踩过的坑开始到后来做NVMe SSD、x86主板上的PCIe时钟分配再到给FPGA平台做PCIe Gen4转接卡积累下来的东西不算少。这篇备忘不是教科书是把那些容易忽略、但真正影响板子能不能跑通的设计要求集中列出来。标题叫“备忘”意思就是自用速查顺带分享给正在做PCIe相关板卡的同行。无论你是画M.2 SSD小板子的还是做PCIe Switch载板的这篇都能少走点弯路。1. 内容整体设计与思路拆解1.1 做PCB前的需求分析PCIe的全称是Peripheral Component Interconnect Express是目前服务器、PC、嵌入式设备里最主流的高速串行总线。它的架构是树形的根复合体在CPU里下面挂各种Switch和Endpoint。从PCB设计角度看PCIe本质上考验的是你对高速差分信号的处理能力。很多工程师画过USB、HDMI、千兆网口画得熟练了觉得PCIe也差不多。真上手就会发现问题不一样PCIe的速度翻得很快Gen3是8GT/sGen4到16GT/sGen5到32GT/s频率越高信号完整性的余量越紧张PCB走线稍微不讲究链路训练就过不去。做设计前最重要的事情是把需求拆清楚通道数Lanex1、x2、x4、x8、x16。通道越多布线面积和层数需求越高。协议版本Gen1/Gen2/Gen3/Gen4/Gen5。版本直接决定线宽、等长、叠层和材料选择。接口形态标准PCIe插槽、M.2、Mini PCIe、U.2、SlimSAS、定制金手指不同形态的结构要求和走线空间差很多。工作环境板卡尺寸是标准高度还是低矮挡板是否需要半高挡板尺寸配合这在服务器环境中特别常见。可制造性PCB厂家的工艺能力比如最小线宽、最小过孔、铜厚和层压结构直接影响阻抗能不能做准。这些看起来基础但很多人一上来就画图结果等到Layout中途才发现层数不够、走线出不来、阻抗计算不对。先花半天把需求列成一张表比画一周板子再返工要划算得多。1.2 方案选型里的几个核心权衡做PCIe板卡第一个绕不开的问题是“用哪个主控/桥接方案”。如果是做存储产品常见的是各类PCIe Switch芯片做视频采集卡或FPGA加速卡则要选FPGA和PCIe硬核的型号做转接卡也许用简单的时钟Buffer和Redriver就够。这里有个很关键的设计观PCIe链路能不能稳定跑不只是连接器到金手指这段PCB的事还涉及主板端的信号质量。所以选型时要重点确认以下几项。参考设计的可靠性好的参考设计图里微带线/带状线的阻抗、过孔、退耦电容的位置都是调试过的。不要随便改动主控旁边的AC耦合电容和时钟电路宁可多抄原厂方案。是否要用Redriver/Retimer如果走线长度超过一定阀值具体看速率和板材就得考虑Redriver来补偿损耗或Retimer解决信号的时钟恢复。Gen4以上对长走线极敏感这条尤其重要。连接器品牌与供应链连接器不是“看起来一样就行”M.2连接器、PCIe金手指、夹层连接器的引脚顺序、机械高度、端子带宽不同厂家天差地别。做服务器板卡时尤其不要随意换连接器型号否则SI测试结果会教你做人。我自己有个习惯选型阶段把主控厂商提供的Layout Guide打印出来把信号完整性相关的核心参数单独摘进Excel表然后对着自己的板框一层一层排。这个习惯省下的DFM返工比什么都多。2. 核心细节解析与实操要点2.1 PCIe协议版本、速率与带宽速查先把最基础的带宽表放出来。PCIe协议允许一个或多个通道并行总带宽是单通道带宽乘以通道数但注意可用带宽要算编码开销。Gen1和Gen2用8b/10b编码每8bit有效数据要消耗2bit校验位所以Gen1 x1的有效带宽是2.5GT/s * 1 * 8bit / 10bit 250MB/s。Gen3及以后改成了128b/130b编码校验开销大大降低有效带宽是原始码率乘以128/130大约是98.46%。表1 PCIe版本与有效带宽单通道单向协议版本单通道速率编码方式x1有效带宽x4有效带宽x16有效带宽Gen12.5GT/s8b/10b250MB/s1000MB/s4GB/sGen25GT/s8b/10b500MB/s2000MB/s8GB/sGen38GT/s128b/130b~985MB/s~3.94GB/s~15.75GB/sGen416GT/s128b/130b~1.97GB/s~7.88GB/s~31.5GB/sGen532GT/s128b/130b~3.94GB/s~15.75GB/s~63GB/s这里尤其是新手容易犯的错误一是只看原始码率不看有效带宽导致理论吞吐算错项目评估出了偏差二是不了解全双工特性PCIe上行和下行是同时进行的所以宣传“x16 32GT/s”时很多人误以为只能单向 63GB/s实际双向合计约 126GB/s但应用层要考虑数据包开销、延迟和DMA效率实际吞吐还会低一些。协议层面有不少概念容易吓到新人比如TLP事务层数据包、DLLP数据链路层数据包、Flow Control、Credits机制。作为PCB设计者不需要把驱动里的软件栈全搞懂但必须懂链路训练Link Training的过程。板子插上去瞬间发生的Link Training是硬件能不能握手成功的直接体现后面会说调试方法。2.2 枚举过程与链路训练的基本逻辑PCIe枚举过程的本质是根复合体Root Complex在复位后扫描总线为每个设备分配Bus Number、Device Number、Function NumberBDF并读取设备的配置空间。配置空间里最关键的是Vendor ID、Device ID、Class Code、BAR基地址寄存器。当BIOS或操作系统枚举完成后才分配内存和中断资源。链路训练则由物理层完成。上电后每个收发端会通过发送训练序列TS1/TS2来协商速率和通道数并完成电气参数的校准。训练没有固定由谁主导两端同时对等协商。如果PCB走线有严重损耗、阻抗失配、或者链路不对称协商就会反复失败最后反倒降级到Gen1。这就是为什么很多人插上Gen3的卡只跑到Gen1速度大概率是板子信号质量顶不上去硬件自动降级。从PCB设计角度链路训练能否成功受这几个因素影响较大AC耦合电容位置不当或容值偏差。参考平面不完整导致差分阻抗突变。差分对串扰大特别是在过孔区域。时钟信号质量差导致展频SSC没有正确跟踪。2.3 高速差分对间到底需不需要等长关于“PCIe的发送差分对间需不需要等长”这个搜索热度很高说明纠结的人不少。答案是必须做对内等长但等长的优先级在阻抗连续性和完整参考平面之后。差分信号对内要求的是两条线长度尽量一致因为P和N是靠差值传输信息如果等长误差大差分噪声就会转化为共模噪声进而恶化信号摆幅和抖动。等长精度的经验值Gen1/Gen2做到5mil以内完全没问题Gen3建议3mil以内Gen4和Gen5有条件就做到1~2mil以内。PCB厂家常规工艺做到2mil等长是可以实现的不过会增加一点成本。如果Layout特别困难至少也要做到5milGen3/Gen4以内。比等长更优先的是差分对之间间距要足够一般保持3倍线宽以上组间拉开至少20mil特别是收发对之间。另外一个常被忽略的点对内等长应在引脚扇出区就开始量也就是从芯片焊球Ball出口到连接器焊盘全程包含过孔的长度都要算进去。不要只拉一段直线段比那样最终结果并不对。2.4 时钟、复位与边带信号设计PCIe系统里除了高速数据线还有一些低速管理信号处理不好一样会出问题。最常见的三种是Refclk参考时钟、PERST复位信号、以及WAKE/PRSNT等边带信号。参考时钟有三种分配方式Common Clock共同时钟、Separate Refclk独立时钟、SRISSeparate Reference clock with Independent Spread。PCB设计中最常见的是共同时钟架构根复合体给每个设备分发100MHz差分时钟。这个时钟频率精度要求是±300ppm以内Gen3及以后要求在SRNS场景也有类似范围并且带有展频SSC通常是从-0.5%到0。时钟走线必须做差分阻抗且与其他信号保持隔离。有些设计图里把Refclk做得很随意这往往导致误码率上升。复位信号PERST要保证上电时序正确CPU这边先有电源和时钟稳定再释放复位。PCIe规范里对PERST建立和保持时间有要求有些主控还需要额外的延迟这就需要看主控手册里的Power Sequencing图。3. 实操过程与核心环节实现3.1 接口形态对比与PCB布局影响现在主流的PCIe接口形态有标准PCIe插槽、M.2、Mini PCIe、U.2、SlimSAS等。很多人会问“网卡Mini PCIe接口和M.2接口有什么区别”这俩都是小尺寸板载连接器但完全不是一回事。Mini PCIe是早期笔记本/嵌入式设备上用的支持PCIe x1和USB 2.0也有SATA的一些变体金手指Pin脚定义为52脚迷你卡形态。M.2则更现代尺寸更短更灵活支持PCIe x2/x4、SATA和USBKey设计让它不能随便乱插通常B Key走PCIe x2或SATAM Key走PCIe x4。M.2还同时支持NVMe协议和AHCI协议物理接口一样但工作模式不同。表2 Mini PCIe与M.2的简单对比维度Mini PCIeM.2常见版本52Pin金手指22mm宽支持30/42/60/80mm长度支持通道一般PCIe x1支持PCIe x2/x4视Key而定额外信号USB 2.0、SATA可选支持SATA、USB、NVMe结构设计较老占用空间大更省空间固定螺丝卡扣方式选型时要从实际散热、空间、信号数量来评估。比如扁平的服务器里用M.2很普遍但要是做路由器软路由上的扩展卡Mini PCIe的模组或标准PCIe插槽则更方便插拔和固定。PCB布局时连接器的引脚密度决定了孔径和扇出方式M.2因为引脚少、间距小走线经常要换层必须提前规划出线方向尽量不让高速差分对穿太多过孔。还有一个容易忽视的地方是半高挡板尺寸。PCIe半高挡板常用于1U/2U服务器它的高度比全高挡板矮不少宽度方向也有规范要求。如果你画了半高卡结构工程师在机箱里装不进、固定螺丝对不上螺丝孔那就很尴尬。画板前最好拿到挡板规格图连开口位置和卷边方向都确认好。3.2 层叠设计与阻抗控制PCB层叠是PCIe设计里最基础的一步。高速信号不能没有完整的参考平面否则返回路径不连续阻抗没法控制EMI也会变差。常见的低成本4层板叠层是信号-地-电源-信号。PCIe Gen3以上如果走线较长建议至少用6层把高速信号走在内层带状线好处是抑制串扰和外部噪声。这里必须重点强调一个新手特别容易栽的误区PCIe差分阻抗要求是85Ω±10%不是USB/以太网常用的90Ω也不是HDMI的100Ω。不同的板材、不同的层到参考面的距离线宽线距完全不一样直接用其他项目的参数会偏很多。准确的表格是让PCB厂家给阻抗计算或者用Polar/Si9000自己算。比如常见FR41.6mm板厚L4层参考表层微带走线目标85Ω差分阻抗线宽/线距可能在5~7mil/5~7mil之间但精确值必须按叠层算不能用猜的。层叠设计还要考虑厚度均匀性和玻纤布效应。Gen3以上速率建议选扁平玻璃布比如1080/2116避免玻纤编织空隙引起的阻抗周期性变化也就是常说的“玻纤效应”。如果是高速背板可能还要考虑更低损耗板材比如Megtron6或更高级材料。3.3 走线规则线宽、间距、过孔与回流这里的核心规则是我反复验证过、写成备忘录第一条的内容差分阻抗85Ω容忍±10%对内等长Gen1/Gen2 ≤5milGen3/Gen4 ≤3mil对间等长由总线路匹配决定一般±5mil到±10mil差分线间距保持线宽3倍以上差分线与其它非关联信号走线间距建议50mil以上频率越高净空要求越大过孔数量尽量少Gen4更要注意过孔残桩问题严重时会导致回波损耗恶化。过孔处理要特别注意。表层到内层的过孔如果打穿整个板子孔壁和残桩会形成阻抗不连续造成反射。有一种做法是在内层焊盘对应层用背钻Back Drilling把残桩钻掉。常见工艺上Gen3可以不做背钻但Gen4长走线链路最好把背钻列进制板要求背钻深度公差一般是±3~5mil。还要在过孔旁边放地孔给信号回流提供路径。回流路径问题最典型的场景是高速差分线从顶层换到内层结果相邻层没有参考地信号绕了远路回流环路面积变大辐射和损耗都变差。换层时尽量保证信号层两侧都有一个完整的地平面而且换层过孔区域要放几个地过孔。3.4 布线实操以M.2 SSD转接卡为例我以一块M.2 NVMe SSD转PCIe x4转接卡为例把关键步骤串一遍。这块卡的链路是PCIe x4Gen3速率板卡是标准半高尺寸使用PCIe标准金手指。要求是插到主板上能稳定跑NVMe SSD并支持热插拔检测。第一步原理图阶段。把PCIe x4的四组差分对TXP0/TXN0到TXP3/TXN3以及RXP0/RXN0到RXP3/RXN3从连接器引出每组对都要经过AC耦合电容连接到M.2连接器的对应Pin。要特别注意AC耦合电容放在哪一侧。有的习惯放靠近发送端有的靠近接收端规范上没有强制要求但两条线尽量靠近。实际项目中不要把电容放在连接器正下方导致走线困难。第二步设置约束规则。打开Cadence Allegro或嘉立创EDA先把差分对规则设好。差分阻抗85Ω差分对线宽线距按叠层算出来的值设置对内等长设置为5mil。再为PCIe net建Net Group把四组TX和四组RX放进去设置对间等长目标。如果M.2和PCIe插槽中间还要经过多片电路比如电平转换、热插拔控制器需要合理安排这些器件。第三步布局与布线。布局时先把PCIe金手指和M.2连接器确定好其他器件按信号走向排金手指过来的差分对先到AC电容再到M.2连接器。M.2连接器的引脚密度高需要在焊盘扇出时就决定走线层面。我习惯顶层从金手指扇出后换到内层走带状线到M.2区域再换回顶层只换两次层过孔总数每个信号控制在2个以内。线宽按85Ω计算值实际样板打样回来测阻抗误差在80~90Ω之间就基本合格。第四步DRC与仿真。在Allegro里跑完DRC后建议对最长差分对做个简单仿真用ADS或HyperLynx看一下眼图。如果环境里没有正版EDA仿真工具也可以靠Pre-Layout仿真手机参数但至少要用TDR类工具检查阻抗突变点。Gen3的板子简单规则遵守好不仿真也有可能正常工作Gen4以上就别赌了仿真和实测都要上完全靠经验布线一旦翻车问题很难定位。3.5 DRC检查与制板前检查制板前DRC检查是最后一个兜底环节不建议直接点一键跑整版DRC就完事这一步需要做得精细一些。打开规则管理器重点确认以下几项PCB板框尺寸、边缘间距、定位孔、半高挡板螺丝孔位置是不是和结构图一致。差分对对内等长有没有全部满足把所有报告里的超差修掉。过孔到焊盘的安全间距过孔到走线的间距避免后面钻孔直接打破线。铜皮挖空区域是否正确。这里对应一个热搜词“AD20中PCB板铜皮挖空”当差分走线经过某个区域时如果不想让平面层铜皮兜住信号要把参考平面上的铜皮挖空但要挖得恰到好处挖得太大回流路径断开挖得不彻底阻抗又不对。电源层分割是否影响参考平面完整电源岛之间有没有足够的耦合地过孔。制板文件输出时用Gerber X2或ODB格式最稳妥。AD24导出Gerber时还要注意导出文件命名规范尤其是外层和内层的正负片设置别搞反。Gerber转PCB的操作我也见过不少次本质就是做逆向恢复建议当作参考工具用就好不要把它当正式设计流程的替代品。4. 常见问题与排查技巧实录4.1 链路训练失败与降速问题设备插上去显示的速度不对或者干脆不识别这是PCIe调试里最高频的问题。建议按下述顺序排查能省不少时间。先看电源尤其是3.3V和12V是否正常PCIe金手指的电源脚有没有虚焊。插上后测电平是最快的。再看链路是否进入训练状态。买一个带PCIe诊断卡的或者用示波器抓PCIe TX端的差分信号看有没有TS1/TS2训练序列频率对不对。如果没波形多半是复位没释放或参考时钟没起振。看参考时钟波形PCIe参考时钟是100MHz差分时钟用示波器测频率允差和摆幅很多启动失败是因为时钟幅值太低。BIOS里观察降级情况。如果只跑到Gen1基本是信号质量问题可以拿短线的转接卡试也可以降低速率到Gen2看链路是否稳定辅助定位。FPGA平台的PCIe调试还要多一步检查配置是否正确加载以及FPGA的PCIe硬核是否烧写了相应比特流。这里要特别提醒链路训练问题里“PCIe发送差分对间需不需要等长”这类小问题往往不是根源真正的大概率原因是过孔残桩、参考平面不连续、或者阻抗算错了。我第一次画Gen3卡时等长做得很漂亮甚至做到1mil以内但因为没有控制过孔数量DQS眼图完全不开。后来把过孔从3个减到2个问题就消失了。这说明信号完整性是系统性问题不要只盯一个指标。4.2 时钟噪声、频偏与弹性缓存PCIe还有一个经常被搞懵的topic弹性缓存。简单理解弹性缓冲是接收端用来吸收发送端和接收端之间频偏频率不完全相同的FIFO。PCIe Gen1/Gen2时每个符号在接收端都进入弹性缓存通过SKP符号的插入和删除实现频率补偿。很多工程师在调试时发现数据有CRC错误会怀疑是弹性缓存深度不够其实不一定。更多时候是参考时钟的频偏过大或SSC调制不匹配导致这个要在软件里查看当前协商的时钟架构再决定是修改寄存器还是改硬件。电源噪声对PCIe的影响也别小看。ADC/DAC电路设计里都有时钟抖动和电源噪声的规避PCIe也一样。PCIe SerDes里面PLL对电源纹波很敏感直流电源到PCIe的模拟电压引脚必须加足够的去耦电容特别是高频小电容比如100nF和10nF要靠近引脚放置必要时加一个磁珠隔离。调试经验来看链路误码率增高时不要一上来就怀疑固件先测电源纹波再查时钟展频有没有开启最后查接收端的信号质量。几十块钱的成熟开发板很少出问题绝大多数问题出在“参考设计也就90%复制自己改了那10%却没人能答清楚”。4.3 与PCB设计相关的其他高频坑螺丝孔影响走线Allegro里做螺丝孔有些新人不清楚要设成机械孔还是焊盘孔如果把螺丝孔做成PTH焊盘内层会短路做成NPTH孔则要注意内层铜皮到孔壁间距避免电气安全距离不够。铜皮挖空不当这是AD设计和Allegro设计都容易遇到的问题。挖空的时候如果挖空层的参考平面上下不对称会破坏差分阻抗控制。更规范的做法是保持对称参考地挖空区域只能扣到对应走线所在层上下各一个平面层。PADS文件报错自动关闭大多数是库或铜皮导致的数据库错误。可以用高版本PADS修复或者转出ASC然后重新导入。不要硬去改文件里的二进制容易把整个文件搞坏。M.2连接器方向搞反M.2有Key方向装反是装不进去的但原理图封装容易画反。画封装一定要对照连接器手册的Pin1位置拿实物卡尺量过再画。4.4 工具与资源协议文档与仿真软件学习PCIe和做PCB设计适合从三个方向入手协议规范、电路设计、仿真与测试。协议规范直接找PCI-SIG官网下载最著名的就是《PCI Express Base Specification》还有针对卡的《PCI Express Card Electromechanical Specification》后者里面规定了金手指尺寸、挡板尺寸。互联网上也流传很多PCIe协议中文版但对工程师来说英文原版更可靠因为规范翻译容易出现歧义。PCB设计工具常用Cadence Allegro、Altium Designer、嘉立创EDA。仿真层面SI/PI分析用Ansys SIwave、HyperLynx或ADS如果只是做阻抗和规则检查Polar SI9000加厂商的阻抗叠层参数也够用。我之前看到有人搜“sw6206原厂方案包含PCB原理图寄存器列表BOM”这是快充/电源管理领域的项目但里面隐含着硬件工程师通用工作流——设计资料一定要齐整。做PCIe相关产品也是一样BOM、原理图、Layout、寄存器配置表、以及信号完整性依据这些资料最好在项目启动前就规划好怎么归档而不是做到一半才回头补。因为这行尤其依赖严谨培训热热闹闹画完板子缺资料比缺焊锡更致命。5. 工具选型与分层建议5.1 PCB EDA工具选型参考目前主流PCB设计工具对PCIe这类高速信号的支持程度不一样。Altium Designer在规则设置和差分对约束方面比较直观中小公司和创客用得很多做Gen3以内的PCIe板子完全够用。Cadence Allegro功能强约束管理器功能更是业界标杆适合复杂的多板卡系统大多数服务器、通信主板的PCIe设计都在用。嘉立创EDA上手快、能快速打样适合学生或小批量项目。个人建议是如果不是必须交付给只用某个工具的公司先把手头的工具约束规则吃透比频繁换工具效率高得多。5.2 波形测试与仿真观察高速信号测试中示波器带宽建议按信号频率的5倍以上选Gen3测试需要选16GHz带宽的示波器Gen4更建议用更高带宽。还要用配套的PCIe测试夹具或探头尽量保证测试点就是真实芯片引脚附近。眼图是反映信号质量最直观的指标但要和BER误码率测试配合眼图好看不代表误码一定达标。用误码仪或支持PCIe训练状态分析的协议分析仪更能准确定位问题。平时项目如果测试条件不足可以用主板上BIOS自检的链路速率做粗判断但最终量产还是建议到实验室实测。6. 我个人在实际收拾这些项目时的经验最后聊一点掏心窝的话。PCIe的PCB设计本质上是一条“算准叠层、控好阻抗、管好等长、理清回流”的工程链环环相扣。很多工程师会把大量精力花在等长和线宽上这当然重要但真正决定成败的往往是最基础的几个细节85Ω有没有设对、参考平面是不是完整、电源纹波是不是干净、复位时序是不是满足手册。我自己就干过一件蠢事把PCIe差分阻抗当成了USB的90Ω来算结果样片回来链路只训练到Gen1查了一整天最后看阻抗测试报告才发现整批板子差分阻抗全部偏高。从那次以后凡是新项目开头我第一件事就是去PCB厂官网下载阻抗设计参考表并和厂家确认叠层而不是凭记忆估算。如果你正在做PCIe Gen3以上的板子建议尽早和PCB厂确认最少线宽、最小线距、背钻能力、以及玻纤布型号。不同厂的工艺差异不小同样的线宽线距在一个厂能做出85Ω在另一个厂可能偏成95Ω。设计阶段就把工艺参数和阻抗容差写进制板说明往往比事后仿真补救便宜得多。这个备忘录以后还会持续更新。每次从项目中踩完坑我都会往里面加几条。这次写出来也算是对这些年PCIe和PCB设计经历的一次梳理。如果你手头项目正好卡在链路训练、接口选型或者层叠计算上希望能帮你少走几步弯路。