时序路径分类:四大路径类型详解
做时序分析这么多年,我最大的体会就是——你得先知道你的敌人长什么样。时序路径,说白了就是信号从起点到终点的传播路径。我刚开始学STA时,总觉得这玩意儿抽象得很,后来发现其实就四种情况,搞清楚它们,时序约束就成功了一半。
一、寄存器到寄存器路径(Reg-to-Reg)
这是最常见的一种路径,也是我们平时打交道最多的。从一个触发器的时钟端出发,经过组合逻辑,到达另一个触发器的数据输入端。
核心公式:Tclk2 - Tclk1 + Tcq + Tlogic + Tsetup ≤ Tperiod
说白了就是:数据从第一个寄存器出来,经过组合逻辑,必须在下一个时钟沿到来之前稳定下来。
我在项目中遇到过这样的情况:一个简单的计数器,频率才100MHz,愣是跑不过时序。查了半天,发现是组合逻辑链太长,中间插了太多级。嗯,这里要注意——不是所有路径都需要优化,但Reg-to-Reg路径往往是瓶颈所在。
我的习惯:在做综合时,我会先看Reg-to-Reg路径的slack。如果slack为负,先检查是不是组合逻辑太深,再考虑是不是时钟偏斜太大。
二、输入到寄存器路径(Input-to-Reg)
这条路径从芯片的输入引脚开始,经过输入缓冲和组合逻辑,到达第一个触发器的数据端。说白了,就是外部信号进入芯片后,要多久才能被内部寄存器采到。
这里有个坑——输入延迟(input delay)怎么设?我曾经因为设得太乐观,导致流片回来的芯片在低温下死活采不到数据。后来学乖了,input delay一定要留余量,尤其是高速接口。
| 参数 | 含义 | 典型值 |
|---|---|---|
| Tinput_delay_max | 外部信号到达芯片引脚的最大延迟 | 2~5ns |
| Tinput_delay_min | 外部信号到达芯片引脚的最小延迟 | 0.5~2ns |
避坑指南:我曾经在DDR接口上吃过亏——input delay设得太紧,结果高温下时序违例。记住:input delay的max值要留够,min值也不能忽略,否则hold timing会出问题。
三、寄存器到输出路径(Reg-to-Output)
这条路径从内部寄存器的时钟端出发,经过组合逻辑和输出缓冲,到达芯片的输出引脚。说白了,就是内部数据要多久才能送到芯片外面。
我个人习惯在做输出约束时,先问自己一个问题:外部器件需要多快的信号?如果外部器件要求数据在时钟沿后5ns内稳定,那你的Tco(时钟到输出延迟)就不能超过5ns。
关键点:输出延迟(output delay)是外部器件的要求,不是芯片内部能决定的。你只能通过调整内部逻辑来满足它。
四、输入到输出路径(Input-to-Output)
这条路径从输入引脚直接到输出引脚,中间不经过任何寄存器。说白了,就是纯组合逻辑路径。这种路径在纯组合电路中很常见,但在时序电路中,我建议尽量避免。
为什么?因为这种路径没法通过寄存器来打断,延迟完全由组合逻辑决定。你想想看,如果输入信号变化很快,输出可能会产生毛刺。我在一个简单的地址译码器里遇到过这种情况,后来加了一级寄存器才搞定。
我的建议:如果设计中出现了Input-to-Output路径,先问问自己——能不能加一级寄存器?如果不能,那就得做组合逻辑的延迟约束,确保路径延迟在允许范围内。
知识体系总览
下面这张图,是我自己总结的时序路径分类框架。你看一眼,就能明白这四种路径之间的关系。
实际应用中的选择
你可能会问:知道了这四种路径,然后呢?嗯,关键是要知道每种路径的约束方法不同:
- Reg-to-Reg:用create_clock约束时钟周期,工具会自动分析
- Input-to-Reg:用set_input_delay告诉工具外部延迟
- Reg-to-Output:用set_output_delay告诉工具外部要求
- Input-to-Output:用set_max_delay直接约束组合路径延迟
记住:80%的时序问题出在Reg-to-Reg路径上,但最难搞的往往是Input-to-Reg和Reg-to-Output路径,因为它们涉及芯片与外部器件的交互。
好了,这四种路径你搞清楚了吗?下次做时序约束时,先问问自己:这条路径属于哪一类?然后对症下药,问题就简单多了。