FPGA Debug:PCIE一直自动重启(link up一直高低切换)

问题:与驱动联调,驱动端显示PCIE一直自动重启;

               在FPGA侧,抓取信号发现,link up一直高低切换,LTSSM状态机也在进行状态切换。

                phy_rdy_n信号:持续为0,说明复位没有发生高低跳变,但是LTSSM状态机改变意味着,PCIE链路训练有问题。

问题分析:

搭建单独的PCIE+BRAM的测试环境,PCIE启动正常。

而实际的工程是PCIE+Aurora的工作机制

考虑是PCIE与Aurora相互影响:

查看程序:

1 PCIE是上电100ms之后释放复位

2  Aurora是上电之后大约16个clk就释放复位信号

虽然从理论上来说,满足各自的复位时序要求,但是PCIE释放复位的时机晚于Aurora接口

      我们本次使用的是Xilinx 7系列FPGA,具体型号是XC7A100T。这个器件有多个Quad,每个Quad包含4个收发器通道和一个共享的QPLL。我们使用的是两个不同的Quad(Quad213用于PCIe,Quad216用于Aurora)。

       首先,我们需要理解这两个Quad在硬件上的时钟和复位架构。虽然每个Quad都有自己的QPLL,并且参考时钟是从外部输入的,但是它们之间可能存在一些共享的时钟资源,例如时钟缓冲器(如IBUFDS_GTE2)和时钟分布网络。此外,PCIe和Aurora IP核在初始化时可能会对全局的时钟和复位有一些要求。

        根据Xilinx的文档,PCIe硬核的复位序列有严格的要求。PCIe硬核必须在一个稳定的参考时钟下进行复位,而且这个参考时钟必须满足一定的稳定性要求。如果Aurora的GT复位在PCIe复位之前释放,那么Aurora的收发器可能会开始工作,并可能影响到共享的时钟资源(例如,如果两个Quad使用了同一个时钟缓冲器或同一个时钟区域),从而可能导致PCIe的参考时钟变得不稳定,进而导致PCIe初始化失败。

         另外,即使两个Quad使用独立的参考时钟,它们也可能共享同一个时钟区域(Clock Region)的资源,或者存在一些全局复位信号(例如,用户逻辑产生的复位)同时影响了两个Quad。因此,为了保证PCIe的稳定初始化,通常建议先释放PCIe的复位,确保PCIe核心已经稳定,然后再释放其他收发器(如Aurora)的复位。

          鉴于此,我们对复位时序进行修改:Aurora在等待PCIE的link up拉起之后100ms再释放Aurora的复位

      为什么PCIe的复位不能在Aurora的GT复位之后释放?可能是因为Aurora的GT复位释放后,Aurora收发器开始工作,可能会对时钟网络造成一些扰动(例如,时钟缓冲器的输出可能因为Aurora的复位释放而发生变化),而PCIe对参考时钟的稳定性非常敏感,因此必须确保在PCIe复位期间和复位之后,参考时钟都是稳定的。

所以,正确的做法是:

  1. 确保PCIe和Aurora的参考时钟稳定。

  2. 先释放PCIe的复位,并等待PCIe核心初始化完成(例如,等待PCIe的locked信号或稳定状态)。

  3. 然后再释放Aurora的复位。

这样能够保证PCIe在初始化过程中有一个稳定的时钟环境。

