
本文概述
跨时钟域(CDC)是FPGA设计中最容易出问题也最容易被面试的知识点之一。本文从亚稳态原理出发,系统讲解单bit信号同步、多bit信号同步、握手协议、异步FIFO、格雷码等各类CDC处理方案的适用场景和设计要点,附常见面试评分要点。
核心要点速览
亚稳态不可避免,只能降低其发生概率
单bit信号用两级寄存器同步,高频或高可靠场景用三级
多bit信号绝不能用多级寄存器直接同步
异步FIFO是多bit CDC的标准方案,格雷码编码降低错误概率
CDC验证必须用专门的工具(如Synopsys SpyGlass CDC)检查
面试真题
面试官问:你做过跨时钟域设计吗?什么是亚稳态?不同位宽的信号跨时钟域分别怎么处理?
面试官考察点
CDC是FPGA工程师的核心基本功,面试官通过这道题能快速判断候选人的设计经验。考察维度包括:是否真正理解亚稳态的物理本质、是否能区分单bit和多bit的不同处理方法、是否知道各种方案的适用边界、是否有CDC验证和调试经验。
FPGA工程师CDC能力评分表
回答思路:CDC处理方案选型指南
单bit信号:两级寄存器同步
单bit控制信号(如使能、标志位)最常用的同步方式是两级寄存器同步器。第一级触发器采样可能进入亚稳态,第二级在一个时钟周期后采样,给亚稳态足够的恢复时间。代码上要注意:两个触发器必须在同一个always块中,且中间不能有任何组合逻辑。同步器命名建议加sync_前缀,方便CDC工具识别。
脉冲信号:脉冲同步器
如果需要传递的是一个脉冲信号(宽度只有一个周期),直接用两级同步可能采不到(特别是慢时钟域到快时钟域)。正确做法是:在源时钟域先把脉冲展宽为电平信号,同步到目的时钟域后,再用边沿检测还原为脉冲。反向传递也类似,还需要加握手反馈确保脉冲被正确接收。
多bit数据:异步FIFO + 格雷码
多bit数据跨时钟域的标准方案是异步FIFO。写入端用写时钟写数据,读出端用读时钟读数据。FIFO的空满标志通过同步读写指针来判断。为了降低多位指针同步的错误概率,指针使用格雷码编码——每次只有一位变化,同步错误概率大大降低。FIFO深度根据读写速率差和突发长度来计算。
控制+数据:握手协议
当不需要持续传输数据,只是偶尔传递一批数据时,可以用req/ack握手协议。发送端发出req和数据,接收端收到后采样数据并返回ack,发送端收到ack后撤除req,接收端看到req撤后撤除ack,一次传输完成。握手协议可靠但延迟大,适合控制类、低频率的数据传输。
面试官可能追问的问题
因为多bit信号的每一位走线延迟不同,到达触发器的时间有差异。如果数据变化时相邻几位刚好在建立保持时间窗口内变化,不同位可能在不同的时钟沿被采样,导致输出一个错误的中间状态值,这个值可能被后续逻辑使用造成功能错误。单bit信号即使亚稳态最终也会稳定到0或1,不会出现非法值。
两级同步器在大多数应用中MTBF已经足够高(可到数百亿年)。但在以下情况考虑三级同步:时钟频率非常高(如GHz级)、工艺节点比较旧、产品可靠性要求极高(如航天医疗)、亚稳态恢复时间Tr较短的工艺。三级同步器的MTBF比两级高几个数量级,但增加了一级延迟。
最保守的公式:深 = 写速率 × 读侧同步延迟 - 读速率 × 同步延迟。简化情况:如果读写同频不同相,深度可以很小(2-4);如果写比读快且是突发传输,深度要覆盖最大突发长度。实际工程中通常留2倍以上裕量,具体还要考虑读写频率比、突发模式、空满判定时机等因素。
DMUX同步是指用一个同步过的使能信号(单bit,已经过两级同步)去选通多bit数据,数据信号本身不经过同步器。前提是数据信号在使能有效期间是稳定不变的。适用于数据有一个有效指示信号的场景,比如 valid-ready 总线中的valid同步后再采data。
容易失分的表达
"多bit信号多加几级寄存器同步就行"——典型错误,可能导致功能故障
"亚稳态不会发生在我们的设计里"——不尊重物理规律
分不清快时钟到慢时钟和慢时钟到快时钟的区别
只知道FIFO,说不出格雷码、空满标志生成等实现细节
面试前准备动作
画出两级同步器电路图,理解亚稳态是如何被"过滤"的
手写一个脉冲同步器的Verilog代码(从慢时钟到快时钟、快到慢)
理解异步FIFO的完整结构:双口RAM、读写指针、格雷码转换、空满判断
了解CDC验证工具(SpyGlass CDC)能检查哪些问题
核心关键词
FPGA跨时钟域、CDC设计、亚稳态、两级寄存器同步、异步FIFO、格雷码、握手协议、脉冲同步器、MTBF、建立时间保持时间、FPGA面试

扫码关注





























