问题现象
驱动联调时无法扫描到 Xilinx PCIe 设备,ILA 抓取 pcie_link_up 信号发现一直为低电平。
问题分析
遇到这问题时,先在 FPGA 里搭个最小系统测试环境,用 XDMA + BRAM 的形式,减少其他模块干扰。框架如下:

1. 检查 PCIe 时钟
时钟源很关键,务必用原理图里的 GT Ref 差分时钟,通过 IBUFDSGTE 转为单端时钟。



2. 检查 PCIe 复位
PCIE 复位信号有严格要求:上电后,PCIE_RESTN 需在电源稳定后延迟一段时间再释放,通常建议 100ms 以上。
这 100ms 期间系统主要在做这些事:
- 电源稳定时间
- 参考时钟稳定时间
- PCIe IP 核的复位和初始化时间
- 链路训练时间
典型时序分配参考:
- 0-10ms:电源稳定 (Power Stable)
- 10-20ms:参考时钟稳定 (Refclk Stable)
- 20-30ms:复位释放和 PLL 锁定 (Reset Release & PLL Lock)
- 30-50ms:物理层初始化 (PHY Initialization)
- 50-70ms:链路训练 (Link Training)
- 70-100ms:设备配置 (Device Configuration)
为了避免时序问题,建议在程序里加一段复位控制逻辑。虽然有时候硬件复位时序能自然满足要求,但加上更保险。

3. Lane 约束检查
检查你的 Lane 约束文件。XDMA IP 核生成时通常会自带一个约束文件,指定每个 Lane 的对外接口。当然也可以自己写,只要保证端口与原理图匹配就行。


如果这些确认无误还是无法 Link Up,可以先尝试将 PCIe 降速为 1.0 x1,看看情况是否有变化。
4. PCIe 降速测试

如果降速后依然不行,就需要深入检测 PCIe 的相关状态了。
5. 具体问题定位(查看 PCIe LTSSM 状态)
这时候得看 PCIe 的 LTSSM 状态机。LTSSM 是控制 PCIe 总线传输流程的状态机,由多个状态组成,每个状态代表不同的传输阶段。
5.1 给 LTSSM 信号添加 Debug
首先在配置界面勾选 Use Class Code Lookup Assistant 选项。

此时端口可能还显示不出 LTSSM 信号,别急。按流程生成 IP 核,执行完 Run Syn 操作后,点击 Set up debug。
在这里搜索 LTSSM 的小写形式,就能找到 ltssm_state 信号,将其添加到 Debug 里,正常综合实现即可。


5.2 LTSSM 状态说明
不同厂商 LTSSM 定义略有差异,这里以瑞芯微为例。我的状态卡在了 0x08(Lane 顺序检测),意味着是 Lane 的问题。

通过这个方式监控 LTSSM 信号的同时,还要关注几个关键信号。
5.3 其余关键信号说明
- phy_rdy_n:物理层就绪信号。0 表示物理层就绪,1 表示异常。用于检查时钟是否存在、复位序列是否正常、PLL 是否锁定以及电源是否 Power Good。
- cfg_current_speed_o:协商速率。PCIe 1.0/2.0/3.0 分别对应 1/2/3。
- link_width:协商宽度。
6. 故障点说明及解决
我的故障现象是:
phy_rdy_n为 0,说明物理层就绪,时钟和复位正常。- LTSSM 卡在 0x08,且
Link_width为 0,说明是 Lane 异常导致的。

重新检查电路后发现,主机 TX 端没有放置电容,而是用了电阻,导致 AC 耦合问题。将电阻更换为电容后,链路问题解决。

可以看到 Link Up 拉起,驱动可以正常检测到 PCIe 设备。


