set_false_path 和 set_multicycle_path 有什么区别?
更新时间:2026-09-21。问题驱动短答页。时序例外概念见 多周期与虚假路径,SDC 写法见 SDC 约束,收敛见 时序违例怎么修。
一句话回答
set_false_path 是「这条路根本不用做时序检查」,STA 直接忽略它;set_multicycle_path 是「这条路存在且必须正确,但数据本来就允许走 N 个周期」,于是把捕获沿往后挪 N 拍、放宽 setup(通常还要相应调整 hold)。前者是彻底豁免,后者是诚实地告诉工具真实的多周期预算。
核心对照
| 维度 | false path | multicycle path |
|---|---|---|
| 含义 | 路径无需任何时序保证 | 路径需要,只是允许多个周期 |
| setup 检查 | 不做 | 做,但捕获沿后移 N 拍 |
| hold 检查 | 不做 | 仍要,通常需配 -end/-start 调整 |
| 数据是否真传到下游 | 往往不需要时序关系(异步/静态) | 需要,且设计保证 N 周期内稳定 |
| 风险 | 豁免错了等于放行坏路径 | 周期数写错会放松过头 |
各自的正当场景
false path 用于本来就没有单周期时序关系的路径:
- 异步复位/跨异步时钟域、且已另有同步器处理的路径(真正的 CDC 同步应优先用专门的 CDC 约束,见 跨时钟域怎么处理)。
- 上电后就不变的静态配置、test/scan 专用逻辑、到互斥工作模式电路的路径。
multicycle path 用于数据确实跨多拍才被采样:
- 使能信号每隔 N 个时钟才有效一次的寄存器、慢速配置接口到快域、明确设计成两拍后才用的数据。
tcl
set_false_path -from [get_ports rst_n] -to [all_registers]
# 数据每 2 个周期才被捕获一次:setup 放宽到 2 拍,hold 相应放开 1 拍
set_multicycle_path 2 -setup -from [get_pins u/data_reg*/C] -to [get_pins v/cap_reg*/D]
set_multicycle_path 1 -hold -from [get_pins u/data_reg*/C] -to [get_pins v/cap_reg*/D]最关键的坑
- 别拿时序例外当收敛手段:正常寄存器到寄存器路径违例时,最不该做的就是甩一条
set_false_path把报告清零——问题没解决,只是看不见了,硅上会出错。 - multicycle 只放松 setup 不改 hold:默认 hold 沿会反向移动,可能凭空造出大量 hold 违例,必须配套写 hold 的多周期数。
- 约束的
-from/-through/-to范围过大:一条命令误豁免一大批本应检查的路径,要精确到时钟/端口/单元。 - 设计与约束不一致:你声称多周期,RTL 却每拍都采样,等于自欺;约束要反映真实硬件行为。
- CDC 路径应优先使用同步器/异步时钟域约束并跑 CDC 报告,而不是笼统 false path,见 CDC 报告分级。
总结
false_path 是彻底让 STA 忽略某条本就不需要单周期时序关系的路径,multicycle_path 是路径仍需正确只是诚实地允许它跨 N 个周期、把捕获沿后移并同步调整 hold;两者都属于时序例外,只能用来描述硬件真实行为——异步/静态用 false path、确属慢使能或多拍数据用 multicycle,绝不能当作消除时序红灯的快捷方式,且范围要精确、setup 与 hold 要成对约束,否则就是在报告里把真实故障藏起来。