时序预算 Timing Budget
一句话回答
时序预算是在架构/设计早期,把目标频率对应的一个时钟周期,预先「切块」分配给路径上的各个部分——触发器输出延迟 + 组合逻辑 + 布线 + 对端建立时间,还要扣掉时钟偏斜、抖动和裕量;这样在写 RTL 前就能判断频率可不可达、关键模块要不要加流水线,而不是等综合后才发现根本收敛不了。
一、一个周期怎么分
经典 reg-to-reg 不等式:
bash
T_period ≥ t_co + t_logic + t_route + t_setup + t_skew + margint_co:发起触发器时钟到输出;t_logic:中间组合逻辑(你设计的运算/选择);t_route:连线延迟(先进工艺占比很大);t_setup:捕获触发器建立时间;t_skew、抖动、margin:时钟不确定性和保留裕量;- 留给
t_logic + t_route的,就是真正能用于设计逻辑的预算。
二、自顶向下分解
- 定系统目标频率(如 500MHz → 2ns);
- 先扣物理项(t_co、setup、skew、jitter、margin);
- 剩余按路径分给各模块,得到模块级预算;
- 模块再把预算落到内部各级流水线;
- 顶层给各 block 设 input/output delay,等价于在模块边界切分预算;
- 实现后用 STA 对照预算,超预算的路径回架构处理。
三、预算决定架构
- 某运算在预算内放不下 → 加流水线寄存器把它切成多拍;
- 跨模块交互复杂、线延迟大 → 调整 floorplan/接口;
- 预算要和面积/功耗权衡:更高频率通常更多寄存器和功耗。
常见坑
- 不做预算直接写 RTL:综合后关键路径远超周期,返工加流水线代价大。
- 预算只算逻辑、漏了布线/偏斜:先进工艺线延迟主导,漏算必然不收敛。
- 裕量留太少:签核多角或签核库切换后立刻违例。
- 预算一刀切:不同模块负载/工艺条件不同,应差异化。
- 预算与 SDC 脱节:IO delay、时钟约束没反映预算,STA 结果对不上。
- 为达频率过度流水:流水线太深增加延迟、面积、功耗和冒险,需系统权衡。
总结
时序预算在架构阶段把一个时钟周期按 t_co+逻辑+布线+setup+偏斜+裕量切块,自顶向下分解成模块预算并通过 input/output delay 落到 SDC,提前判断频率可达性、决定流水线划分;关键是别漏布线和不确定性、留足裕量,并在面积/功耗/延迟之间平衡,用 STA 持续对照预算。