工作技术 / ASYNC FIFO & CDC
一种非 2 次幂深度异步 FIFO:物理指针、Gray 进度计数与准静态数据跨域
把“访问哪个 entry”“已经推进多少事务”和“跨域何时可见”分开,理解非 2 次幂存储深度与 Gray 进度同步如何配合。
物理 Ptr 管理 slot,Gray Cnt 传递累计进度。目的域可以跳过中间 Gray state;Data 的安全捕获依赖稳定窗口和实际时序预算。
01存储位置与 FIFO 深度
D 是 FIFO 深度。它用于覆盖 entry 被占用到释放 credit 返回发送端的延时。先按发送速率与延时预算选择深度,再配置进度计数器范围。
| 状态 | 解决的问题 | 配置依据 |
|---|---|---|
WrPtr / RdPtr | 下一次访问哪个物理 entry | 按实际深度 D 循环 |
WrCnt / RdCnt | 写入、读取累计推进了多少步 | 使用完整的 2 次幂 Gray 状态空间;范围足以区分 0 到 D 项 |
FIFO 深度 D | credit 返回前,继续承接发送端的数据 | 数据传递、消费与 credit 返回延时;兼顾 burst 和需要覆盖的停顿 |
增加深度可以减少等待 credit 的停顿、吸收突发;若长期生产速率高于消费速率,有限 FIFO 仍会填满。
02累计进度怎样跨域
操作:单步观察 → 连续播放 → 暂停接收端,观察 Full 与 credit 返回。完整窗口打开动画 ↗
| 目的端观察 | 含义 | 行为 |
|---|---|---|
| 跳过中间 Gray state | 看到了更新的累计进度 | 不要求为每个 Packet 单独观察一次源状态 |
RdCnt == WrCntSync | Empty | 禁止读取不存在的数据 |
(WrCnt − RdCntSync) mod M 达到 D | 写端可见占用量达到深度 | Full;禁止覆盖未确认释放的 entry |
| 读进度同步滞后 | 写端看到的可用空间偏少 | 可能延迟恢复发送;不会由滞后凭空产生 credit |
图中的状态跳步以 Gray crossing 满足物理传播与同步要求为前提。计数进度和 Packet 排队过程应分别观察。
03数据何时可以安全捕获
| 观察指标 | 条件或标称关系 | 边界 |
|---|---|---|
| 同步状态可见 | φ + (S−1) × Tdest | S 为同步级数;0 ≤ φ < Tdest |
| 首包捕获 | 若目的端下一拍捕获:φ + S × Tdest | 功能级标称关系;亚稳态可能延长可见时间 |
| Valid 首次置位 | Empty → Non-Empty | 后续 Packet 还受到排队、服务和 downstream blocking 影响 |
| Ready 恢复 | Full → Non-Full | credit 更新不一定产生 Ready 的 0 → 1 |
| Slot Metadata | 和 Data 存入、读取同一个 slot | 具有相同 Packet lifetime |
| 实时 Sideband | 表示当前状态,独立同步 | 不随 FIFO 排队 |
04约束与验证边界
| 路径类型 | 必须检查的关系 |
|---|---|
| Gray progress → 目的域同步器 | 限制跨域传播,保持源状态变化所需的物理时序假设 |
| 准静态 Data / Slot Metadata | 目的端捕获前完成稳定,并满足捕获所需保持窗口 |
| Rx RdPtr → MUX → Rx capture | 按实际 Rx launch/capture 关系检查 round-trip path |
| 实时 Sideband → 独立同步器 | 按各自 CDC mechanism 检查 |
| 验证场景 | 必须保持的行为 |
|---|---|
| Empty 后首包 / 连续 burst | 有效后再捕获;Packet 顺序不变 |
| Full / Full 后释放一个 entry | 禁止覆盖;credit 穿过 CDC 后才能解除相应 backpressure |
| 两域边沿同时发生 | 都读取同一 pre-edge state,再原子提交 |
| Source 更快 / Destination 更快 | 允许目的域跳步;双向进度传递均正确 |
| Downstream stall | 允许时延增加;不 underflow、不 overwrite,占用量保持在 0 到 D |
本文是通用架构说明。图示与功能模型不能代替物理 CDC 验证;约束应匹配具体 crossing mechanism。