问题现象:
与驱动联调:驱动无法扫描到Xilinx的PCIE设备
通过ila抓取pcie_link_up信号:发现link up一直为低
问题分析:
出现这种情况,在FPGA中搭建测试环境,使用XDMA+BRAM的形式,减少其它模块的影响,框架如下:

1 检查PCIE的时钟
时钟,必须使用原理图上的GT Ref 差分时钟,通过IBUFDSGTE转为单端时钟



2 检查PCIE 复位
复位:PCIE复位信号有要求--上电后,PCIE_RESTN信号需在电源稳定后延迟一段时间再释放,通常是100ms以上
而这100ms的时间,系统主要做以下的事情:
-
电源稳定时间
-
参考时钟稳定时间
-
PCIe IP核的复位和初始化时间
-
链路训练时间
// 典型的100ms时间分配:
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)
所以为了避免这个问题,建议在程序中添加这么一段复位控制,但是有的时候你不添加也没有关系,因为有的时候硬件的复位时序可以满足这个100ms的要求,但是保险起见还是加上

3 LANE检查
检查你的LANE约束,一般XDMA IP核生成的时候会自带一个约束文件,约束每个LANE的对外接口,但我们也可以自己约束,保证端口与原理图匹配即可。


这些确认无误,还是无法link up的,先将PCIE降速为1.0 X1,看看情况
4 PCIE降速

如果还是不行,那我们需要检测pcie的相关的几个状态。
5 具体问题定位(PCIE LTSSM状态)
这里我们需要查看PCIE的LTSSM状态机,那什么是LTSSM状态机呢?
是一种常用于PCI Express(PCIe)接口的状态机,它可以控制PCIe总线的传输流程。LTSSM由多个状态组成,每个状态都代表了不同的总线传输阶段。
一般大家会找不到,按照如下的方式
5.1 给LTSSM信号添加debug
首先:勾选配置界面的Use Class Code Lookup Assistant这个选项

此时还是无法在端口显示出LTSSM信号,不要着急,按照你的流程生成IP核,执行完Run Syn操作,然后点击Set up debug

在这里搜索LTSSM的“小写”,就能找到ltssm_state的信号,将其添加到debug里面正常的综合实现就可以了。

5.2 LTSSM状态说明
LTSSM状态机根据厂商不同会有微小的差异,我们使用的是瑞芯微的,我的状态卡在了08即Lane顺序检测。意味着是lane的问题。

那我们通过这个方式监控的除了LTSSM信号以外,还有几个关键信号
5.3 其余关键信号说明
phy_rdy_n:物理层就绪,一种存在性检查,0:表示物理层就绪 1:表示异常
时钟是否存在?
复位序列是否正常?
PLL是否正常锁定?
电源是否power good
cfg_cuurent_speed_o:协商的速率,PCIE1.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设备。
1万+

被折叠的 条评论
为什么被折叠?



