时序路径的四大类型
做STA这么多年,我经常被新人问到同一个问题:“时序分析到底要分析哪些路径?”
其实答案很明确。芯片里所有时序路径,归纳起来就四种:
- 输入到寄存器
- 寄存器到寄存器
- 寄存器到输出
- 输入到输出
这四种路径,说白了就是芯片的“四根筋”。哪根出问题,芯片都跑不起来。我个人习惯,拿到一个新设计,第一件事就是把这四类路径的约束先理清楚。
1. 输入到寄存器路径
这条路径从芯片的输入引脚开始,经过组合逻辑,最终到达寄存器的数据输入端。
关键点:外部信号到达芯片内部寄存器的时间,必须满足建立时间和保持时间要求。
我在项目中遇到过一个问题:某个芯片的SPI接口,外部时钟和数据之间的相位关系没搞清楚,结果输入到寄存器的路径时序总是不满足。后来发现,是输入延迟约束设错了。
约束示例:
set_input_delay -clock clk -max 2.5 [get_ports data_in]
set_input_delay -clock clk -min 0.8 [get_ports data_in]
嗯,这里要注意:输入延迟的max和min值,分别对应建立时间和保持时间的检查。max值越大,留给内部逻辑的时间就越少。
2. 寄存器到寄存器路径
这是芯片内部最常见的路径。从一个寄存器的输出,经过组合逻辑,到另一个寄存器的输入。
说白了,这就是芯片的“内部交通”。
计算公式:
- 建立时间检查:T_clk - T_cq - T_logic - T_setup > 0
- 保持时间检查:T_cq + T_logic - T_hold > 0
我曾经遇到一个案例:某个模块的寄存器到寄存器路径,建立时间总是差0.1ns。查了半天,发现是组合逻辑太深了。后来插了两级流水线,问题就解决了。
我的经验:寄存器到寄存器路径的时序优化,优先考虑减少组合逻辑级数。如果不行,再考虑调整时钟相位或增加流水线。
3. 寄存器到输出路径
这条路径从寄存器输出开始,经过组合逻辑,最终到达芯片的输出引脚。
关键点:内部寄存器的数据,必须在规定时间内到达输出引脚,并且满足外部器件的时序要求。
你想想看,如果输出路径时序不满足,外部器件可能采到错误的数据。我在一个DDR接口项目中就吃过这个亏——输出延迟设得太紧,导致外部存储器总是读到错误数据。
约束示例:
set_output_delay -clock clk -max 3.0 [get_ports data_out]
set_output_delay -clock clk -min 1.2 [get_ports data_out]
嗯,这里有个坑:输出延迟的max值,对应的是外部器件的建立时间要求。min值对应的是外部器件的保持时间要求。千万别搞反了。
4. 输入到输出路径
这条路径从输入引脚直接到输出引脚,中间不经过任何寄存器。说白了,就是纯组合逻辑路径。
特点:这种路径在同步设计中尽量少用。因为它的时序完全由组合逻辑延迟决定,很难控制。
我曾经在一个项目中,为了省一个时钟周期,用了输入到输出的直通路径。结果流片回来,这个路径的时序在各种PVT条件下都不稳定。后来还是老老实实加了寄存器。
警告:输入到输出路径的时序分析,通常使用set_max_delay和set_min_delay约束。我个人建议,除非万不得已,不要在高速设计中用这种路径。
四种路径的对比
| 路径类型 | 起点 | 终点 | 常见问题 | 优化方向 |
|---|---|---|---|---|
| 输入到寄存器 | 输入引脚 | 寄存器D端 | 输入延迟设置不准 | 调整输入延迟约束 |
| 寄存器到寄存器 | 寄存器Q端 | 寄存器D端 | 组合逻辑太深 | 减少逻辑级数/插流水线 |
| 寄存器到输出 | 寄存器Q端 | 输出引脚 | 输出延迟设置不准 | 调整输出延迟约束 |
| 输入到输出 | 输入引脚 | 输出引脚 | 纯组合路径难控制 | 尽量加寄存器 |
实际项目中的避坑指南
做STA这么多年,我总结了几条经验:
- 输入到寄存器路径:一定要搞清楚外部器件的时序参数。我曾经因为datasheet看漏了一行,导致输入延迟设错了0.5ns,整个芯片的时序都乱了。
- 寄存器到寄存器路径:这是STA分析的重点。我建议先跑一遍report_timing,看看最差的路径在哪里,然后针对性优化。
- 寄存器到输出路径:注意输出负载的影响。负载越大,输出延迟越大。我在一个项目中,就因为输出负载估算不准,导致流片后时序不满足。
- 输入到输出路径:能不用就不用。如果非要用,一定要加set_max_delay约束,并且留足余量。
小技巧:在STA分析时,可以先用report_timing -group命令,分别查看四类路径的时序情况。这样能快速定位问题出在哪类路径上。
好了,这四种路径你搞清楚了,STA分析就成功了一半。下一章,我会详细讲每种路径的约束方法和优化技巧。