时序路径分类:四大路径类型详解
做时序收敛,第一步是什么?
我个人觉得,不是急着调约束,也不是闷头修hold。第一步,你得搞清楚——你面对的是哪种路径。
静态时序分析里,路径一共就四种。说白了,就是信号从哪出发、到哪结束。我刚开始带项目那会儿,有个同事把输入到寄存器的路径当寄存器到寄存器修,折腾了两天没搞定。后来我一问,他连路径类型都没分清楚。嗯,这种坑,咱们今天一次性填平。
1. 寄存器到寄存器路径(Reg-to-Reg)
这是最常见、也是我们花精力最多的一类路径。
信号从一个触发器的时钟端出发,经过组合逻辑,到达另一个触发器的数据输入端。你想想看,整个芯片里,90%以上的时序路径都是这种。STA工具默认分析的,主要就是它。
关键点:这条路径的起点和终点,都有时钟控制。所以它的时序裕量,取决于两个时钟之间的相对关系。
我在项目中遇到过一件事:两个寄存器用的是同一个时钟,但时钟树不平衡,结果setup就是修不干净。后来我查了查,发现是CTS阶段没做好skew优化。所以啊,Reg-to-Reg路径,不仅要看逻辑深度,还得盯着时钟质量。
我的习惯:每次看时序报告,先过滤出Reg-to-Reg路径。如果这条路径的slack是负的,我会先检查时钟周期对不对,再看组合逻辑级数。一般超过15级,就得考虑插流水线了。
2. 输入到寄存器路径(Input-to-Reg)
这条路径从芯片的输入端口开始,经过片外到片内的组合逻辑,最终到达一个触发器的数据端。
说白了,就是外部信号进来,经过一些缓冲和连线,然后被内部时钟采到。这条路径的难点在于——输入延迟是外部给的,你控制不了。
我记得有一次,客户给的input delay约束写错了,差了0.5ns。结果我这边怎么修都修不完,后来一查,是约束本身的问题。所以,遇到Input-to-Reg路径时序紧张,先别急着改电路,先确认一下input delay设得对不对。
避坑指南:我曾经吃过一次亏——芯片回来后,某个输入接口死活采不到正确数据。后来发现是input delay设得太乐观,实际片外驱动能力不够。从那以后,我每次都会留0.2~0.3ns的余量给input delay。
3. 寄存器到输出路径(Reg-to-Output)
信号从内部寄存器出发,经过组合逻辑,到达芯片的输出端口。
这条路径的终点是片外,所以它的时序要求取决于外部器件什么时候需要这个数据。output delay就是用来描述这个外部需求的。
我个人习惯,在做Reg-to-Output路径分析时,会特别关注输出端口的负载。负载越大,输出延迟越大。你想想看,如果输出要驱动一个大电容,那信号上升时间会变慢,setup自然就紧张了。
核心思路:Reg-to-Output路径的收敛,靠的是两件事——一是把输出寄存器放得离端口近一点,二是把output delay设准。
4. 输入到输出路径(Input-to-Output)
这条路径从输入端口直接到输出端口,中间不经过任何寄存器。说白了,就是纯组合逻辑路径。
这种路径在芯片里不多见,但一旦出现,往往很棘手。为什么?因为它没有时钟同步,完全靠组合逻辑的延迟来满足时序。而且,它同时受input delay和output delay的双重影响。
我在项目中遇到过一条Input-to-Output路径,延迟要求是5ns以内。结果综合出来的逻辑有7ns。我试了各种优化方法,最后没办法,只能在中间插了一级寄存器,把它变成了两条路径。嗯,有时候,绕不过去就加流水线,这是最实在的办法。
特别注意:Input-to-Output路径在STA中经常被忽略。我建议你每次做完时序分析,专门过滤一下这种路径,看看有没有violation。我曾经就漏掉过一条,结果芯片回来后,某个直通信号延迟太大,导致系统跑飞了。
四种路径对比一览
| 路径类型 | 起点 | 终点 | 是否受时钟控制 | 常见问题 |
|---|---|---|---|---|
| Reg-to-Reg | 寄存器时钟端 | 寄存器数据端 | 是(两端都有时钟) | 时钟skew、逻辑级数过多 |
| Input-to-Reg | 输入端口 | 寄存器数据端 | 部分(终点有时钟) | input delay不准、片外驱动弱 |
| Reg-to-Output | 寄存器时钟端 | 输出端口 | 部分(起点有时钟) | 输出负载大、output delay设错 |
| Input-to-Output | 输入端口 | 输出端口 | 否(纯组合逻辑) | 延迟不可控、易被忽略 |
四种路径的关系图
下面这张图,是我自己画的一个结构图。它把四种路径放在一起,方便你理解它们在整个芯片中的位置关系。
这张图里,四种路径一目了然。你每次做时序分析时,可以对照这张图,看看自己当前在修哪条路。我个人觉得,把路径类型分清楚,时序收敛就成功了一半。
一个小技巧:在PrimeTime或Tempus里,你可以用命令直接过滤出某类路径。比如查Input-to-Reg,就用report_timing -from [all_inputs] -to [all_registers]。这样出来的报告,针对性更强,修起来也更快。
好了,四种路径就讲到这里。记住一句话:路径类型不同,修法也不同。别拿Reg-to-Reg的思路去修Input-to-Output,那是浪费时间。