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对齐的不只是总线地址让漏缓存维护可重复地失败典型故障:DMA 正常完成但 CPU 校验失败

CPU 看到的值不一定在 DDR

本实验的 PS HP0 路径不自动维护 CPU cache 一致性。CPU 刚写入的 TX 可能只在脏缓存行里,DMA 从 DDR 读到旧值;DMA 写入 DDR 后,CPU 也可能继续读取 RX 的旧缓存副本。volatile 只改变编译器访存优化,既不把脏行写回,也不让缓存行失效。必须将所有权转移与缓存操作写进每次传输流程。

缓存维护和内存屏障各司其职;完成确认后才能重新读取 RXCPU 拥有填写 TX / RX交给 DMAclean + barrierDMA 拥有CPU 禁止触碰收回 CPU完成 + invalidate一次软件命令对应一个流式包;仅 VALID && READY 时接受数据
缓存维护和内存屏障各司其职;完成确认后才能重新读取 RX(原创示意,非器件引脚图;窄屏可横向滑动)

对齐的不只是总线地址

软件选择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。

c
clean(tx,CAP);
clean(rx,CAP);
barrier();
/* 提交 RX/TX,检查双通道完成及错误 */
barrier();
invalidate(rx,CAP);
barrier();

让漏缓存维护可重复地失败

主机后端分别保存 CPU 数组与模拟 DDR 数组,因此可以稳定复现漏写回与漏失效,而不用依赖真实硬件某次缓存命中。这是控制流程测试,不是缓存微架构仿真;它不覆盖共享缓存行、预取、别名映射或多核一致性。两种故障输出相同 DATA_MISMATCH,但它们发生在不同方向,需要通过 ILA 与软件日志进一步区分。

  1. 运行无故障应用

    预期与判定:12次逐字节比较通过。

  2. 注入 NO_FLUSH

    预期与判定:模拟 DDR 仍含旧 TX,变换器输入就已经错误。

  3. 注入 NO_INVALIDATE

    预期与判定:DDR 中结果正确,CPU 仍读到0xcc旧副本。

  4. 去掉故障重新运行

    预期与判定:两条缓存路径恢复后矩阵通过,不以关闭 cache 作为最终修复。

主机模型命令;不会自动修改板卡 cache 设置。

bash
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 仍读旧值,应重点审查接收后的失效与所有权。真实硬件共享行污染可能随机出现,不能仅靠一次复测就判断已经修复,应重复不同长度并检查数组地址和相邻数据。

完成检查

  • 已记录本章配置、版本及预期结果。
  • 能区分本地模型验证与实际板上证据。
  • 能复现典型故障并说明修复后的复测标准。

延伸阅读与来源

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

继续阅读

FPGA

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

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

10 分钟
FPGA

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

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

11 分钟
FPGA

如何读懂时序报告

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

10 分钟