Palladium 事务级实战 · 06 故障定位与异步队列演进

用编号、计数和状态定位第一处异常,再理解 SFIFO / GFIFO 所需的完成和信用协议。

先修知识完成 Palladium FIFO 六章基础课程,理解同步 FIFO、非阻塞赋值与 VALID/READY。

适用环境本地 Python 3 + Icarus Verilog;目标参考 WXE 24.05 ISR5 / Xcelium 配套环境。

验证状态13 项本地 RTL 场景、6 项测量校验测试通过;Cadence 编译、Palladium 映射与设备性能尚未实测。

本文目录按事务生命周期定位第一处异常先运行可重复的故障注入SFIFO / GFIFO 不是给阻塞 task 换个名字故障练习:复位后的旧响应误配

按事务生命周期定位第一处异常

先回答请求是否接受,再回答 FIFO 是否完成写读,最后确认响应是否被消费。观察 req_valid/ready、id/len、state、pushed/popped/captured 和 rsp_valid/ready 能把故障限定到明确阶段。设备波形只需围绕首个失败编号采集;先用本地短序列复现,再扩大范围,避免一次记录整个长回归却没有可关联的事务信息。

记录首个失败 id 与预期值;设备采集方案需要目标工具验证。请求id / len / accept执行push / pop / capture返回status / stable软件逐字节判定先明确完成条件,再跨越软硬件边界
记录首个失败 id 与预期值;设备采集方案需要目标工具验证。(原创示意,非器件引脚图;窄屏可横向滑动)
工程契约与验收证据
项目规定 / 观察结果
TBA_DATA数据损坏或读延迟错误;比较第一次不同的字节
TBA_TAG响应归属错误;检查锁存 id 和复位边界
TBA_STATUS status=2长度为 0 或超过 32;修正调用者
TBA_STATUS status=3请求或响应等待超时;检查时钟、状态与握手

先运行可重复的故障注入

测试脚本将故障宏导致的失败视为预期检出,但只接受指定诊断;普通编译失败不会冒充故障测试通过。COURSE_BUG 翻转读出位,BAD_TAG 修改返回编号,DROP_RESPONSE 隐藏响应,BAD_REQUEST 发送零长度。它们是构造的教学故障,不是来自客户设备的真实事故记录;修复后的测试仍要重新确认全部正向场景。

  1. 先跑无故障完整测试

    预期与判定:正确输出和所有边界场景通过

  2. 单独启用 COURSE_BUG

    预期与判定:出现 TBA_DATA,定位第一处字节差异

  3. 分别启用 BAD_TAG / DROP_RESPONSE

    预期与判定:分别检出 TBA_TAG 与 status=3

  4. 关闭故障并全量重跑

    预期与判定:13 项通过,结果文件与源码摘要一致

本地独立复现实验;在工程根目录执行。

bash
mkdir -p /tmp/tba-debug-run
iverilog -g2012 -DCOURSE_BUG -s hw_top -s tb_host \
  -o /tmp/tba-debug-run/sim rtl/*.sv tb/tb_host.sv
(cd /tmp/tba-debug-run && vvp ./sim +N=64 +BATCH=16)
# 预期非零退出,并出现 TBA_DATA
# 完整测试使用 python3 test.py

SFIFO / GFIFO 不是给阻塞 task 换个名字

官方异步通路通过 SFIFO 从软件送往硬件,通过 GFIFO 返回软件;相关函数采用输入参数、void 返回等约束,不能把本例带 output 的 exchange 原样改名。异步提交后 host 可以继续工作,但必须单独接收完成消息,并通过编号关联结果。信用限制、队列容量、超时、复位 epoch 与取消语义都需要重新设计,本实验包尚未实现或验证这条异步路径。

工程契约与验收证据
项目规定 / 观察结果
阻塞 exchange调用返回时得到结果;本工程只有一个在途事务
异步提交提交成功仅说明入队;结果经另一条完成通道返回
信用限制实际在途请求,完成后归还;不能无限入队
复位禁止旧 epoch 响应误配新请求,定义排空或中止策略

异步演进的协议设计草图,不是可编译的 Cadence API 示例。

text
request  = {epoch, id, len, payload}
complete = {epoch, id, status, len, result}
submit only if credits > 0
on accepted submit: credits -= 1
on matched completion: retire id; credits += 1
on reset: stop submit; drain or abort; advance epoch

故障练习:复位后的旧响应误配

单在途阻塞工程通过只在空闲边界复位回避了旧响应重入问题。增加异步队列后,即使硬件状态已复位,链路中仍可能保留旧完成消息;若编号从零重新开始,软件可能错误地接受旧数据。因此异步版本需要 epoch、明确的停止提交和排空策略,并验证重置发生在请求接受、执行及返回各阶段时的行为。

完成检查

  • 能从首个失败编号关联请求、执行和响应。
  • 四种故障诊断均有可重复检出证据。
  • 明确异步队列仅为演进设计,不属于本工程已验证能力。

延伸阅读与来源

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

继续阅读

硬件仿真

首次使用前的工程检查清单

准备版本、输入和模型,减少第一次编译的无效往返。

10 分钟
硬件仿真

如何选择 SA/ICE 及交互方式

根据测试环境所在位置与目标接口要求选择运行流程。

11 分钟
硬件仿真

完成最小设计的编译运行

把第一次平台运行拆为有检查点的五个阶段。

10 分钟