复位域交叉 RDC:被 CDC 掩盖的另一半跨域问题
更新时间:2026-09-12。本文是「集成电路大类 · 芯片设计」**进阶层(intermediate)**数字逻辑第四十四篇。CDC已被广泛重视,复位设计讲了 recovery/removal,这一篇把二者交汇处——复位域交叉(RDC) 系统讲清,它是现代多复位域 SoC 签核的必查项。
本文要回答的问题
- CDC 和 RDC 到底差在哪?为什么复位也要「跨域」检查?
- 异步复位在时钟沿附近释放会发生什么(recovery/removal 违例、退出不一致)?
- 为什么复位树根扇出大、偏斜比数据更危险?
- 「异步断言、同步释放」复位同步器具体怎么搭,为什么每个时钟域要各放一个?
- 多复位域、PLL 锁定后释放、复位拓扑怎么规划?RDC 工具查什么?
一、两类违例:recovery/removal 与跨域复位
**第一类:同一时钟域内的释放时刻违例。异步复位可以随时拉(assert),但释放(deassert)**必须避开时钟沿:
- recovery time(恢复时间):复位释放沿之后,到下一个有效时钟沿之前,需要稳定的最小时间——保证触发器已退出复位、能正常响应沿;
- removal time(移除时间):有效时钟沿之后,复位还需保持多久才能撤——类似复位版的 hold。
若 deassert 正落在沿附近,触发器可能进入亚稳态,更麻烦的是复位树巨大扇出带来复位偏斜:同一个 reset_n 到达成千上万个触发器的时刻不同,有的已开始跑、有的还被按在复位,状态机/FIFO 指针一部分活一部分死,行为不可预测。
**第二类:跨复位域。**一个处于复位(常为 0/X)的信号被另一个未复位域当数据用,会把 0 当有效值传播;或一个复位域的复位源意外接到/组合逻辑影响到另一个域。与 CDC 不同,复位在仿真早期常为 X,普通仿真甚至看不到——RDC 是出了名的仿真盲区。
二、标准解法:异步断言、同步释放
既想保留异步复位「一拉就生效、不依赖时钟」的好处,又要让释放沿干净,就用复位同步器:外部异步复位直接接到各触发器复位端(assert 异步、立刻安全),但在每个时钟域内,用一小串触发器把「释放」同步到本域时钟再分发:
module reset_sync #(parameter N=3) (
input logic clk, // 本时钟域时钟
input logic ext_rst_n, // 异步外部复位(可能来自另一域/上电)
output logic rst_n // 本域同步释放后的复位
);
(* ASYNC_REG="true" *) logic [N-1:0] sync;
always_ff @(posedge clk or negedge ext_rst_n)
if (!ext_rst_n) sync <= '0; // 断言:立刻异步清零
else sync <= {sync[N-2:0], 1'b1}; // 释放:逐级同步
assign rst_n = sync[N-1];
endmodule要点:①敏感表含 negedge ext_rst_n,所以断言异步;释放则要等 ext 拉高后经 N 个本域时钟沿才全 1,即同步释放,天然满足 recovery/removal。②ASYNC_REG 属性告诉工具这些是同步链,布局时贴近放置。③每个时钟域用各自的 clk 各实例化一个,不能拿 A 域同步出的复位去复位 B 域。
三、复位拓扑与保持时间
真实 SoC 是分级有序释放的:
- 上电后先用全局 POR 把全芯片按住;
- 等 PLL 锁定(lock)、时钟稳定;
- 时钟逻辑的复位先释放,时钟分频/门控稳定后;
- 再按依赖顺序释放各功能域(控制器先、接口后等),避免外设复位已解但时钟/配置未就绪。
复位有效时间要覆盖时钟稳定 + 若干周期(足够所有触发器看到有效复位);复位树用高扇出缓冲/CTS 平衡,工具把 reset 当特殊网络控制偏斜。对跨域的「功能复位」(运行时软复位某模块),被复位模块送到别的模块的接口应在复位时输出已知安全值(idle/valid=0),下游最好也对这类输入做隔离或同步。
四、RDC 签核查什么
RDC 静态检查(类似 CDC 工具)枚举:复位源到各复位域的拓扑、是否经同步器释放、跨域复位信号/受复位控制数据的传播、多复位与时钟的组合、复位排序/依赖。常见违规:直接把异步复位连进另一域触发器、用复位去组合组合逻辑产生「伪时钟/伪使能」、复位释放无同步、多域共享一个未经各域同步的 reset。与 CDC 检查一样,靠规则检查 + 结构约束 + 复位阶段仿真/X 传播仿真多重把关。
与现有篇目的衔接
总结
一句话总结:RDC 管的是复位断言/释放在不同复位-时钟域间交叉引起的失效,和 CDC 同样隐蔽但更易在仿真中漏检;它有两类问题——一是异步复位若在时钟沿附近释放会违 recovery/removal,加上复位树大扇出偏斜导致同一域各触发器退出复位时刻不一致甚至亚稳态,二是处于复位的 0/X 信号被别的域当有效数据传播;标准解法是「异步断言、同步释放」复位同步器:外部复位直接异步清零,但用各域自己的时钟经一串带 ASYNC_REG 的触发器逐级释放,且每个时钟域必须各放一套;系统级在 POR 后等 PLL lock、时钟稳定再按依赖顺序分级释放,并保证复位保持时间和复位树平衡;签核阶段用专门的 RDC 规则检查跨域复位拓扑、未同步释放与复位态 X 传播,与 CDC、时序约束一起构成多时钟多复位 SoC 的结构正确性底线。