异步FIFO空满判断,为何不能直传二进制指针?
二进制指针进位时会多位同时变化,异步采样可能拼出从未存在过的地址
异步FIFO通常保留本地二进制指针用于寻址,再把指针转换成格雷码跨时钟域。格雷码减少多位翻转带来的组合歧义,但每一位仍需同步,空满标志也必须在本时钟域生成。
异步FIFO仿真读写正常,跑到板上却偶发空标志提前出现,或者满标志短暂抖动。直接把写指针的二进制总线送进读时钟域,再给每一位加两级触发器,看起来已经处理了亚稳态,问题仍可能藏在进位边界。
关键不是某一位有没有同步,而是多位是否代表同一个源时刻。二进制从0111跳到1000时四位都可能变化,目标域可能采到任意混合组合。这个码字甚至从未在源域稳定存在,比较逻辑自然会做出错误判断。
多位同步器不能保证总线原子采样
每一位两级同步器只能降低该位亚稳态向后传播的概率,不能让四条物理路径拥有完全相同的延迟。源指针多位同时翻转时,各位可能在目标时钟的不同周期被识别。
图1 异步信号进入目标时钟域需要多级触发器同步
多时钟设计资料用多级触发器说明异步信号需要在目标域重新定时。对单比特状态这很合适,对多位编码却还要保证相邻状态之间不会同时改变多个比特。
**单比特同步器解决传播概率,多比特编码还要解决码字一致性。**
格雷码把相邻计数限制为一位变化格雷码的相邻计数只有一个比特翻转。目标域即使在翻转窗口采样,结果通常只可能靠近旧值或新值,不再容易拼出远离真实位置的随机二进制组合。
这种设计与组合逻辑冒险的思路相通:多条路径同时变化会在不同传播延迟下产生短暂错误。资料中的逻辑路径图展示了输入同时改变时,组合输出可能出现毛刺。
图2 多条组合路径延迟不一致,会在输出形成短暂错误
格雷码之后仍然要过同步器格雷码只把一次合法状态变化压缩为单比特,不会让异步采样失去亚稳态风险。跨域的每个格雷位仍应经过目标时钟驱动的同步寄存器,再交给空满比较逻辑。
跨域总线还要控制物理偏斜。如果某些格雷位绕线过长,两个相邻源周期的变化可能在目标端过度错开,破坏“一次只看到一个变化”的工程假设。约束与布局不能完全交给逻辑编码兜底。
图3 多位变化经不同路径到达时,仿真波形会出现短毛刺
**格雷码减少歧义,不等于可以绕过CDC结构和物理约束。**
空满标志只在本时钟域比较写时钟域用本地写指针与同步过来的读格雷指针判断满,读时钟域则用本地读指针与同步过来的写格雷指针判断空。比较器输出也应在所属时钟域内注册,避免异步组合结果直接控制数据通路。
图4 异步FIFO指针先转格雷、再同步,并在本时钟域生成标志
满判断不仅比较地址低位,还要处理回卷相位。具体最高位翻转规则取决于FIFO结构和指针宽度,应使用经过验证的实现或对照设计文档推导,不能只写一个地址相等条件。
验证重点放在边界与时钟比。随机读写还不够,要覆盖读写指针接近、同时跨越回卷点、两个时钟频率接近以及频率比快速变化的场景。断言可以检查不写满、不读空和指针单步格雷变化。
板级问题往往与相位组合有关,短时间仿真不一定撞到。形式验证、CDC检查、跨域偏斜约束和门级时序共同使用,比在逻辑分析仪里等一次偶发标志更可靠。
源域生成格雷码时,应先注册二进制下一值和对应格雷值,避免组合转换逻辑自身的传播延迟在跨域总线上形成额外毛刺。把未注册的组合格雷码直接送入同步器,会削弱“一次只变化一位”的假设,尤其是在高速或逻辑层级较深时。
同步器寄存器应使用器件与工具推荐的属性,帮助布局工具把级联触发器放得更近,并让静态时序与CDC工具正确识别。普通逻辑优化若重定时或复制了同步寄存器,可能改变原本审查过的结构,所以综合后的网表仍要回看。
空满标志的延迟是安全设计的一部分。同步指针通常落后源域若干目标时钟,因此满标志可能偏保守地早一点阻止写入,空标志也可能晚一点释放读取。追求零延迟而绕过同步,会把容量利用率问题换成数据破坏风险。
复位释放也属于跨时钟设计。两个时钟域可以异步拉复位,但释放通常要分别同步到各自时钟域,并保证指针和标志从一致状态开始。一个域已经计数、另一个域仍在复位时,错误空满判断可能在正常读写之前就出现。
调试时不要把同步后的格雷指针立即转回二进制再跨域使用。需要二进制值时,应在目标域对稳定的同步格雷码做转换,并让后续逻辑继续受该目标时钟控制。
结论异步FIFO不能直传二进制指针,不是因为二进制不能计数,而是进位时多位同时变化,目标域可能采到不存在的组合。
格雷码、每位同步、本地比较和物理偏斜约束缺一不可;只加两级触发器,不足以让一条多位总线自动变安全。
声明:
本文由凡亿教育整理,转载请注明来源!
投稿/招聘/广告/课程合作/资源置换 请加微信:13237418207

扫码关注



















![Cadence17.4 GD32 ARM高速电路PCB硬件设计实战[第二部]](https://api.fanyedu.com/public/uploads/image/course/20200518/92b8de8dc1073a42c2d24b16c709e55e.jpg)

















