2. 时序路径:时序路径的组成(起点、终点、组合逻辑),四种基本时序路径分析

好,咱们接着聊时序分析。上一节我们把STA的全局概念捋了一遍,这一节咱们深入进去,看看STA到底在分析什么——说白了,就是分析一条条时序路径。

我刚开始学STA的时候,觉得这东西很玄乎。后来带我的老工程师跟我说了一句话,我到现在都记得:“你只要把每一条路径的起点和终点搞清楚,STA你就学会了一半。” 嗯,这话一点不假。

2.1 一条时序路径,到底长什么样?

一条完整的时序路径,其实就三个部分:

  • 起点(Startpoint):数据从哪里出发。通常是时钟引脚(clock pin)或者输入端口(input port)。
  • 终点(Endpoint):数据最终要到达哪里。通常是数据引脚(data pin)或者输出端口(output port)。
  • 组合逻辑(Combinational Logic):起点和终点之间,那些乱七八糟的门电路、多路选择器、加法器等等。说白了,就是一堆没有时钟控制的逻辑单元。

你想想看,数据从起点出发,穿过一堆组合逻辑,最后到达终点。STA要做的,就是算算这段路走了多久,能不能在规定时间内到达。

核心要点: 时序路径的起点永远是时钟端或输入端口,终点永远是数据端或输出端口。中间的组合逻辑可以没有,但起点和终点必须有。

我在项目中遇到过一个小白同事,他画路径的时候把两个寄存器的数据端当起点,结果时序报告怎么看怎么不对。后来我帮他一看,起点选错了。嗯,这种低级错误其实挺常见的。

2.2 四种基本时序路径,一个都不能少

STA把所有的路径归纳为四种基本类型。我个人习惯把这四种路径记成“两内两外”——两个内部路径,两个外部路径。

下面这张图是我用SVG画的,把四种路径的关系展示得很清楚:

四种基本时序路径 寄存器1 (起点) 组合逻辑 寄存器2 (终点) 路径①:寄存器→寄存器 输入端口 (起点) 组合逻辑 寄存器3 (终点) 路径②:输入端口→寄存器 寄存器4 (起点) 组合逻辑 输出端口 (终点) 路径③:寄存器→输出端口

好,下面我把这四种路径一个一个拆开来讲。

2.3 路径①:寄存器到寄存器(Reg-to-Reg)

这是最最常见的一种路径,也是STA分析的核心。说白了,就是前一级寄存器的输出,经过组合逻辑,送到后一级寄存器的输入。

起点:前一级寄存器的时钟引脚
终点:后一级寄存器的数据引脚
中间:可能有组合逻辑,也可能没有(直接连线)

我的经验: 在项目中,90%以上的时序违例都出在这种路径上。尤其是当组合逻辑层级太多的时候,延迟很容易超标。我一般建议组合逻辑控制在10-15级以内,超过这个数就要考虑插流水线了。

2.4 路径②:输入端口到寄存器(Input-to-Reg)

这种路径的起点是芯片的输入引脚,终点是内部第一个寄存器的数据端。

起点:输入端口
终点:寄存器的数据引脚
中间:从片外到片内的组合逻辑

这里有个坑,我必须要提醒你。输入路径的延迟,不光取决于芯片内部的组合逻辑,还取决于片外信号到达的时间。这个时间我们通常用 set_input_delay 来约束。

注意: 输入延迟设置得太小,STA会过于乐观,芯片实际可能跑不到那么快。设置得太大,又会过度约束,导致工具花大量力气去优化一条本来没问题的路径。我曾经吃过这个亏,一个项目因为输入延迟设得太紧,导致综合面积大了15%。后来跟系统组对齐了参数,才把面积降下来。

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的灵魂,也是面试必考题。到时候我会结合我踩过的坑,给你讲得明明白白。


可可精品资料库