在解决 XDMA 与 Zynq 连接时 XDMA 无法初始化 Linkup问题时,需要从多个角度进行排查,包括硬件连接、配置寄存器、时钟同步、复位控制、PCIe 链路训练状态等。以下是详细的分析与解决方法: ### 1. 检查硬件连接 确保 XDMA IP 与 Zynq UltraScale+ MPSoC 的 PCIe 接口正确连接。Zynq 的 PCIe 控制器作为 Root Complex(RC),XDMA IP 作为 Endpoint(EP)。需要确认以下几点: - PCIe 的 TX/RX 差分对是否正确连接。 - 是否使用了正确的 PCIe 时钟源(例如 100 MHz 参考时钟)。 - 是否使用了正确的电压电平和电源供给。 ### 2. 确认 PCIe 链路训练状态 Linkup 失败通常是因为链路训练未成功完成。可以通过以下方式检查链路状态: - 查看 XDMA IP 中的 `pipe_rate`、`link_up`、`ltssm_state` 等信号,确认链路是否进入 `L0` 状态。 - 在 Zynq 的 PCIe 控制器中,读取 `CSR` 寄存器(如 `PCIE_REG_CSR`)以确认链路是否建立成功。 - 使用 Vivado 的 ILA 或 ChipScope 工具捕获链路训练信号,确认是否完成 `LTSSM`(Link Training and Status State Machine)流程。 ### 3. 配置 XDMA IP 的参数 在 Vivado 中实例化 XDMA IP 时,需要确保以下配置与 Zynq 的 PCIe 控制器一致: - PCIe 的 `Gen1/Gen2/Gen3` 速率设置。 - PCIe 的 `Lane Width`(如 x1、x2、x4)。 - `BAR` 地址空间的大小与对齐方式。 - MSI/MSI-X 中断支持的使能状态。 ### 4. 配置 AXI 接口与时钟域 XDMA IP 通过 AXI4 和 AXI4-Lite 接口与用户逻辑交互。需要确保以下几点: - AXI 接口的时钟频率与复位信号是否正确。 - AXI-Lite 接口用于访问 XDMA 的寄存器,必须确保地址映射正确,并且 Zynq 能够访问 XDMA 的配置空间。 - 若使用了 Clock Crossing 模块,需确认跨时钟域信号是否同步处理。 ### 5. 配置中断控制器与 MSI/MSI-X 支持 根据引用 [2],Zynq 在 PCIe 驱动中为 MSI 中断申请了两个中断域,并连接到 GIC 的 122 和 123 引脚。需要确保: - XDMA IP 中的中断输出信号 `interrupt_out_msi_vec` 正确连接到 Zynq 的中断控制器。 - 在 Linux 内核驱动中,正确请求并注册 MSI 中断处理函数。 - 在硬件设计中,MSI 中断信号是否通过 `xilinx_pcie_msi_handler_low` 和 `xilinx_pcie_msi_handler_high` 正确级联到 GIC。 ### 6. 检查 Zynq 的 PCIe 控制器配置 Zynq UltraScale+ MPSoC 的 PCIe 控制器需正确配置为 RC 模式。可以通过以下方式验证: - 在 Zynq 的 FSBL(First Stage Bootloader)或 U-Boot 阶段,检查 PCIe 控制器的寄存器配置。 - 在 Linux 内核中,使用 `lspci` 命令查看是否检测到 XDMA 设备。 - 检查 `/sys/bus/pci/devices/` 下是否有对应的设备节点。 ### 7. 调试工具与日志 - 使用 Vivado 的 Hardware Manager 连接到 FPGA,查看 XDMA IP 的状态寄存器。 - 在 Linux 内核中启用 PCIe 的调试选项(如 `CONFIG_PCI_DEBUG`)。 - 使用 `dmesg` 查看内核日志,确认 PCIe 驱动是否报告链路训练失败或配置错误。 ### 8. 示例代码:读取 XDMA 状态寄存器 以下是一个使用 AXI-Lite 接口读取 XDMA 状态寄存器的示例代码: ```c #include <stdio.h> #include <fcntl.h> #include <unistd.h> #include <sys/mman.h> #define XDMA_REG_BASE 0x40000000 // XDMA AXI-Lite 寄存器基地址 #define XDMA_REG_SIZE 0x10000 int main() { int fd = open("/dev/mem", O_RDWR | O_SYNC); if (fd < 0) { perror("open"); return -1; } void *reg_base = mmap(NULL, XDMA_REG_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, XDMA_REG_BASE); if (reg_base == MAP_FAILED) { perror("mmap"); close(fd); return -1; } uint32_t *reg = (uint32_t *)reg_base; uint32_t status = reg[0]; // 读取第一个状态寄存器 printf("XDMA Status: 0x%x\n", status); munmap(reg_base, XDMA_REG_SIZE); close(fd); return 0; } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FPGA_小田老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值