2. 时序路径:时序路径的组成(起点、终点、组合逻辑),四种基本时序路径分析
好,咱们接着聊时序分析。上一节我们把STA的全局概念捋了一遍,这一节咱们深入进去,看看STA到底在分析什么——说白了,就是分析一条条时序路径。
我刚开始学STA的时候,觉得这东西很玄乎。后来带我的老工程师跟我说了一句话,我到现在都记得:“你只要把每一条路径的起点和终点搞清楚,STA你就学会了一半。” 嗯,这话一点不假。
2.1 一条时序路径,到底长什么样?
一条完整的时序路径,其实就三个部分:
- 起点(Startpoint):数据从哪里出发。通常是时钟引脚(clock pin)或者输入端口(input port)。
- 终点(Endpoint):数据最终要到达哪里。通常是数据引脚(data pin)或者输出端口(output port)。
- 组合逻辑(Combinational Logic):起点和终点之间,那些乱七八糟的门电路、多路选择器、加法器等等。说白了,就是一堆没有时钟控制的逻辑单元。
你想想看,数据从起点出发,穿过一堆组合逻辑,最后到达终点。STA要做的,就是算算这段路走了多久,能不能在规定时间内到达。
我在项目中遇到过一个小白同事,他画路径的时候把两个寄存器的数据端当起点,结果时序报告怎么看怎么不对。后来我帮他一看,起点选错了。嗯,这种低级错误其实挺常见的。
2.2 四种基本时序路径,一个都不能少
STA把所有的路径归纳为四种基本类型。我个人习惯把这四种路径记成“两内两外”——两个内部路径,两个外部路径。
下面这张图是我用SVG画的,把四种路径的关系展示得很清楚:
好,下面我把这四种路径一个一个拆开来讲。
2.3 路径①:寄存器到寄存器(Reg-to-Reg)
这是最最常见的一种路径,也是STA分析的核心。说白了,就是前一级寄存器的输出,经过组合逻辑,送到后一级寄存器的输入。
起点:前一级寄存器的时钟引脚
终点:后一级寄存器的数据引脚
中间:可能有组合逻辑,也可能没有(直接连线)
2.4 路径②:输入端口到寄存器(Input-to-Reg)
这种路径的起点是芯片的输入引脚,终点是内部第一个寄存器的数据端。
起点:输入端口
终点:寄存器的数据引脚
中间:从片外到片内的组合逻辑
这里有个坑,我必须要提醒你。输入路径的延迟,不光取决于芯片内部的组合逻辑,还取决于片外信号到达的时间。这个时间我们通常用 set_input_delay 来约束。
2.5 路径③:寄存器到输出端口(Reg-to-Output)
这种路径的起点是内部最后一个寄存器的时钟引脚,终点是芯片的输出端口。
起点:寄存器的时钟引脚
终点:输出端口
中间:寄存器输出到片外的组合逻辑
跟输入路径类似,输出路径也要考虑片外的负载。我们用 set_output_delay 来告诉工具,数据从输出端口出去之后,留给下游器件的时间还有多少。
2.6 路径④:输入端口到输出端口(Input-to-Output)
这种路径也叫纯组合路径。起点是输入端口,终点是输出端口,中间没有任何寄存器。
起点:输入端口
终点:输出端口
中间:纯组合逻辑
这种路径在设计中其实不太常见,因为好的设计习惯是尽量在输入输出都打一拍寄存器。但有些高速接口或者异步处理场景下,确实会存在这种路径。
2.7 四种路径的约束对照表
为了方便你查阅,我把四种路径对应的约束命令整理成了表格:
| 路径类型 | 起点 | 终点 | 常用约束 |
|---|---|---|---|
| 寄存器→寄存器 | 时钟引脚 | 数据引脚 | create_clock |
| 输入端口→寄存器 | 输入端口 | 数据引脚 | set_input_delay |
| 寄存器→输出端口 | 时钟引脚 | 输出端口 | set_output_delay |
| 输入端口→输出端口 | 输入端口 | 输出端口 | set_input_delay + set_output_delay |
好了,这一节的内容就到这儿。四种路径你记住了吗?其实不用死记硬背,你只要记住一个原则:起点要么是时钟,要么是输入端口;终点要么是数据端,要么是输出端口。两两组合,就是四种路径。
下一节我们聊聊建立时间和保持时间——这两个概念是STA的灵魂,也是面试必考题。到时候我会结合我踩过的坑,给你讲得明明白白。
可可精品资料库