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 通道配对、响应保持、数据变换、忙时处理和复位恢复分开检查,每个失败都有不同标识。确定性测试使第一笔差异可以复现,三组时钟与相位扩大事件排列覆盖,但这仍不是穷尽验证,更不模拟真实器件的亚稳态概率。

RTL、板上 manager 软件模型和真实器件验证属于不同证据层级。输入矩阵时钟 / 通道先后协议检查握手 / 稳定 / 错误码数据检查独立期望值复位回归取消旧事务 / 重发正常测试和故障测试分别验收;负向通过表示故障被检出
RTL、板上 manager 软件模型和真实器件验证属于不同证据层级。(原创示意,非器件引脚图;窄屏可横向滑动)

执行矩阵并解释输出

主循环检查六十四笔输入,再加入一笔忙时保持和一笔复位恢复交易,因此每组正常输出为六十六笔。板上 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;硬件步骤需目标工具与板卡。

bash
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 同拍,触发地址数据未配对超时。外层脚本只有看到预期失败才返回成功,正常版仍必须单独通过;不能删除检查器或改变期望值来让故障版本变绿。

  1. 执行正常矩阵

    预期与判定:三种时钟比逐笔通过,保存完整日志。

  2. 执行数据故障

    预期与判定:三组都在第零笔出现预期的最低位差异。

  3. 执行协议故障

    预期与判定:三组都被 AXI_TIMEOUT 检出。

  4. 恢复正常基线

    预期与判定:移除故障配置重跑,并记录软件验证的覆盖边界。

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

bash
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 签核。

延伸阅读与来源

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

继续阅读

FPGA

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

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

10 分钟
FPGA

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

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

11 分钟
FPGA

如何读懂时序报告

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

10 分钟