时序违例怎么修?
更新时间:2026-09-21。问题驱动短答页。违例背后的 setup/hold 原理见 建立时间和保持时间,报告读法见 STA 报告解读。
一句话回答
先读 STA 报告确认是 setup 还是 hold、找到违例路径的起点终点和延迟大头,再对症:setup 违例让数据「更快到」(优化/插流水线/降频),hold 违例让数据「别太快到」(插延迟)。 约束本身要先写对,别用 false_path 硬掩盖。
排查步骤
- 看违例类型与 slack:负的 setup slack 是太慢,负的 hold slack 是太快。
- 追路径 startpoint/endpoint:是哪两个触发器/端口之间,data arrival 与 required 差多少。
- 拆延迟构成:是逻辑级数太多、高扇出网络、布线拥塞还是时钟偏斜。
- 对症改设计或约束,重跑综合/布局布线确认 slack 转正。
setup 违例修法(按优先级)
- 插流水线寄存器:把长组合路径切成两段,提频最有效(加延迟周期换频率)。
- 关键路径优化:减少逻辑级数、提前算好进位/比较、用更快的算术结构、复制高扇出信号降扇出。
- retiming:让综合工具在寄存器间自动移动逻辑平衡时延。
- 合理降频/放宽约束:在性能预算允许时降低目标频率。
- 真多周期路径加 multicycle 约束:仅当数据本来就跨多个周期才用。
hold 违例修法
hold 与频率无关,只能在过短的数据路径上插入延迟缓冲(delay cell),或让工具在布局布线阶段修 hold;通常工具会自动加 buffer,但极端短路径、时钟偏斜过大时要人工检查。
约束先行
很多「违例」其实是约束写错:时钟没定义全、输入输出延迟缺失、把本应异步的路径按同步收敛。先保证 SDC 正确,再谈改 RTL。FPGA 侧约束实战见 XDC 时序约束,收敛方法见 时序收敛方法。
常见坑
- setup 违例去加 buffer:越修越慢。
- hold 违例去降频/插流水线:无效,方向相反。
- 大量
set_false_path一刀切:掩盖真实同步路径,等于放弃时序保证。 - 只看一条违例:修一条会改变布线、冒出新违例,要迭代到整体 WNS/TNS 都为正。
- 忽视 WNS/TNS 指标:最差负余量与总负余量都要收敛,不能只清零某条。
总结
修时序先读 STA 报告分清 setup(数据太晚、决定频率)和 hold(数据太快、与频率无关):setup 靠插流水线、减少逻辑级数与高扇出、retiming、必要时降频来缩短到达时间,hold 靠在过短路径插延迟缓冲;动手前先确认 SDC 约束本身正确,false_path/multicycle 只在路径确属异步或多周期时使用、不能用来掩盖问题,然后反复综合布局布线直到 WNS 与 TNS 全部转正。