FPGA 系统实战 · 04 管理缓存与缓冲区所有权
解释 HP0 非一致性路径,复现漏 clean、漏 invalidate 与缓存行共享问题。
先修知识完成 FPGA AXI4-Stream / 异步 FIFO 实战;会读 AXI 时序、C 指针和链接 map。
适用环境ZedBoard Zynq-7020 / PS DDR;Vivado、Vitis 2024.1 参考;本地 Python 3 + cc + Icarus Verilog。
验证状态13 项本地用例通过:C 主机后端与教学 FIFO / RTL 组合;Vivado、Vitis BSP、厂商 IP、DDR 和板上 ILA 尚未实测。
CPU 看到的值不一定在 DDR
本实验的 PS HP0 路径不自动维护 CPU cache 一致性。CPU 刚写入的 TX 可能只在脏缓存行里,DMA 从 DDR 读到旧值;DMA 写入 DDR 后,CPU 也可能继续读取 RX 的旧缓存副本。volatile 只改变编译器访存优化,既不把脏行写回,也不让缓存行失效。必须将所有权转移与缓存操作写进每次传输流程。
对齐的不只是总线地址
软件选择64字节对齐的静态数组,且大小恰为64的倍数,因此覆盖 Cortex-A9 的32字节缓存行而不共享边界。为了让教学实验更容易审查,每次维护整块独占数组,即使本轮只传64字节;这会增加小包成本,但避免半行与相邻变量混用。优化成按长度向上取整时,仍必须保证整个涉及的缓存行属于该缓冲区。
| 项目 | 设置 / 预期 / 处理 |
|---|---|
| 发送前 | clean TX;DMA 随后读取 DDR |
| 接收前 | clean 独占 RX,避免残留脏行晚些回写覆盖 DMA |
| 接收后 | 确认完成,invalidate RX,再读结果;不得 clean 旧 RX |
| DMA 在途 | CPU 不访问 RX、不修改 TX;中断或其他线程同样遵守 |
| Linux 迁移 | 使用 DMA mapping / dma_alloc_coherent 等内核 API;不把用户虚拟地址交给硬件,不照搬裸机 cache 函数 |
完整应用中的所有权边界;clean/invalidate 的硬件实现调用 Xil_DCache API。
clean(tx,CAP);
clean(rx,CAP);
barrier();
/* 提交 RX/TX,检查双通道完成及错误 */
barrier();
invalidate(rx,CAP);
barrier();让漏缓存维护可重复地失败
主机后端分别保存 CPU 数组与模拟 DDR 数组,因此可以稳定复现漏写回与漏失效,而不用依赖真实硬件某次缓存命中。这是控制流程测试,不是缓存微架构仿真;它不覆盖共享缓存行、预取、别名映射或多核一致性。两种故障输出相同 DATA_MISMATCH,但它们发生在不同方向,需要通过 ILA 与软件日志进一步区分。
- 运行无故障应用
预期与判定:12次逐字节比较通过。
- 注入 NO_FLUSH
预期与判定:模拟 DDR 仍含旧 TX,变换器输入就已经错误。
- 注入 NO_INVALIDATE
预期与判定:DDR 中结果正确,CPU 仍读到0xcc旧副本。
- 去掉故障重新运行
预期与判定:两条缓存路径恢复后矩阵通过,不以关闭 cache 作为最终修复。
主机模型命令;不会自动修改板卡 cache 设置。
FAULT=NO_FLUSH /tmp/dma-host
# FAIL DATA_MISMATCH
FAULT=NO_INVALIDATE /tmp/dma-host
# FAIL DATA_MISMATCH
/tmp/dma-host
# PASS suite=12 transfers典型故障:DMA 正常完成但 CPU 校验失败
先区别数据在进入 PL 前已经错误,还是只有 CPU 读回错误。若 ILA 输入符合 TX 模式、输出满足异或关系、DMA 状态正常,而 CPU 仍读旧值,应重点审查接收后的失效与所有权。真实硬件共享行污染可能随机出现,不能仅靠一次复测就判断已经修复,应重复不同长度并检查数组地址和相邻数据。
完成检查
- 已记录本章配置、版本及预期结果。
- 能区分本地模型验证与实际板上证据。
- 能复现典型故障并说明修复后的复测标准。
延伸阅读与来源
本文为黄河电子原创教学说明。产品命令与支持范围请以实际安装版本的官方文档为准。
- AMD PG021 · AXI DMA 7.1
Direct Register Mode、S2MM_LENGTH、DMA 状态位及 DRE。
- AMD embeddedsw 2024.1 · Simple Poll Example
对照先接收后发送、cache maintenance 与驱动 API;本站示例为原创实现。
- AMD PG085 · AXI4-Stream Infrastructure
AXI4-Stream Data FIFO、独立时钟与复位配置。
- AMD UG908 · Programming and Debugging 2024.1
Hardware Manager、ILA 触发、探针文件与位流匹配。
继续阅读
FPGA从 RTL 到板上运行的完整流程
建立约束、实现、下载与观测的最小工程闭环。
第一个工程的引脚与时钟约束
区分电气连接与时间要求,避免“能生成位流就算正确”。
如何读懂时序报告
从起点、终点、时钟和裕量找出失败路径的原因。
黄河电子