FPGA FIFO 与时钟域交叉
同步 FIFO、异步 FIFO 的使用边界,以及跨时钟域数据传输需要验证的条件。
- 问题
- 同步 FIFO、异步 FIFO 的使用边界,以及跨时钟域数据传输需要验证的条件。
- 环境
- FPGA · RTL · FIFO · CDC
- 状态
- 待发布
- 首次发布
- 2025年9月18日
- 最后更新
- 2026年8月10日
- 预计阅读
- 2 分钟
FIFO(先进先出缓冲)用于吸收突发流量、解耦生产者与消费者的速率,也常被用于跨时钟域传输。它不是“把两个时钟接在一起”的通用补丁:同步和异步 FIFO 面对的是不同问题。
同步 FIFO
同步 FIFO 的读写逻辑使用同一时钟,适合在同一时钟域内平滑瞬时速率差异。设计或配置时明确以下参数:
- 数据宽度与深度;
- 读写使能的握手语义;
full、empty、几乎满/空的定义;- 上溢和下溢时是拒绝操作、报错还是丢弃数据;
- 复位后读写指针和标志的期望状态。
异步 FIFO
异步 FIFO 的读写侧位于不同时钟域。读写指针不能把普通多位二进制信号直接跨域采样,否则采样时可能看到中间值。典型实现会使用适合跨域的指针编码、每个方向上的同步器以及基于同步后指针的满/空判断。
异步 FIFO 还必须处理复位释放顺序。即使数据路径正确,不同域在复位解除时看到的状态不同,也可能造成一次错误读写。使用厂商 IP 时,应阅读该 IP 对复位、有效信号和时钟比的具体要求。
数据宽度转换不是 CDC 的替代品
一些 FIFO IP 支持读写侧宽度不同,例如将 32 位总线转换为 8 位流。宽度转换处理的是数据打包关系;跨时钟域处理的是采样安全性。二者可同时存在,但应分别检查配置、容量换算、端序和边界条件。
验证清单
- 在仿真中覆盖空读、满写、突发读写和复位中断。
- 对异步 FIFO 使用工具的 CDC 检查,并审阅被豁免的路径。
- 给读写时钟施加不同频率与相位,验证标志不会短暂误判。
- 在目标器件上检查时序约束是否覆盖两个时钟域及其例外路径。
更完整的工程验证分层见 FPGA 开发流程与验证分层。