FPGA 进阶 35:时序例外场景——false path、multicycle 与约束纪律
本文是
fpga/进阶层第 39 篇。STA 原理见静态时序分析,收敛手段见时序收敛方法,时钟组见时钟网络;这篇讲什么时候可以、以及怎么正确地让工具不按默认规则检查某条路径。
本文要回答的问题
- false path / multicycle / max_delay 各自语义是什么?
- 哪些路径合法地属于例外?
- 多周期为什么 setup 和 hold 要成对设?
- 例外约束的审计流程?
一、三种例外的语义
| 约束 | 语义 | 典型对象 |
|---|---|---|
set_false_path | 无时序要求,完全不检查 | 静态配置、复位、测试口、已做 CDC 的路径 |
set_multicycle_path | 允许 N 个周期传数,放宽窗口 | CE 使能下 N 拍才采样的数据、慢接口 |
set_max_delay / set_min_delay | 自定义最大/最小延迟 | 不走时钟的特殊路径、IO 精确微调 |
例外只改变检查方式,不改变硅片行为——路径上该亚稳还是亚稳。
二、合法 false path 场景

- 静态/准静态配置:运行中数据通路永远不在其变化时采样(判定:能写出"为什么目的触发器永远不会撞上变化窗口");
- 异步复位路径:配合异步断言同步释放,复位释放沿已由同步寄存器保证;
- CDC 已同步路径:优先
set_clock_groups(见时钟网络篇),单条才用 false_path; - JTAG/测试/互斥模式逻辑。
三、multicycle:允许借几个周期
数据在使能控制下每 N 拍才被真正采样一次(如寄存器配置后缓慢更新的系数、低频控制环),默认按 1 周期检查是过度约束:
# 同钟域:数据 N 拍不变、目的端 N 拍采一次
set_multicycle_path 2 -setup -from [get_cells src_reg*] -to [get_cells dst_reg*]
set_multicycle_path 1 -hold -from [get_cells src_reg*] -to [get_cells dst_reg*]setup 放宽到 N,hold 边必须跟着调(同钟域典型 -hold N-1),否则保持时间窗口错位:工具要么过度插延迟修保持,要么报奇怪的 hold 违例。跨时钟域的多周期方向(from 快钟还是慢钟)不同,取值不同,按手册时序表核对。
前提再次强调:RTL 必须真的保证数据稳定 N 拍、目的端真的 N 拍采样——例外是声明事实,不是制造事实。
四、纪律与审计流程
- 零例外先收敛:设计先做到不加例外就通过(除 CDC/复位等天生例外);
- 逐条加、逐条注释:每条例外出处、理由、覆盖对象写清楚;
- 精确限定:优先
-from ... -to ...到具体时钟/层次,慎用裸-through; - 审计报告:
report_clock_interaction:看时钟域间关系是否符合预期(Async/安全/未约束);report_exceptions -show_ignored:每条例外实际覆盖多少路径、是否有被忽略/冲突的例外;
- 数量异常即排查:例外几十上百条、一条覆盖几千路径,多半是在掩盖设计问题。
常见坑对照
| 坑 | 后果 | 正确做法 |
|---|---|---|
| 违例就切 false_path | 上板随机亚稳 | 先改设计(打拍/流水/降扇出) |
| multicycle 只设 setup | hold 窗口错、假违例/过修 | setup/hold 成对设 |
| -through 大网 | 误切实时同步路径 | from/to 精确限定 |
| CDC 不做同步器只切约束 | 硬件真亚稳 | RTL 同步器/FIFO 在先 |
| 例外不注释不审计 | 后期无人敢动 | report_exceptions 定期复核 |
| 把真路径设成 multicycle 但数据每拍变 | 采样错误 | 多周期必须对应真实 N 拍稳定 |
相关与延伸
前置:STA 静态时序分析、时序收敛方法、时钟网络与 clock_groups。 复位路径处理:复位策略;高阶用法(多角点/Pblock)见专家层《高阶时序收敛》。
一句话总结
时序例外是声明"这条路径的真实时序关系不同于默认",不是消红叉的工具:set_false_path 用于时序上确实无关的路径(静态配置、异步复位、测试口、已做 CDC 的跨域),写前必须能论证"目的端永远不会撞上数据变化";set_multicycle_path N 用于数据真的 N 拍稳定、N 拍才采样的慢路径,且 setup 与 hold 必须成对(同钟域 setup=N、hold=N-1),否则保持窗口错位。流程纪律:设计先零例外收敛 → 例外逐条加、from/to 精确限定并注释理由 → 用 report_clock_interaction / report_exceptions -show_ignored 审计覆盖范围。拿 false_path 压违例、-through 一刀切、CDC 只切约束不做同步器,都是在把时序问题藏到上板之后。