FPGA面试:跨时钟域CDC如何处理?两级同步器、握手和异步FIFO怎么选?
一、参考回答
CDC(Clock Domain Crossing)关注的是信号从一个时钟域进入另一个没有确定相位关系的时钟域时,如何避免亚稳态扩散和数据采样不一致。最常见的错误,是把多位总线的每一位都各自接两级触发器,然后认为这样就安全了。两级触发器同步器主要适合单比特、持续时间足够长的电平信号,它能降低亚稳态传播到后级逻辑的概率,但不能保证多位总线在同一个目标时钟周期被一致采样,也不能保证窄脉冲一定被采到。单周期脉冲跨域通常需要脉冲展宽、toggle同步或请求/应答握手;连续或突发多位数据跨域,通常使用异步FIFO,利用独立读写时钟、Gray码指针和同步器传递状态。
二、回答时要讲清楚的关键点
单比特状态信号:通常使用目标时钟域的两级或多级触发器同步,并根据可靠性要求评估MTBF;同步器寄存器应按FPGA厂商建议添加ASYNC_REG等属性。
窄脉冲信号:若脉冲宽度小于目标时钟采样窗口,可能完全丢失。可以使用toggle编码、脉冲同步器或握手机制,确保事件不会漏采。
多位控制总线:不要逐位独立同步后直接拼接。应采用稳定数据窗口配合握手,或使用编码约束明确的数据传输协议。
连续数据流:优先考虑异步FIFO。读写指针通常采用Gray码跨域同步,降低多位二进制指针同时翻转引起的采样歧义;同时正确处理满/空标志、复位释放和时钟关系约束。
三、工程判断对照

不要把set_false_path或set_clock_groups当成CDC修复。时序约束只能告诉STA工具如何分析路径,不能替代硬件同步结构;CDC检查、同步器识别、复位策略和功能验证都要做。
如果源时钟域每个周期都会发出一个脉冲,而目标时钟比源时钟慢很多,简单的两级同步器为什么可能漏事件?你会选择toggle、握手还是FIFO?
技术资料:AMD:Asynchronous Clock Domain Crossing(UG574);AMD:Clock Domain Crossing Design Methodology(UG1387)

扫码关注
































