真实面经题目 · 原创解析
多 bit 信号跨时钟域为什么危险,如何用格雷码或异步 FIFO 处理?
这题考跨时钟域可靠性,回答重点是多 bit 直接同步会产生不一致采样,格雷码适合指针类状态,异步 FIFO 适合数据流。
真实面经题目 · 原创解析
这题考跨时钟域可靠性,回答重点是多 bit 直接同步会产生不一致采样,格雷码适合指针类状态,异步 FIFO 适合数据流。
单 bit 控制信号跨域通常用两级同步器降低亚稳态传播概率,但多 bit 总线不能简单每一位各同步两拍。因为不同 bit 到达和解析时间不同,目标时钟可能采到源域从未存在过的中间值。格雷码相邻状态只变化一位,适合跨域传递递增指针或状态编号;但 Gray 指针跨域仍要加 bus skew/max delay 约束,保证目的时钟采样窗口内最多只看到一位变化。异步 FIFO 把数据留在双口存储里,跨域同步读写 Gray 指针,并用同步后的指针产生满空,复位释放顺序也要处理好。普通配置总线更适合 valid/ack 握手。
单 bit 信号的主要问题是触发器进入亚稳态;多 bit 信号还会有位间不一致问题。即使每一位最终稳定,目标域也可能在不同 bit 更新的间隙采到非法组合。
两级同步器适合慢变化的单 bit 电平或经过展宽的控制信号,不适合直接同步数据总线。对多 bit 控制量,必须保证目标域采样时所有 bit 属于同一个源域状态。
格雷码相邻计数值只改变一位,因此目标域同步时即使遇到边界,也不会把多个 bit 的不同更新时间组合成严重错误值。它常用于异步 FIFO 的读写指针同步,而不是任意数据总线的万能方案。
Gray 编码解决逻辑相邻性,但布线延迟过大时,目的域仍可能在采样窗口看到多个位先后到达。工程上要对跨域 Gray 指针设置 max delay 或 bus skew 约束,使各位到达偏差受控。
异步 FIFO 用双口存储隔离读写时钟域。数据本身不逐位同步,而是在写域写入、读域读出;跨域同步的是格雷码读写指针,满空判断基于同步后的指针,还要注意复位释放顺序。
配置寄存器、状态包或少量多 bit 控制信号可用 valid/ack、toggle 或 request/acknowledge 握手。源域在握手完成前保持数据稳定,目标域确认采样后再允许源域更新。
慢到快可以展宽后两级同步;快到慢容易漏采,通常用 toggle 同步、握手或异步缓存,确保目标域一定能观察到事件。
多出的最高位用于区分读写指针低位相同但处于不同环绕周期的情况,从而判断空和满,常与格雷码指针比较配合使用。
我会至少做仿真、lint、综合后资源检查、时序约束和 STA;涉及跨时钟域还要做 CDC 检查,涉及板级接口还要结合时序裕量和实测波形验证。