3. CDC问题的物理根源

跨时钟域(CDC)问题并不是“代码写错了”这么简单,它的根源在于数字电路最底层的物理行为:当触发器的输入在时钟有效边沿附近发生变化,违反了建立时间(tsu)或保持时间(th)要求时,触发器内部的双稳态环路无法在规定时间内被推到确定的“0”或“1”状态,输出就会在一段时间内停留在中间电平附近,这就是亚稳态。理解CDC,本质上就是理解亚稳态如何产生、如何被量化、以及同步器在什么条件下会失效。

一、亚稳态的物理机理

一个D触发器内部由主从两级锁存器构成,每级锁存器本质上是一个正反馈环路。正常工作时,时钟边沿到来后,环路迅速被推向两个稳定点之一。但如果数据在“禁止窗口”内翻转,环路被推到一个接近平衡点的位置,此时它需要依靠正反馈的指数放大过程才能脱离中间态。这个脱离时间是不确定的,可能很快,也可能超过一个时钟周期,于是下一级电路可能采到既非高也非低的电平。

关键点在于:亚稳态不能完全消除,只能把“输出仍处于亚稳态”的概率降到可接受的水平。工程上通常用平均无故障时间(MTBF)来衡量这个概率,而不是追求“绝对不发生”。

二、MTBF计算模型

经典的两级触发器同步器MTBF模型为:

MTBF = e^(t_r / τ) / (T_0 × f_clk × f_data)

其中:
  t_r   :留给同步器第一级脱离亚稳态的可用时间(通常≈一个目的时钟周期减去后级建立时间)
  τ     :触发器的亚稳态分辨时间常数(工艺相关,PolarFire等28nm级器件典型在10~30 ps量级)
  T_0   :亚稳态窗口宽度相关常数(典型几十到几百 ps)
  f_clk :目的时钟频率
  f_data:异步数据翻转频率

从公式可以读出三个工程结论:第一,MTBF随可用分辨时间 tr 指数增长,所以多打一拍带来的收益是巨大的;第二,MTBF与目的时钟频率和数据翻转率成反比,时钟越快、数据越频繁,风险越高;第三,τ 和 T0 由器件工艺决定,选型时无法通过RTL改变,只能通过增加同步级数来补偿。

示例(合理假设,非实测):设 τ=20 ps,T0=100 ps,f_clk=100 MHz,f_data=10 MHz。若 tr=5 ns,则 e^(5000/20)=e^250,MTBF 极大;若 tr 仅 1 ns,e^50 仍很大,但若时钟升到 500 MHz 使 tr 降到 0.5 ns,MTBF 会显著下降。这说明高频设计中同步级数必须重新评估。

三、同步器失效条件

同步器失效通常不是“第一级没脱离亚稳态”这么单一,而是多种条件叠加:

  • 分辨时间不足:目的时钟频率过高,或两级触发器之间被插入了组合逻辑,导致 tr 被压缩。
  • 多比特同时跨域:多个信号各自独立同步,采样时刻不一致,目的域可能采到“半新半旧”的非法组合,如格雷码失效、状态机跳入非法态。
  • 同步器被综合/布局打散:两级触发器被放到不同Slice、走线过长,破坏了“紧耦合”假设,等效增加了 tr 的不确定性。
  • 复位或使能跨域:异步复位释放沿若未同步,会在目的域产生亚稳态或毛刺。
  • 时钟本身抖动或占空比失真:等效缩短了有效分辨窗口。

四、PolarFire器件中触发器与布线延迟的影响

PolarFire采用28nm FD-SOI工艺,其SEU(单粒子翻转)免疫的配置单元和触发器结构对亚稳态有一定天然优势,但这并不意味着可以省略同步器。真正需要关注的是布局布线延迟:

第一,PolarFire的通用布线资源存在分段延迟,若两级同步触发器被布局到相距较远的行列,二者之间的路由延迟可能达到数百皮秒甚至更高。这段延迟会直接吃掉 tr,使MTBF下降。因此Libero中应使用set_syn_preserve或同步器专用属性,把两级触发器约束到同一或相邻Slice。

第二,PolarFire的时钟网络(如全局时钟、区域时钟)到达不同触发器的偏斜(skew)会影响“有效分辨时间”的估算。若目的时钟到达第二级的延迟大于第一级,等效 tr 会被压缩。设计时应尽量让同步器使用同一时钟网络分支。

第三,PolarFire的LSRAM和uSRAM接口、DSP模块等硬核在跨域时也有各自的时序要求,不能简单套用通用触发器模型。例如从异步FIFO的读指针跨到写域,必须经过格雷码转换加两级同步,且格雷码的每一位都要独立同步后再组合,否则仍会出现多比特问题。

亚稳态产生与同步器分辨时间关系 源时钟域 数据在任意时刻翻转 f_data = 10 MHz 异步数据 第一级 FF 可能进入亚稳态 t_r 分辨时间 ≈ 目的时钟周期 - t_su 第二级 FF 输出稳定值 同步后信号 MTBF 随分辨时间 t_r 指数增长(示意) 可用分辨时间 t_r → MTBF(对数) t_r 不足 → MTBF 低 增加同步级数 → MTBF 高

五、工程判断与设计要点

面对CDC,正确的做法不是“加两级触发器就完事”,而是按以下顺序判断:

  1. 确认跨域信号是单比特还是多比特。单比特用两级同步器;多比特必须用格雷码、握手或异步FIFO。
  2. 估算目的时钟频率和数据翻转率,用MTBF公式反推所需同步级数。高频设计(如250 MHz以上)建议至少三级。
  3. 在Libero中为同步器添加布局约束,确保两级触发器紧邻,避免长走线吃掉 tr。
  4. 对异步复位释放沿做同步处理,避免复位跨域引入亚稳态。
  5. 用静态时序分析检查同步器路径是否被插入组合逻辑,确保 tr 不被压缩。
常见误区:认为“PolarFire是FD-SOI工艺,抗亚稳态能力强,所以可以少打一拍”。工艺改善的是 τ 和 T0,但MTBF仍随 tr 指数变化,减少同步级数带来的风险远大于工艺红利。同步器级数必须按最坏情况时钟频率和布线延迟来设计。

总结来说,CDC的物理根源是触发器在建立/保持窗口内被触发时无法及时脱离中间态;MTBF模型把这种随机性量化为可计算的指标;同步器失效往往来自分辨时间不足、多比特跨域或布局布线恶化;在PolarFire中,触发器本身的工艺优势不能替代正确的同步结构和布局约束。只有把物理机理、计算模型和器件实现三者结合,才能做出真正可靠的跨时钟域设计。