FPGA 系统实战 · 06 用 ILA 与状态寄存器闭环排障

对齐软件日志、包边界和流控现场,区分无包尾、地址错误、缓存错误与性能瓶颈。

先修知识完成 FPGA AXI4-Stream / 异步 FIFO 实战;会读 AXI 时序、C 指针和链接 map。

适用环境ZedBoard Zynq-7020 / PS DDR;Vivado、Vitis 2024.1 参考;本地 Python 3 + cc + Icarus Verilog。

验证状态13 项本地用例通过:C 主机后端与教学 FIFO / RTL 组合;Vivado、Vitis BSP、厂商 IP、DDR 和板上 ILA 尚未实测。

本文目录用同一时钟观察变换器两侧明确探针映射与触发语义按最短证据链捕获问题典型故障:只复位 DMA 后再次运行仍失败

用同一时钟观察变换器两侧

参考设计在75 MHz 域放置一个 ILA,采集变换器输入和输出各五个信号。这样可以直接核对一拍弹性寄存器的延迟、异或结果、KEEP/LAST 保持以及反压。这里不把100 MHz 的 AXI 内存信号直接塞进同一个 ILA;要查看 DMA/HP0,应另加100 MHz ILA并重新实现,跨域波形只通过包内容和事件关联。

软件状态与本域握手相互印证;没有采集到事件不等于事件未发生UART / DMASR命令与状态ILA75 输入包 / 字节 / 接受ILA75 输出变换 / 停顿回到软件长度与逐字节比较一次软件命令对应一个流式包;仅 VALID && READY 时接受数据
软件状态与本域握手相互印证;没有采集到事件不等于事件未发生(原创示意,非器件引脚图;窄屏可横向滑动)

明确探针映射与触发语义

probe0到4依次是输入 data/keep/last/valid/ready,probe5到9是输出对应信号。采集深度4096,先跑64字节再跑4094字节;65536字节至少16384个有效拍,无法完整放入当前缓冲。只对 valid&&ready 的样本统计字节与包尾,不能把 last 在反压下保持多周期误判成多包。

配置与验收依据
项目设置 / 预期 / 处理
包尾触发probe7==1 && probe8==1 && probe9==1
输出停顿触发probe8==1 && probe9==0
应保持稳定输出 valid=1 且 ready=0 时,data/keep/last 不变
DMASR 0x10DMAIntErr:核查长度、包及内部错误,按 PG021 对应方向解释
DMASR 0x20 / 0x40DMASlvErr / DMADecErr:查内存响应与地址译码
无错误但超时检查接收启动、时钟复位、包尾和无限反压

寄存器定位示意;完整日志和错误处理在 platform_hw.h。

c
/* DMA 基地址来自 BSP,不能抄固定物理地址 */
mm2s_status = XAxiDma_ReadReg(dma.RegBase, 0x04);
s2mm_status = XAxiDma_ReadReg(dma.RegBase, 0x34);
actual_bytes = XAxiDma_ReadReg(dma.RegBase, 0x58);
/* 完成条件还需检查 Busy、错误位与 actual_bytes;不是只看 IOC。 */

按最短证据链捕获问题

下载相同构建的 bit 和 ltx 后,确认 ILA 的采样时钟持续运行、复位已释放。先 Arm 再启动软件命令,触发位置放在25%左右留下前因;如果触发永远不来,先换成无条件采集核查活动。保存波形CSV、寄存器状态、软件日志及版本,不只保存一张截图。修复后必须再次跑完整功能矩阵。

  1. 关联同一构建的 bit/ltx

    预期与判定:探针宽度和层级匹配,Hardware Manager 能识别 ILA。

  2. 小包设置包尾触发后 Arm

    预期与判定:输出捕获一次接受的 last;最后一个有效字节正确。

  3. 放大长度并捕获反压

    预期与判定:valid等待期间payload保持,释放ready后没有丢拍重拍。

  4. 保存与复测

    预期与判定:记录首个偏差、修复点和全矩阵结果,避免只证明触发能够命中。

这些命令复现教学故障的检查逻辑;板上事件仍须真实采集。

bash
python3 tests/run.py
# RTL DROP_LAST 用例应检出 TLAST_ERROR
FAULT=NO_TLAST /tmp/dma-host
# FAIL DMA_TIMEOUT,非零退出
FAULT=DECODE /tmp/dma-host
# FAIL DMA_ERROR status=40

典型故障:只复位 DMA 后再次运行仍失败

DMA 复位并不保证自定义变换器和两个 FIFO 内的半包被清空。上一轮异常留下的数据会污染下一轮,表现为第一个字节偏移、意外 TLAST 或实际长度异常。参考程序保存状态后停止,明确要求完整初始化通路再试。生产系统若需要在线恢复,必须设计共享 flush/reset 握手并禁止新命令,不能直接照搬一次复位寄存器写入。

完成检查

  • 已记录本章配置、版本及预期结果。
  • 能区分本地模型验证与实际板上证据。
  • 能复现典型故障并说明修复后的复测标准。

延伸阅读与来源

本文为黄河电子原创教学说明。产品命令与支持范围请以实际安装版本的官方文档为准。

继续阅读

FPGA

从 RTL 到板上运行的完整流程

建立约束、实现、下载与观测的最小工程闭环。

10 分钟
FPGA

第一个工程的引脚与时钟约束

区分电气连接与时间要求,避免“能生成位流就算正确”。

11 分钟
FPGA

如何读懂时序报告

从起点、终点、时钟和裕量找出失败路径的原因。

10 分钟