关于异步复位经同步后用作异步复位的问题评估是否正确?
你的评估完全正确,这种复位处理方式确实存在严重问题
这种把同步后的复位信号sync_rst_n当作异步复位放进敏感列表的写法,完全违背了同步复位链的设计初衷,你提到的问题都是真实存在的,甚至还会带来额外隐患:
时序分析直接失效:STA工具会将敏感列表里的
sync_rst_n识别为异步控制信号,不会检查它到寄存器复位端的setup/hold时序。而你做同步链的核心目的就是让复位信号与时钟对齐,结果把同步后的信号当作异步用,等于直接绕过了同步路径的时序验证,同步链的作用完全白费。复位退出时序不一致:哪怕
sync_rst_n是同步到时钟的,不同寄存器的复位端布线延迟、时钟skew都会导致它们退出复位的时间不一致——有些寄存器可能在clk的第N个上升沿退出复位,有些却在N+1个沿才生效。这种复位不同步会让电路进入逻辑混乱的中间状态,触发不可预测的错误。约束无法合理生效:STA工具对异步复位的约束逻辑是针对外部输入的异步信号的,要求满足recovery/removal时间。但
sync_rst_n是内部同步后的信号,工具无法正确关联它的来源,既不会按同步信号去约束它到寄存器的路径,也无法套用外部异步复位的约束规则,最终导致时序约束缺失,芯片量产时极大概率出现复位异常。
正确的做法
如果已经通过同步链得到了与时钟对齐的sync_rst_n,应该把它当作同步复位使用:
always @(posedge clk) begin if (!sync_rst_n) begin // 复位逻辑 end else begin // 正常逻辑 end end
这样STA工具会自动检查sync_rst_n到寄存器D端的setup/hold时序,确保复位信号与时钟严格对齐,从根本上避免上述问题。
内容的提问来源于stack exchange,提问作者Jose Rodriguez
相关产品推荐
相关产品推荐

