FPGA 流式实战 · 06 ILA 流控排障与采集窗口计数

按本域握手解释写满、读空、反压和包尾,并把局部采样转换为可复核指标。

先修知识完成 FPGA AXI / CDC 进阶课程;掌握同步 FIFO、握手、Gray 编码和时序报告基础。

适用环境Basys 3 / Artix-7;板上写 100 MHz、读 50 MHz;Python 3、Icarus Verilog;Vivado 2024.1 命令参考。

验证状态六场景 RTL 测试、两类故障检出及顶层软件模型已验证;性能表为仿真测量,Vivado 与板上 ILA 尚需实测。

本文目录给两个时钟域安排不同观察任务探针布局与实际触发下载、布置触发和窗口计数典型故障:局部窗口被当作完整传输

给两个时钟域安排不同观察任务

写域 ILA 观察本地写指针、同步后的读指针、满状态和输入握手,用来判断上游何时被阻塞。读域 ILA 观察输出记录、读指针、同步写指针、RAM 空状态和预取动作,用来判断数据是否保持与何时真正消费。两核独立触发,不能把相同采样序号直接对齐,应该结合本域序号和数据模式解释因果。

1024 点分别覆盖 10.24 μs 和 20.48 μs,只是整个实验的一段窗口。写核full / valid / ready跨域队列指针发布与同步读核data / keep / last窗口分析稳定性 / 有效字节仅在本域 VALID 与 READY 同时为 1 的时钟沿转移数据
1024 点分别覆盖 10.24 μs 和 20.48 μs,只是整个实验的一段窗口。(原创示意,非器件引脚图;窄屏可横向滑动)

探针布局与实际触发

每个核都带 BUILD_ID,用于先确认下载的位流和 LTX 来自同次构建。写满触发适合观察输入停止推进,读端反压触发适合观察输出槽保持,包尾触发则必须同时限定真实握手。RAM 空并不等于输出无效,不能只根据 empty 信号判断是否还有最后一拍;这一点可以在波形里直接验证。

设计契约与检查依据
项目工程含义
write probe0[23:19] / [18:14] / [13:9]wbin / wgray / rgray_sync
write probe0[8:0]full / valid / ready / last / keep[3:0] / reset
read probe0[61] / [60:57] / [56:25]last / keep / data
read probe0[24:20] / [19:15] / [14:10]rbin / rgray / wgray_sync
read probe0[9:5]empty / valid / ready / fetch / reset
其他探针写核 sent 与 BUILD_ID;读核 received、fail/done/cycles 与 BUILD_ID

在解压后的 fpga-stream 目录执行;软件测试需要 Python 3、iverilog 和 vvp。

bash
python3 decode.py write 0x0
python3 decode.py read 0x0
# 用实际 probe0 的 64 位采样替换 0x0
# 写满触发:write[8]=1
# 读反压触发:read[8]=1 且 read[7]=0
# 包尾握手:read[61]=1 且 read[8:7]=0b11

下载、布置触发和窗口计数

按前章完成审查和位流生成后,枚举并确认准确的 JTAG 目标。按住复位,设置两个核各自的触发条件并分别启动,再释放按钮。正常完成后应看到完成灯亮且失败灯灭,但仍需保存实际波形;导出读域数据后映射为标准列,才能用随包工具计算局部吞吐,不能把人工示例 CSV 当作板卡采集。

  1. 核对版本

    预期与判定:两个 BUILD_ID 和同次 bit/ltx 对应。

  2. 采集反压

    预期与判定:保持复位时 Arm,释放后检查等待期间字段不变。

  3. 分析窗口

    预期与判定:只使用连续且无复位的本域样本,按 TKEEP 累加字节。

  4. 故障与回归

    预期与判定:独立 fault 构建复现首拍错误,恢复 baseline 后重新采集验收。

在解压后的 fpga-stream 目录执行;软件测试需要 Python 3、iverilog 和 vvp。

bash
python3 flow.py program baseline \
  --target "<实际完整 JTAG URI>" --device "<实际器件名>"
# 硬件预期,尚待实测:正常 LED=01
python3 capture_metrics.py fixtures/capture-example.csv --period-ns 20
# 人工示例:8周期、4次接受、14有效字节、1个握手TLAST、87.5 MB/s
# 实际导出需映射为 cycle,data,keep,last,valid,ready 六列

典型故障:局部窗口被当作完整传输

ILA 深度只能覆盖有限时间,窗口起点可能落在包中间,窗口末尾也可能留下尚未消费的有效拍。局部计数因此不能直接证明整个四千多拍传输没有丢包。采集工具把结果标记为窗口指标,并检查周期连续及反压稳定性;全程正确性仍需结合自检器计数、故障标志和完整测试结果。

完成检查

  • 能用本域握手解释满、空和反压。
  • 窗口指标可由原始采样复算。
  • 故障定位后恢复正常版本并保存证据。

延伸阅读与来源

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

继续阅读

FPGA

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

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

10 分钟
FPGA

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

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

11 分钟
FPGA

如何读懂时序报告

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

10 分钟