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 尚未实测。
用同一时钟观察变换器两侧
参考设计在75 MHz 域放置一个 ILA,采集变换器输入和输出各五个信号。这样可以直接核对一拍弹性寄存器的延迟、异或结果、KEEP/LAST 保持以及反压。这里不把100 MHz 的 AXI 内存信号直接塞进同一个 ILA;要查看 DMA/HP0,应另加100 MHz ILA并重新实现,跨域波形只通过包内容和事件关联。
明确探针映射与触发语义
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 0x10 | DMAIntErr:核查长度、包及内部错误,按 PG021 对应方向解释 |
| DMASR 0x20 / 0x40 | DMASlvErr / DMADecErr:查内存响应与地址译码 |
| 无错误但超时 | 检查接收启动、时钟复位、包尾和无限反压 |
寄存器定位示意;完整日志和错误处理在 platform_hw.h。
/* 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、寄存器状态、软件日志及版本,不只保存一张截图。修复后必须再次跑完整功能矩阵。
- 关联同一构建的 bit/ltx
预期与判定:探针宽度和层级匹配,Hardware Manager 能识别 ILA。
- 小包设置包尾触发后 Arm
预期与判定:输出捕获一次接受的 last;最后一个有效字节正确。
- 放大长度并捕获反压
预期与判定:valid等待期间payload保持,释放ready后没有丢拍重拍。
- 保存与复测
预期与判定:记录首个偏差、修复点和全矩阵结果,避免只证明触发能够命中。
这些命令复现教学故障的检查逻辑;板上事件仍须真实采集。
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 握手并禁止新命令,不能直接照搬一次复位寄存器写入。
完成检查
- 已记录本章配置、版本及预期结果。
- 能区分本地模型验证与实际板上证据。
- 能复现典型故障并说明修复后的复测标准。
延伸阅读与来源
本文为黄河电子原创教学说明。产品命令与支持范围请以实际安装版本的官方文档为准。
- AMD PG021 · AXI DMA 7.1
Direct Register Mode、S2MM_LENGTH、DMA 状态位及 DRE。
- AMD embeddedsw 2024.1 · Simple Poll Example
对照先接收后发送、cache maintenance 与驱动 API;本站示例为原创实现。
- AMD PG085 · AXI4-Stream Infrastructure
AXI4-Stream Data FIFO、独立时钟与复位配置。
- AMD UG908 · Programming and Debugging 2024.1
Hardware Manager、ILA 触发、探针文件与位流匹配。
继续阅读
FPGA从 RTL 到板上运行的完整流程
建立约束、实现、下载与观测的最小工程闭环。
第一个工程的引脚与时钟约束
区分电气连接与时间要求,避免“能生成位流就算正确”。
如何读懂时序报告
从起点、终点、时钟和裕量找出失败路径的原因。
黄河电子