什么是「异步复位、同步释放」?
更新时间:2026-09-21。问题驱动短答页。复位设计见 复位设计,时钟与复位概念见 时钟复位概念,异步复位差异见 同步与异步复位。
一句话回答
「异步复位、同步释放」是指复位「按下」时异步生效——不需要等时钟沿,所有触发器立刻进复位态(快且确定);但复位「松开」时不让撤销沿直接冲向全片,而是先经过一个由本时钟驱动的小同步器,让释放动作对齐到时钟沿、统一起跑。这样既保留异步复位响应快的优点,又避免撤销沿落在建立保持窗口里导致部分触发器逃出复位、部分还没逃出。
为什么释放这一下危险
异步复位触发器有个和建立/保持类似的参数叫复位恢复时间(recovery/removal):复位撤离沿之后,要给一定时间时钟沿才能正常采样。如果全局复位恰在时钟沿附近撤销:
- 各触发器因时钟 skew 看到的撤离时刻不同,有的本拍就逃出复位、有的下一拍才逃出;
- 撤离沿本身也可能让触发器进入亚稳态。
结果是复位释放后全芯片状态不一致,状态机各自从不同拍起跑,极难复现。
标准电路
用两级(或带异步清零的)触发器生成「同步化后的复位」:
verilog
// async assert, sync deassert:rst_n 低有效
reg r1, r2;
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
r1 <= 1'b0;
r2 <= 1'b0; // 复位按下:立刻、异步拉低
end else begin
r1 <= 1'b1;
r2 <= r1; // 复位松开:同步、打两拍后才释放
end
end
wire rst_n_sync = r2; // 全设计统一用这个做异步复位外部 rst_n 一拉低,r1/r2 立即异步清零(断言快);外部复位撤销后,要经时钟打两拍 rst_n_sync 才拉高,全片在同一个时钟沿干净地起跑。多比特复位本身不需要打拍那种同步,这是专门的复位同步器。
同步复位 vs 异步复位
- 异步复位(本例):不占数据路径时序、没时钟也能复位,适合时钟可能未起振的上电场景;风险全在释放,需要本电路,见 同步与异步复位。
- 同步复位:只在时钟沿生效、天然对齐,但没时钟时无法复位、且占组合逻辑,复位很宽时还可能被综合优化。
- 多时钟域:每个时钟域各放一个复位同步器,由共同的异步复位源驱动;跨复位域还有 RDC 问题要单独检查,见 RDC 复位域跨越。
常见坑
- 异步复位直接接全片、不做同步释放:偶发「复位释放后跑飞」,最难调试。
- 复位同步器本身又被复位成不释放(极性/反馈写错)。
- 多时钟域共用一个域同步出的复位:该域时钟没跑时别的域被拖着不放。
- 复位树 fanout 过大、skew 严重,需插缓冲/分平衡,见 时钟偏斜。
- 复位期间门控时钟被关死导致无法释放,DFT 还要保证复位在扫描时可控。
总结
异步复位的好处是断言不依赖时钟、上电即可立刻安全复位,危险全在撤离沿可能撞上 recovery/removal 窗口加上时钟 skew,使各触发器分批逃出复位甚至亚稳;解决办法是「异步断言、同步释放」复位同步器——外部复位异步清零同步器,释放时由本地时钟打两拍后再统一、对齐地放开全片复位,多时钟域则每域各放一个并处理 RDC,从而兼顾响应快与起跑一致。