FPGA 进阶实战 · 04 协议、跨域与故障回归
将接口顺序、时钟比例、复位和数据检查放进同一套可运行测试矩阵。
先修知识完成 FPGA FIFO 六章基础实战;理解同步时序、非阻塞赋值与 ready/valid。
适用环境Basys 3 / xc7a35tcpg236-1;板上 100/50 MHz 同源时钟;Icarus Verilog、Python 3;Vivado 2024.1 命令参考。
验证状态三组时钟 RTL 测试、两类负向测试及板上自检器的软件模型已通过;Vivado、物理 CDC 和 ILA 上板尚需实测。
把验证目标拆成可证伪的检查
验证不能只跑一段理想激励后看完成灯。本工程把 AXI 通道配对、响应保持、数据变换、忙时处理和复位恢复分开检查,每个失败都有不同标识。确定性测试使第一笔差异可以复现,三组时钟与相位扩大事件排列覆盖,但这仍不是穷尽验证,更不模拟真实器件的亚稳态概率。
执行矩阵并解释输出
主循环检查六十四笔输入,再加入一笔忙时保持和一笔复位恢复交易,因此每组正常输出为六十六笔。板上 manager 则专注连续六十四笔自检,软件模型运行冷启动和按钮复位后两轮。两者计数不同来自测试范围不同,不应强行改成一样,更不能把软件模型的 LED 输出说成板卡上的实际观测。
| 检查 | 失败信号 |
|---|---|
| 地址/数据遗漏或无响应 | AXI_TIMEOUT |
| 反压期间响应变化 | AXI_B_UNSTABLE / AXI_R_UNSTABLE |
| 字节使能错误 | WSTRB_MERGE / WSTRB_ZERO |
| 跨域数据不符 | CDC_MISMATCH / CDC_HELD_DATA_CHANGED |
| 复位后旧状态泄漏 | RESET_STALE_RESULT / RESET_REPLAY |
| 板上 manager 软件模型 | BIST_LED / BIST_TIMEOUT |
在解压后的 fpga-advanced 目录执行。软件仿真不需要 Vivado;硬件步骤需目标工具与板卡。
python3 flow.py sim
# ADV_PASS transactions=66 ... clocks=10/14
# ADV_PASS transactions=66 ... clocks=14/10
# ADV_PASS transactions=66 ... clocks=10/22
# ADV_MATRIX_PASS clocks=3
python3 flow.py bist
# ADV_BIST_PASS run=0 led=01 transactions=64
# ADV_BIST_PASS run=1 led=01 transactions=64复现两个独立故障
数据故障通过参数翻转变换结果的最低位,第一笔正常期望为十六进制 486ea5a6,故障值为 486ea5a7。接口故障通过编译宏错误地要求 AW 和 W 同拍,触发地址数据未配对超时。外层脚本只有看到预期失败才返回成功,正常版仍必须单独通过;不能删除检查器或改变期望值来让故障版本变绿。
- 执行正常矩阵
预期与判定:三种时钟比逐笔通过,保存完整日志。
- 执行数据故障
预期与判定:三组都在第零笔出现预期的最低位差异。
- 执行协议故障
预期与判定:三组都被 AXI_TIMEOUT 检出。
- 恢复正常基线
预期与判定:移除故障配置重跑,并记录软件验证的覆盖边界。
在解压后的 fpga-advanced 目录执行。软件仿真不需要 Vivado;硬件步骤需目标工具与板卡。
python3 flow.py sim --fault
# CDC_MISMATCH seq=0 expected=486ea5a6 actual=486ea5a7
# ADV_NEGATIVE_PASS
python3 flow.py sim --axi-fault
# AXI_TIMEOUT ...
# ADV_NEGATIVE_PASS
python3 flow.py bist --fault
# 软件模型:两次 led=11典型故障:只看进程返回码
负向测试的外层进程返回零,是因为内部仿真按预期失败并且标识匹配。这种结构方便自动回归,但如果报告只保存退出码就容易误解。日志必须同时保存故障类型、首个失败点和外层判定,并与正常运行日志分开,才能说明检查器有能力检测问题而不是放过问题。
完成检查
- 保存正常矩阵与两类故障证据。
- 理解 66 笔测试与 64 笔 BIST 的区别。
- 没有把 RTL 仿真当作物理 CDC 签核。
延伸阅读与来源
本文为黄河电子原创教学说明。产品命令与支持范围请以实际安装版本的官方文档为准。
- Arm AMBA AXI / ACE IHI0022H
A3 通道握手;B1 AXI4-Lite。寄存器行为与示例实现为本文原创设计。
- AMD UG903 · Constraining Asynchronous Signals
跨域数据路径最大延时与时钟组例外的优先级。
- AMD UG908 · Programming and Debugging
Hardware Manager 与 ILA 配置、触发及采集。
继续阅读
FPGA从 RTL 到板上运行的完整流程
建立约束、实现、下载与观测的最小工程闭环。
第一个工程的引脚与时钟约束
区分电气连接与时间要求,避免“能生成位流就算正确”。
如何读懂时序报告
从起点、终点、时钟和裕量找出失败路径的原因。
黄河电子