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 核由五十兆赫时钟采样。探针优先选择本域寄存器和本域同步后的控制,避免把跨域原始信号当作稳定证据。两个核独立触发,采样索引相同不代表发生在同一时刻,应结合请求翻转、数据模式和确认顺序关联事务。

没有硬件同步触发承诺;不能把不同核的第 N 个样本直接对齐。AXI ILAreq / ack_sync / manager发送事务held_data / STARTworker ILAreq_sync / FIFO / ack关联证据同笔数据 + 因果顺序两核各 1024 点:10.24 μs 与 20.48 μs,不保证覆盖完整回归
没有硬件同步触发承诺;不能把不同核的第 N 个样本直接对齐。(原创示意,非器件引脚图;窄屏可横向滑动)

选择探针并保留版本证据

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;硬件步骤需目标工具与板卡。

bash
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 核可触发首笔错误数据,随后沿因果链检查,不需要等待整个回归完成。

  1. 下载与版本确认

    预期与判定:bit/ltx 配对,两个 ILA 的 BUILD_ID 与清单一致。

  2. 布置正常触发

    预期与判定:按住复位,AXI reset 位 2、worker reset 位 0 分别设置下降沿,分别 Arm。

  3. 释放并保存

    预期与判定:记录两域窗口、采样频率、触发条件和首笔正常结果。

  4. 故障与回归

    预期与判定:复现 486ea5a6 对 486ea5a7,恢复正常版本后重新验证。

在解压后的 fpga-advanced 目录执行。软件仿真不需要 Vivado;硬件步骤需目标工具与板卡。

bash
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。
  • 首错由数据和握手证据支持。
  • 恢复正常版本,保存复位与回归结果。

延伸阅读与来源

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

继续阅读

FPGA

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

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

10 分钟
FPGA

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

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

11 分钟
FPGA

如何读懂时序报告

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

10 分钟