ARTICLE DETAIL

资讯详情

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

PCIe硬件设计实战:从协议分层到PCB布线与调试全解析

PCIe硬件设计实战:从协议分层到PCB布线与调试全解析 一聊到 PCIe 接口的硬件设计很多人第一反应是“高速差分串行”六个字。但真正拿着原理图和 Layout 去做会发现这话远远不够。PCIe 表面是物理互联骨子里是一套网络化的软硬件协作体系。如果不理解它从软件到物理层的分工只靠“阻抗匹配 查表画线”很可能板子跑起来很含糊——通电后设备时而认得到时而又掉线问题在哪都没头绪。这篇我从基础架构讲起一直聊到实际设计里必须处理的电源、时钟、布线和调试尽量把那些教科书里不会明说、但在项目现场反复出现的点都摆出来。1. 数据通路怎样铺起来的先在架构层面认清楚很多人把 PCIe 当作一种“总线”这个直觉会害人。PCIe 不是传统方式的总线不是一堆或并或串的信号在共享线路上排排坐。它更像一个点对点的微型网络主机和每一个设备之间拥有独立的“虚拟链路”数据以报文形式搬运而不是像 DDR 那样靠地址线和数据线并行刷刷刷。数据结构不先沉淀后面无论画原理图还是调驱动都容易跟着感觉走。1.1 一条链路的三层剥离PCIe 协议栈从上到下分为事务层、数据链路层和物理层这个分层一定要刻在脑子里。事务层处理的是“读什么、写什么、写到哪”。平时软件发起一次 MMIO 访问或者 DMA 传输最终会变成一个 TLPTransaction Layer Packet里面有类型、地址、数据、请求者 ID 等字段。数据链路层在 TLP 外面再加一层“快递单”包括序列号和 CRC保证报文在链路上不出错。物理层再把这份带快递单的报文拆成比特流以差分信号形式送出去。打个比方事务层是写信的人数据链路层是快递小哥物理层是货车司机。写信的人不需要知道车走哪条路货车司机也不需要懂信的内容。这样分层的好处是任何一层可以独立优化比如物理层从 Gen1 升级到 Gen4上层事务照跑不误。这也是“速率提升但不破坏软件接口”这句话的真正来源。1.2 通道数、速率和带宽的真账本PCIe 链路宽度用 x1、x2、x4、x8、x16 表示x 后面是通道数每通道是独立的收发差分对。规格进化对应每通道传输速率规格单通道传输速率编码方式有效带宽开销x1 单方向带宽x16 单方向带宽PCIe Gen12.5 GT/s8b/10b20%250 MB/s4 GB/sPCIe Gen25 GT/s8b/10b20%500 MB/s8 GB/sPCIe Gen38 GT/s128b/130b1.5%约 985 MB/s约 15.75 GB/sPCIe Gen416 GT/s128b/130b1.5%约 1.97 GB/s约 31.5 GB/sPCIe Gen532 GT/s128b/130b1.5%约 3.94 GB/s约 63 GB/s我见过不少老工程师拿 Gen1/Gen2 的经验去估算 Gen3结果带宽算完乐观得多原因就是把编码开销漏了。Gen1/Gen2 的 8b/10b 编码要付出 20% 开销Gen3 以后换 128b/130b开销降到一个可以忽略的量级。这也是为什么真正的有效带宽往往比“速率 × 通道数”视觉上少一大截。设计人员在前期选链路宽度时不要只看表里的峰值带宽。还要把驱动、中断、DMA 描述符搬运、协议本身的心跳等全部算进去。一条 x1 Gen3 链路实际能稳定跑出 800MB/s 以上的吞吐已经很不错了别把理论值当作落地值去承诺。1.3 拓扑里最容易忽略的“中转站”角色典型 PCIe 拓扑里有几个角色Root Complex 是主机侧的“住”Endpoint 是挂上来的外设Switch 是中间“中转站”PCIe Bridge 用于串联不同总线域。Root Complex 不止是北桥它还要负责生成配置事务、管理中断、处理地址转换。Endpoint 比如 NVMe 盘、网卡、显卡。Switch 是个容易低估的部件它不等于一个简单的转接板。Switch 内部有路由逻辑它根据 TLP 头里的 Bus/Device/Function 字段决定报文往哪个下游端口转而不是靠物理引脚硬接的。链路流量往哪走是逻辑层面的路由决策不是电信号随手分叉。这是理解 PCIe 设计的关键一步物理上大家共享 Switch逻辑上每个端点是独立地址空间互不干扰。很多工程师画 PCIe Switch 板时只考虑“把线连上”忘了检查每个端口的地址范围和电气特性结果 BIOS 枚举时发现某些子设备出不来。2. 开机后那条链路怎么练出来的LTSSM 与枚举过程PCIe 设备不是上电就自动可用的主机和外设之间要先“握手”握手完成后软件再给设备分配地址和资源。这个过程中最难懂、也最常出问题的一环就是 LTSSM。LTSSM 是链路训练与状态机负责把一条物理意义上的差分线训练成一条能够传 TLP 的逻辑链路。信号能不能建链十有八九要回到 LTSSM 阶段去找。2.1 从检测到 L0链路训练的状态交接LTSSM 的完整状态包括 Detect、Polling、Configuration、L0、L0s、L1、L2、Recovery 等。早期最容易出错的是前面几个收缩状态。Detect物理层检测接收端有没有端接电阻判断这条链路上是否真插着设备。Polling双方开始发送 TS1/TS2 有序集确认比特同步、字同步并交换链路能力。Configuration协商链路宽度和通道编号决定最后使用 x1、x2、x4 还是 x16。L0正常收发 TLP 数据。Configuration 阶段下的子状态是硬骨头。顺序大体是 Configuration.Linkwidth.Start、Configuration.Linkwidth.Accept随后配置 Lane Number进入 Configuration.Lanenum.Wait、Configuration.Lanenum.Accept最后以 Configuration.Complete 收尾。一个常见的错误是把配置阶段当成简单的“双方都同意就完事”忽略了 TS 有序集里携带的链路编号和宽度协商内容。调试时如果发现链路只停在 Polling 状态先检查参考时钟有没有起振、接收端有没有端接、差分对有没有接反。如果卡在 Configuration往往和 PHY 的链路宽度配置、接收电平阈值有关。L0 之后再频繁掉到 Recovery又多半是信号完整性或者电源纹波问题。2.2 枚举不是魔法是一套地址分发的流程硬件链路训练完成之后软件开始枚举。PCIe 的枚举核心是给每一个设备分配 BDF总线号、设备号、功能号并分配内存空间和 I/O 空间。大体流程为主机从 Root Complex 的总线 0 开始向每个设备发配置读请求。如果某 BDF 上的设备有响应就读取厂商 ID 和设备 ID。遇到桥设备还要分配新的总线号继续向下递归扫描。这就是为什么 Switch 插上后系统能看到多条总线而直连的 Endpoint 通常只占一个总线号。配置请求分两种类型。Type 0 配置请求是给端点设备的Type 1 配置请求是给桥设备的。Bar 空间通过“写全 1、读回来再看哪些位是 0”的方式探测出设备需要多大地址空间然后把实际地址写进去。这段动作听起来简单但极其依赖硬件上 BAR 空间实现是否标准。有的 FPGA 实现 PCIe 时 BAR 位宽写错导致操作系统枚举时出现“memory range overlaps”之类问题查来查去最后发现是寄存器配置表的问题。2.3 用 lspci 视角回推硬件配置对不对Linux 下的 lspci 是排查 PCIe 问题的第一利器。你不需要写驱动直接在命令行看链路协商结果[roothost ~]# lspci -vv -s 02:00.0 02:00.0 Non-Volatile memory controller: Device 1234:5678 Subsystem: ... LnkCap: Speed 16GT/s, Width x4 LnkSta: Speed 16GT/s, Width x1 Control: I/O Mem BusMaster SpecCycle- MemWINV- VGASnoop- ParErr- Stepping-上面这个例子里LnkCap 显示设备支持 Gen4 x4但 LnkSta 显示当前只协商到 Gen4 x1。这是典型的链路宽度没协商对常见原因是主板插槽只有 x1 的电气线或者金手指部分引脚没接触好还有可能是 PCB 上四条差分对里有一对布线断线或虚焊。看到 LnkSta 小于 LnkCap 时别急着怀疑软件先用万用表续线再看有没有引脚被外力顶歪。Windows 下也有等价信息设备管理器里查看设备属性会显示“当前链路速度”和“已协商链路宽度”。如果数值低于预期处理思路和 Linux 下是一致的。3. 做硬件设计先过电源和时钟这两关原理图里 PCIe 部分看着最简单外面接口就那么几根但一深究就会发现问题都集中在电源域和时钟域。这两个地方错了协议层再怎么写对也没用。做 PCIe 硬件我最怕的不是差分线画得不漂亮而是电源轨少了、时序不对、时钟抖动超标这些基本属于底层错误软件层完全没有办法绕过去。3.1 为什么 PCIe 设备不能只靠“一根线”供电PCIe 的“PCIe 接口”物理上并不是只传高速数据连接器里本来就有供电引脚。标准 PCIe CEM 插槽会提供 12V、3.3V 和 3.3V_AUX。不同版本规格对插槽能提供的功率有明确规定但大体上一个标准插槽的供电能力是有限的。日常看到的显卡需要外接 6pin、8pin 供电口不是厂商故意增加麻烦而是插槽那点功率已经不可能喂饱高功耗 GPU。做板卡时第一件事是算功耗预算。你的核心芯片要几路电源每路需要多大电流DDR 还是 M.2PHY 还是 FPGA全部列成一张电源树。接着要确认插槽输入与本地电源轨之间的转化方式。比如 12V 进来后通常用 DCDC buck 降到核心电压3.3V 直接用 LDO 转 1.8V 给 PHY这样做能兼顾效率和成本。额外供电不是随便拿一根线怼上去。很多卡同时从插槽和外接电源取电在设计时要注意防止两路 12V 反灌。热插拔场景更明显不同插头接触时序不同板卡上需要加 Oring 电路或者规范要求的检测逻辑。我见过一个项目外接电源先接通插槽还未供电结果 12V 反灌到主板烧了一块验证主板。只能说电源设计里“敬畏”两个字比什么技巧都重要。3.2 参考时钟、PERST#、CLKREQ# 怎么接才稳PCIe 的参考时钟 100MHz 是关键中的关键。它通常由主板输出插槽上也有 REFCLK 和 REFCLK- 引脚。对于板卡设计你要么直接使用插槽过来的共同时钟要么在卡上做一个独立参考时钟源两种方案各有约束。共同时钟模式下链路两端的参考时钟同源训练相对简单独立参考时钟模式下两端频率允许有一定偏差但抖动要求更高。实测经验是很多 PCIe 设备“时好时坏”最后都查到了时钟上。REFCLK 的差分摆幅、上升沿速率、相位抖动要按规范控制。布局时 REFCLK 差分对要尽量短远离电源开关节点必要时加地孔保护。如果你用时钟缓冲芯片千万注意数据手册里的上电时序有些芯片需要 3.3V 先上电否则输出悬空会影响远端设备。PERST# 是另一根经常出问题的引脚。它是低电平复位主机上电后释放表示电源稳定、链路可以开始训练。问题出在很多人的复位电路做太简单RC 放电时序没算明白PERST# 释放过快或过慢。释放过快板卡端电源还没稳定设备复位不彻底释放过慢主机已经完成枚举设备错过了被发现窗口。建议按规范最小时序做并考虑在 PERST# 上加上下拉电阻和滤波电容避免静电干扰。CLKREQ# 是链路电源管理的重要信号。L1 低功耗状态下设备如果想关闭参考时钟会通过 CLKREQ# 请求主机关闭时钟源。设计时要注意这根线一般是开漏结构必须有上拉。很多电路图里直接把它接地虽然能让设备一直工作但也等于废掉了低功耗模式。3.3 连接器与金手指的引脚规划谈到连接器就必须看 CEM 规范。CEM 定义了 PCIe 插槽和扩展卡的机械外形、引脚间距、供电能力和信号质量要求。哪怕你只做一块内部测试板也要先下规范来查一下尤其是 PCIe 6.0 CEM 这类新版本对连接器材料、眼图、电源裕量都有额外约束。不要靠老经验默写引脚定义pcie 6.0 cem 这种文档下载下来对着看比网上的二手表格靠谱得多。常见连接器引脚包括PETp/PETn/PERp/PERn 是数据差分对PERST#、CLKREQ#、WAKE# 属于控制类信号12V、3.3V、3.3V_AUX 是电源SMB_CLK/SMB_DAT 用于管理通信PRSNT# 用来检测卡是否插入。设计时要把这些信号和电源引脚一起规划到一个总表里防止画原理图时漏了某个边带信号。PRSNT# 这根线尤其容易被忽视。不少新手画板时觉得 PRSNT# 是多余直接短路或悬空结果插卡以后主机不知道到底有没有卡存在枚举阶段直接失败。热插拔设计里 PRSNT# 的引脚长度关系有讲究不做热插拔的板卡至少也要按规范接好别让它悬空。4. PCB 布线高速差分信号的思想斗争电源和时钟定下来了Layout 是下一个主战场。PCIe 差分对不是普通高速线它既有 SD 类接口那种看眼图的共性又有窄抖、长链路、多通道间保持时间的特殊性。布线阶段一个“差不多”的想法后面可能要用一台几十万的分析仪才能把它找出来。4.1 层叠与阻抗先把 85Ω 还是 100Ω 定下来PCIe 差分阻抗的目标值经常让人犯迷糊。很多新手顺手画成 100Ω因为别的接口默认是 100Ω。但 PCIe 的 CEM 规范里适配卡的差分目标阻抗是 85Ω 左右。这不是笔误是因为插槽、金手指和连接器会给链路带来额外的阻抗变化把板卡目标定在 85Ω整体系统才更接近一个综合平坦的链路。层叠设计要保证差分对下面有连续参考平面。高速信号最怕参考面被切断一旦下层被电源层挖空回流电流就要绕远路产生杂散电感和地弹。多层板设计里建议把 PCIe 信号走在靠近完整参考面的层并在上下层均匀铺地。差分对线宽线距拿计算工具算阻抗时要注意模型里的阻焊层、铜箔厚度、参考面距离。你去板厂投板前最好把阻抗控制需求直接写在加工说明里比如“L2/L4 层差分 85Ω 走线单端 50Ω”然后让板厂做阻抗条验证。多花一点打样费你会发现后面调试成本大幅下降。4.2 走线匹配、过孔与保护地高速差分不是把两条线画得像就好。对内等长要控制比如 5~10mil 以内通道之间的等长也要控制一般做到差距小于几十密耳比较稳。通道间偏差太大会影响接收端采样因为链路上多个通道是并行工作的skew 大了以后数据对齐也困难。过孔是 PCIe Gen3 以上最让人头疼的部分。过孔会产生残桩残桩相当于一段阻抗不连续的传输线信号跑到那里会产生反射。针对跑 Rate 高的板卡建议做背钻把过孔中不用的部分钻掉。残桩每缩短一点眼图都会变好。没有背钻条件时至少让过孔短一点并在周围加回流地孔。保护地的作用被传得有点玄但它确实有效。差分对两侧加一排接地过孔可以减小不同链路之间的串扰。不过也不要缝得太过地孔太密反而挖断参考平面。通常做法是在关键转弯、过孔、连接器附近加强地孔。4.3 从板卡到连接器的最后一段AC 耦合电容放哪PCIe 链路上通常要求 AC 耦合电容。你不要把它当成普通退耦电容走线看它的寄生参数会直接影响信号质量。位置一般放在发送端附近也就是信号从控制器出来不久后就得经过这个电容。因为电容本身存在焊盘阻抗不连续放在发送端可以让接收端看到比较干净的信号。值一般取 0.1uF低 ESL 的 0402 或 0603 都可以。焊盘设计时要尽量做到差分对在电容处是直通的别为了布线方便打两个过孔绕来绕去。很多工程师最后发现加了这个电容信号眼图变差原因不是电容本身有问题而是电容前后布线没有对齐出现明显分叉。金手指到卡槽之间这段也是一个容易出问题的区域。金手指末端如果有长长的没连接触指的 stub会影响高速反射。如果不是走线空间极其紧张尽量让金手指接触点靠近板边并考虑把金手指末端走线挖空或加回流孔减少高频反射。5. 真实板卡场景转网口电路与 Switch 应用前面讲了很多原理下面落到几类真实板卡上。最贴近普通工程师需求的是 PCIe 转网口电路设计和高带宽应用板卡。这两种场景分别覆盖了“低速复杂控制”和“高速大流量”两类 PCIe 设计思路认真拆一遍很多细节会自然串起来。5.1 为什么常见的是 PCIe 转网口而不是转 USB你可能好奇为什么现在网卡基本都是 PCIe 接口而不是像早期那样用 USB 或 LPC。原因在于 PCIe 能提供更高吞吐、更低延迟而且 DMA 方式可以直接把网卡收到的数据写到主机内存CPU 只需要处理中断和协议栈。USB 也有 DMA但协议开销、调度延迟、带宽共享方式都不如 PCIe 干净。PCIe 转网口的电路核心就三块PCIe 物理接口、以太网 MAC/PHY、网络隔离变压器与 RJ45。芯片选型上很多商用网卡是单芯片方案自带 PCIe PHY 和以太网 PHY原理图设计反而相对简单。你需要处理的是 PCIe 侧的电源、参考时钟、PERST#、差分线以及网络侧的 TX/RX 对、变压器抽头和 LED 指示灯。做 1G 网卡时PCIe 侧一般用 x1 就够了Gen1 的时候有效带宽约 250MB/s满足 1Gbps 的网络绰绰有余。但如果要做 2.5G 甚至 10G 网卡x1 Gen1 就会成为瓶颈至少要用 x1 Gen3 或 x2/x4 接口。硬件选型阶段就要把“峰值吞吐”和“有效吞吐”都算出来留出 CPU 搬运开销、中断开销的余量。此外网络 PHY 的电源纹波要求往往比 PCIe 控制器还严。网络数据在高速收发时电源噪声会通过抑制机制渗入 PHY 的输出频谱。布局时优先保证网络侧电源干净LDO 的位置要靠近 PHY去耦电容要按数据手册来不能为省面积全塞在一角。5.2 使用 PCIe Switch 时流向怎么规划当你的板卡需要一个设备带多个下游设备比如一个 x8 上游口拖两个 M.2 SSD 和一个千兆网卡就得用 PCIe Switch。Switch 不是简单的“分线器”它相当于一个内部路由器要懂得把上游来的 TLP 根据 BDF 或地址范围转发到对应下游端口。规划 Switch 流向时第一件事是算端口总带宽。比如上游接 x8 Gen4理论上单方向约 15.75GB/s。如果下游接了 4 个 x4 NVMe每个峰值约 7.88GB/s总计已经远超上游能力那么在业务满载时一定会出现拥塞。这不是硬件坏了而是“流向设计”没有考虑瓶颈。设计时还要注意Switch 内部的缓存和仲裁策略各不相同。有些 Switch 对独立配置请求、TLP 转发、NTB 访问的处理方式不一样。在做多 host 或多系统通信时要确认 Switch 是否支持 Non-Transparent Bridge 模式以及地址翻译怎么配。很多硬件问题在板卡上电后表现为“某个端口枚举慢或掉线”最后都归结到 Switch 本身的路由表配置和端到端能力协商。我建议在原理图阶段就把每个端口的 BDF 规划写在设计文档里。下游编号、链路宽度、是否启用 SR-IOV、是否需要 ASPM这些在原理图阶段不写清楚到了调试阶段就只能靠着 lspci 一点点猜。PCIe 设备的“地址感”越早建立后面问题越少。5.3 TSN 与高带宽网卡的需求变化做网卡时很多设计者低估了 TSN 带来的复杂性。TSN 不光是“支持 802.1AS 时间同步”这么简单它要求网卡在硬件层就支持精确时间戳并且能在每个报文描述符里携带到达时间。如果 PCIe DMA 电路设计成先让报文进 FIFO再由软件读时间戳那一点点延迟就会打乱整个调度策略。硬件上TSN 网卡需要把 PHY 的时间戳单元和 DMA 引擎紧密配合。设计 DMA 描述符时要预留时间戳字段甚至需要支持多条队列优先级映射。带宽方面25G 网卡建议直接用 x8 Gen4 或 x4 Gen5不要用 x4 Gen3 硬撑。除了速率还要考虑中断汇总和 MSI-X 队列数量避免高包速率下 CPU 被打满。这代高带宽网卡的功耗和散热也明显上升。很多板卡看着是“一张网卡”但 25G PHY 加 PCIe 控制器加散热片后整板功耗轻松超过标准插槽给的一个上限。这时候外接供电和风道规划就得提前做。PCIe 本身是电力“续命”的重要一环不是说接了 PCIe 就可以当“零功耗外设”来处理。6. 硬件调试实录链接中断、枚举失败和那些“玄学”问题最后聊调试。PCIe 硬件调试有个特点问题有时像软件问题有时像硬件问题有时纯粹是线接触不良。我不止一次遇到工程师拿着逻辑分析仪抓了很久最后发现是金手指氧化。做事先分主次先从最便宜的检查开始再逐步上仪器。6.1 先用软件定位着再动烙铁板卡插上后主机不认识说白了就是枚举没有完成。这时先不要急着拆板量波形先看操作系统有没有任何关于 PCIe 热插拔的信息。Linux 下dmesg会打印 PCIe 链路的报错Windows 设备管理器里会有未知设备或者带感叹号的设备甚至带 “Code 10” 之类的状态。如果设备列表里连“未知设备”都没有说明链路训练基本失败了可以往更底层的电气问题查。如果设备有枚举但只有一部分功能比如能看到设备 ID 但 BAR 空间全 0先查配置寄存器读写是否正常再看是不是复位没有彻底释放或者电源没有稳定。Linux 下还能用setpci直接读配置空间。比如看 Command 寄存器里有没有启用 Memory Space、Bus Master。这一步能帮你快速区分“硬件没枚举到”和“驱动没起来”两种完全不同的场景。别一上来就用示波器抓高速差分信号抓到的波形必须结合环境和规范一起看普通人很难直接从波形判断对错。6.2 高速网卡测速中断或中途掉线的常见根源很多人跑网页版测速时遇到网卡速度冲到很高就掉线第一反应是“瑞昱网卡垃圾”“Intel 网卡玄学”其实多数时候是 PCIe 链路层面的问题。高负载会让设备功耗上升、温度升高、PHY 的电源纹波变大某一项先突破临界点就会触发链路重训练或者复位。遇到这种问题我的排查顺序是先禁用 PCIe 的 ASPM 低功耗状态。Linux 下可以加内核参数pcie_aspmoff测试Windows 则在电源选项里把“PCI Express 链接状态电源管理”设为“关闭”。如果禁用 ASPM 之后问题消失那说明主板和设备之间的 L1 进入/退出条件存在兼容性缺陷这是最常见的原因不是网卡芯片一定“翻车”。禁用 ASPM 后还掉线再看温度。很多网卡是高负载时芯片过热导致内部 PLL 失锁或 PHY 端口复位。你可以在测速时盯一下环境温度温度一旦超过某个阈值就复现那方向基本就是散热。最后还要查电源尤其是显卡把插槽电源占满时某些主板给下游 PCIe 设备供电会掉压这时外接供电往往能缓解。还有一个容易被忽略的点PCIe 链路协商速度。如果设备协商到 Gen3 x1高带宽业务一到就把链路打满到处理瓶颈设备启动流控或重训练现象就是测速中断。这时候你用 lspci 看 LnkSta 就能一眼发现问题其实不是“掉线”是协商宽度不对瓶颈卡在一条车道上。6.3 协议分析仪、示波器和 DMA 验证三板斧常规排查解决不掉就得动用仪器。示波器最常用在量化 PERST#、参考时钟、电源时序。链路无法训练时先量 PERST# 是不是按顺序拉高再量 100MHz REFCLK 的摆幅和抖动再量板卡核心电源有没有跌穿。这三个测完80% 的上电失败问题都能定位。链路已经训练但吞吐跑不满分析仪就该上场了。PCIe 协议分析仪能解码 TLP让你看到到底有没有大量重传、有没有链路降速重训、有没有跨端口阻塞。这个设备不便宜但做正式产品时真的省时间。凡是 FPGA 板卡我建议验收阶段一定用带 DMA 的测试工程跑一轮实际数据传输。像 Xilinx XDMA 这类 IP 已经帮你把 PCIe 事务层和 DMA 引擎封装好只要链路能协商到满宽满速再配合 host 端内存读写工具测试很快能看出是 PCIe 物理层问题还是上层逻辑问题。很多工程师以为“FPGA 上电能看到配置寄存器”就等于 PCIe 通了其实那只是配置空间通了一小截真正要把数据搬到内存中间还隔着 DMA、地址映射、中断全套链路。调试时记得先看 REFCLK 波形是否干净、PERST# 有没有毛刺、电源纹波是否超标。这三点如果全部正常再考虑把责任推给协议层。PCIe 的“玄学”问题最后标准答案基本都是电源不良、时钟不稳、接触不良这三件事里的一件。我自己做 PCIe 板卡的体会是原理图阶段多想五分钟能省掉调板阶段五小时。尤其是电源树、复位时序、参考时钟、AC 耦合电容位置这些细节初看都是“小事”实际一跑高速就全部变成大事。先把这几台地基打好后面的路自然顺。
返回列表