时钟与复位架构:异步复位同步释放、CDC 与复位域交叉
更新时间:2026-10-01。芯片回来后最难复现的偶发 bug,很多不在数据通路,而在时钟与复位的交界处:复位撤除沿撞上时钟沿、一个模块已跑起来而对端还在复位里、切时钟时输出窄毛刺。它们在几十微秒的复位窗口内不会暴露,上板后却表现为「冷启动偶发不起、热重启正常」。本篇把时钟分发、glitch-free 切换、异步复位同步释放、RDC 与 CDC 签核、复位树和 DFT 测试复位串成一条线,基础概念可回看 时钟与复位 与 复位设计 异步断言同步释放。
本文要回答的问题
- 一颗多时钟域 SoC 的时钟从晶振到触发器,中间经过哪些环节,各自出问题是什么形态?
- 异步复位为什么必须「异步断言、同步撤销」,撤除沿和时钟沿撞上时电路内部发生了什么?
- 复位域交叉(RDC)和普通 CDC 有什么不同,为什么仿真里的 X 态、硅片上的亚稳都从这里冒出来?
- 单 bit、电平、脉冲、多 bit 总线跨时钟域分别该用什么结构,异步 FIFO 为什么用格雷码指针?
- 复位树为什么要单独插缓冲、定释放顺序,DFT 扫描测试时复位又要怎么特殊处理?
一、系统级时钟架构:从晶振到几十个时钟域
一颗典型中端 SoC 的时钟链路是这样展开的:25 MHz 晶振进入时钟控制单元(CGU),经 PLL(锁相环)倍频到 1 GHz 量级,再经整数分频器派生 500/250/100 MHz 各档;每路进模块前挂集成门控单元(ICG,Integrated Clock Gating),由 clk_en 或电源管理状态机控制开关。always-on 域则直接用 32.768 kHz 低速时钟,保证主 PLL 关断时唤醒计时器还活着。规划原则是「域数尽量少、每个域说得出理由」:同一 PLL 分频出来且分频比固定的时钟按同步域处理,只有真正频率无关(两个独立 PLL、晶振与外部输入口)才划成异步域,因为每多一个异步域就多一组 CDC 签核成本。
这张分发图有三个要点。第一,50% 占空比的奇数分频必须在时钟下降沿采样再做逻辑合并,手写分频器还要在 SDC 里让工具理解生成时钟关系,写法见 时钟分频偶数/奇数。第二,门控必须用 ICG 而不是 clk & en 与门:en 在时钟沿附近变化时,与门会切出窄毛刺,ICG 内部用低电平有效锁存器把 en 稳住再相与。第三,PLL 从断电到锁定(lock)需几十到几百微秒,启动顺序永远是「晶振先跑 → PLL 等 lock → 切到 PLL」,期间内核先跑旁路时钟或停在保持态。配置细节见 SoC 时钟控制器 PLL/mux/分频/门控。
二、glitch-free 时钟切换:两个下降沿触发器守住选择沿
运行中切换时钟源(PLL 与旁路晶振互切、双 PLL 主备切换)时,绝不能让普通组合 MUX 的选择信号直接控制时钟:select 任意时刻翻转,输出都可能切出几百皮秒的窄毛刺,下游触发器把它当一个时钟沿采一次,流水线就乱了一拍,且在 ATE 和低速仿真里都难复现。标准的 glitch-free clock mux 让两路时钟各带一个「在本时钟下降沿更新」的选择使能,两使能互斥——申请切换的一侧先等另一侧彻底关断,才在自己的下降沿打开输出,再经与或结构合成时钟。选择沿永远落在低电平半周,输出端不可能出现切到一半的脉冲。
时序上,从写下切换请求到 clk_out 稳定,最坏要经历旧时钟关一次、新时钟下降沿开一次,通常是 2 到 3 个较慢时钟周期;两路频率悬殊时(32 kHz 切 1 GHz)等待慢侧关断可能花掉近百微秒,所以软件必须读 mux 完成状态位,不能假设下一拍就是新频率。即使无毛刺,切换瞬间新旧相位仍任意,相关时序约束要覆盖切换点;高可靠场景还用 时钟监控 CMU 故障检测与失效切换 监测停振并自动切备份时钟。电路推导见 无毛刺时钟切换。
三、异步复位同步释放:把唯一的危险沿交给同步器
复位策略几乎一边倒地选择「异步断言、同步撤销」(async assert, sync de-assert)。断言必须异步:上电时 PLL 未锁定、时钟不存在,复位只能靠不依赖时钟的路径立即生效,把触发器钉到已知态。撤除不能异步:rst_n 释放沿若落在触发器的建立/保持窗口内,释放点就进入亚稳区,同一条复位树上的触发器有的这拍醒、有的下拍醒,复位后状态不可预测。复位同步器解决它:外部复位接两级触发器的异步清零端,两级触发器由时钟驱动、D 端绑高;断言时整串异步清零,释放后输出经两级与时钟对齐,再送进复位树。
第一级在释放沿本身可能亚稳,这正是它的作用:把亚稳限制在这一个点上,给它一个完整周期收敛,第二级采到稳定值。两级同步后的平均无故障时间(MTBF)按亚稳常数 τ 与采样窗口计算,28 nm、几百 MHz 下超过 10^6 年量级,方法见 亚稳态与 MTBF 定量分析。同步器两级之间是真时序路径,不能设假路径;复位树释放沿才按 false_path 处理。推荐全芯片复用统一的 reset_sync 单元:
module reset_sync (
input wire clk,
input wire rst_n_async,
output wire rst_n_sync
);
reg q1, q2;
always @(posedge clk or negedge rst_n_async) begin
if (!rst_n_async) {q2, q1} <= 2'b00;
else {q2, q1} <= {q1, 1'b1};
end
assign rst_n_sync = q2;
endmodule更完整的变体(去复位毛刺过滤、断言脉宽展宽)见 复位同步器 异步断言同步释放。还要给外部复位留够断言脉宽:POR 电路一般保证毫秒级低电平,但按键手动复位经过 RC 滤波后可能只有几十微秒,必须大于复位树最慢路径上的缓冲延迟,否则最末端的触发器可能没收到完整清零。
四、复位域交叉 RDC:一个已醒来,一个还在复位
芯片里有多个复位域时(核局部复位只复位 CPU、外设保持运行;低功耗退出时 always-on 域先释放、主域后释放),就会出现复位域交叉:驱动端已撤销复位、数据开始翻转,接收端却还在复位中。危险落在两个窗口。其一是接收端释放沿:跨域输入若恰好在变化,就是普通 CDC 亚稳;其二更隐蔽——驱动端在复位中时,真实硅片上输出并不干净,断言/撤除过程中可能短暂处于中间电平被采成亚稳;门级仿真里未初始化信号直接是 X,经同步器传播会污染一片逻辑。
处理纪律与 CDC 平行:结构上跨复位域信号同样过同步器,且同步器用接收域自己的复位做异步清零,保证复位期间输出干净、醒来第一件事就是重新同步;签核上用 RDC 工具列出所有跨不同复位信号的路径逐条 waiver。只做 CDC 不做 RDC 是最常见漏项——CDC 工具默认复位全局同时有效,不分析错开窗口。仿真侧也不能靠 +noX1 之类开关压掉复位 X,要修电路让 X 不可能逃逸。细节见 复位域交叉 RDC 跨复位域签核。
| 对比维度 | CDC(时钟域交叉) | RDC(复位域交叉) |
|---|---|---|
| 触发窗口 | 每次跨域数据变化 | 只在复位断言/释放的短暂窗口 |
| 失效形态 | 采到旧值或亚稳 | 亚稳、中间电平、仿真 X 传播 |
| 检查工具默认假设 | 需显式标记异步时钟 | 常被默认全局复位掩盖,易漏 |
| 同步器复位处理 | 一般不特别要求 | 建议用接收域复位异步清零 |
| 签核阶段 | CDC signoff | RDC signoff,两份独立报告 |
五、CDC 结构选择:两级同步、握手与异步 FIFO
跨域方案只取决于一件事:一个时钟周期内允许变化多少 bit。单 bit 电平用两级同步器,值延迟两拍但保证干净;单 bit 脉冲用 Toggle 同步:脉冲转电平翻转,接收域同步后做边沿检测,因为宽度只有一个发送周期的脉冲在慢接收域可能整拍看不到。多 bit 绝不能每位各打两拍——各位亚稳收敛相互独立,可能采到「新旧值拼出的中间组合」,如 0011 被采成 0001,指针直接跳飞。多 bit 正路有两条:只传事件时用 req/ack 握手,数据摆稳再拉 req,接收端同步、采样、回 ack,收到 ack 才允许改数据;持续流用异步 FIFO,读写各用各的时钟,空满靠格雷码指针——每次递增只翻一 bit,采到新旧值都是合法编码。
FIFO 深度按写快读慢的极端背靠背突发计算:突发写入拍数 ×(1 − 读速率/写速率),向上取整加裕量,见 FIFO 深度计算与设计。签核时对同步器两级间设 max_delay 约束,并保证第一级扇出唯一——多负载会拉长亚稳收敛时间。验证方法见 异步 FIFO 跨时钟验证,基础见 跨时钟域 CDC 亚稳态与两级同步器 与 格雷码 Gray Code 跨域。
六、复位树缓冲、释放顺序与 DFT 测试复位
复位是全芯片扇出最大的网络之一,一个全局复位可能挂几万到几十万个触发器,物理实现时要像时钟树一样插入多级缓冲,平衡各路延迟。时序策略看似矛盾:断言沿允许偏斜,晚几百皮秒进复位不影响功能;释放沿的偏斜却必须管理,因为它与本地时钟沿的关系决定触发器何时醒来。签核对复位树做恢复/移除时序检查(recovery/removal,即释放沿相对时钟沿的建立/保持要求),由 CTS 引擎顺带平衡。释放顺序也要钉死:「PLL 锁定 → always-on 释放 → 复位控制器释放 → 功能块按依赖顺序释放」,否则刚醒来的 DMA 可能去采还在复位里的地址译码器。复位原因登记见 系统复位控制器 POR/复位树/复位原因,物理实现见 CTS 时钟树综合高级。
DFT(可测性设计)又加一层要求。扫描移位时任何异步复位都必须被可靠抑制——复位线上一个抖动就会清空整条链。做法是测试模式下由锁存结构接管复位:移位期间强制无效,捕获(capture)阶段再按向量释放。复位同步器本身会阻断扫描链(D 端绑高、异步清零),要加测试旁路(test mux)让两级触发器并入扫描链,否则其内部缺陷永远测不到;门控时钟在测试时则由 OCC(On-Chip Clocking)输出可控移位时钟与全速测试脉冲。细节见 DFT 扫描压缩高级,存储初始化配合见 MBIST/LBIST 存储器自测试。
| 场景 | 复位行为 | 关键结构 |
|---|---|---|
| 上电冷启动 | POR 异步断言全部域,PLL 锁定后逐级释放 | POR + 复位同步器 + 释放顺序状态机 |
| 热重启/软复位 | 只复位核与外设部分域,always-on 保持 | 局部复位 + RDC 同步 |
| 扫描移位 | 强制所有异步复位无效 | 测试模式复位接管 |
| at-speed 捕获 | 按时钟脉冲精确控制释放点 | OCC + 同步器测试旁路 |
这一篇在知识体系里的位置
- 向上承接:时钟与复位 建立基本概念,复位设计 异步断言同步释放 与 跨时钟域 CDC 亚稳态与两级同步器 给出单点电路,本篇把它们组装成系统级时钟复位架构。
- 专项深入:复位域交叉 RDC 跨复位域签核、无毛刺时钟切换、异步 FIFO Gray 码指针与空满判断 分别展开本篇的三个子专题。
- 向后衔接:物理实现看 CTS 时钟树综合高级,制造测试看 DFT 扫描压缩高级,可靠性要求见下一篇 可靠性 AEC-Q100 与老化。
总结
时钟复位架构的核心纪律是「让每一个异步到来的沿——时钟选择沿、复位释放沿、跨域数据沿——都先经过与目的时钟对齐的同步化结构,再交给独立的静态签核兜底」:时钟侧用 PLL 加分频、ICG 门控和带下降沿互斥的 glitch-free 切换,复位侧用异步断言、同步释放把唯一的危险沿关进两级同步器,多域并存时 CDC 按单 bit 同步、多 bit 握手或格雷码异步 FIFO 分别处理,RDC 作为独立签核与仿真 X 审查堵住复位错开窗口,最后用缓冲平衡的复位树、有序释放和 DFT 测试接管保证上板可启动、出厂可测试。