FPGA 进阶实战 · 06 双时钟 ILA 与板上首错定位
让两个 ILA 分别观察本域信号,以请求、确认和数据因果关系定位跨域故障。
先修知识完成 FPGA FIFO 六章基础实战;理解同步时序、非阻塞赋值与 ready/valid。
适用环境Basys 3 / xc7a35tcpg236-1;板上 100/50 MHz 同源时钟;Icarus Verilog、Python 3;Vivado 2024.1 命令参考。
验证状态三组时钟 RTL 测试、两类负向测试及板上自检器的软件模型已通过;Vivado、物理 CDC 和 ILA 上板尚需实测。
分别在各自时钟域观察
进阶工程使用两个 ILA,AXI 核由一百兆赫时钟采样,worker 核由五十兆赫时钟采样。探针优先选择本域寄存器和本域同步后的控制,避免把跨域原始信号当作稳定证据。两个核独立触发,采样索引相同不代表发生在同一时刻,应结合请求翻转、数据模式和确认顺序关联事务。
选择探针并保留版本证据
AXI 核探针零记录邮箱状态,探针一记录 manager 状态及总线握手,探针二记录 BUILD_ID;worker 核探针零记录 FIFO 和请求确认,探针一同样记录 BUILD_ID。开始排障前应把两个编号和发布清单对应起来,确认使用同次生成的 LTX。探针解码工具仅解释保存的采样值,不会自动判断跨域协议是否正确。
| 探针 / 位段 | 内容 |
|---|---|
| AXI probe0[71:40] / [39:8] | held_data / result |
| AXI probe0[7:2] | req / ack_sync / ready / result_valid / start / reset |
| AXI probe1[31:30] / [29:26] / [25:19] | done、fail / manager 状态 / seq |
| AXI probe1[18:9] | AWVALID、AWREADY、WVALID、WREADY、BVALID、BREADY、ARVALID、ARREADY、RVALID、RREADY |
| worker probe0[72:41] / [40:9] | fifo_out / return_data |
| worker probe0[8:0] | req_sync / ack / state[2:0] / count[2:0] / reset |
在解压后的 fpga-advanced 目录执行。软件仿真不需要 Vivado;硬件步骤需目标工具与板卡。
python3 decode.py axi 0x0
python3 decode.py worker 0x0
# 将 0x0 替换为对应 probe0 的实际 80 位采样值
# 正常第零笔:payload=0x12340003,result=0x486ea5a6
# 故障第零笔:result=0x486ea5a7按复位、布置触发、释放的顺序采集
先按基础教程枚举并核对 JTAG 目标,下载本工程发布物。按住按钮使两域进入复位,在 Hardware Manager 分别选择两个核,设置各自 reset 位的下降沿触发并启动采集,再释放按钮。这样窗口覆盖测试开始附近;若要定位故障版首错,AXI 核可触发 fail,worker 核可触发首笔错误数据,随后沿因果链检查,不需要等待整个回归完成。
- 下载与版本确认
预期与判定:bit/ltx 配对,两个 ILA 的 BUILD_ID 与清单一致。
- 布置正常触发
预期与判定:按住复位,AXI reset 位 2、worker reset 位 0 分别设置下降沿,分别 Arm。
- 释放并保存
预期与判定:记录两域窗口、采样频率、触发条件和首笔正常结果。
- 故障与回归
预期与判定:复现 486ea5a6 对 486ea5a7,恢复正常版本后重新验证。
在解压后的 fpga-advanced 目录执行。软件仿真不需要 Vivado;硬件步骤需目标工具与板卡。
python3 flow.py program baseline \
--target "<实际完整 JTAG 目标 URI>" --device "<实际器件名>"
# 硬件预期,待实测:正常完成 LED=01
python3 flow.py prepare fault --ila --fault
# 对 fault 独立完成 synth / impl / review / bit / program
# 硬件预期,待实测:故障完成 LED=11
# 排障后恢复 baseline,并重新验收典型故障:把跨域延迟误读成丢事务
一个请求经过两级同步和目的域状态机之后才产生确认,两个采集窗口的触发位置又可能不同,因此波形看起来不会逐列对齐。若只按样本编号寻找同一笔数据,容易把正常跨域延迟误判成丢失。先验证源端确实锁存,再验证目的域看见请求并完成 FIFO 操作,最后确认源端收到 ack 和正确结果。
完成检查
- 两个核都使用本域采样并核对 BUILD_ID。
- 首错由数据和握手证据支持。
- 恢复正常版本,保存复位与回归结果。
延伸阅读与来源
本文为黄河电子原创教学说明。产品命令与支持范围请以实际安装版本的官方文档为准。
- Arm AMBA AXI / ACE IHI0022H
A3 通道握手;B1 AXI4-Lite。寄存器行为与示例实现为本文原创设计。
- AMD UG903 · Constraining Asynchronous Signals
跨域数据路径最大延时与时钟组例外的优先级。
- AMD UG908 · Programming and Debugging
Hardware Manager 与 ILA 配置、触发及采集。
继续阅读
FPGA从 RTL 到板上运行的完整流程
建立约束、实现、下载与观测的最小工程闭环。
第一个工程的引脚与时钟约束
区分电气连接与时间要求,避免“能生成位流就算正确”。
如何读懂时序报告
从起点、终点、时钟和裕量找出失败路径的原因。
黄河电子