4、时序路径概念:起点与终点、数据路径与时钟路径、四种时序路径类型
好,咱们今天聊聊时序路径。这个概念,说白了就是STA分析的基本单元。你想想看,STA工具怎么知道你的电路能不能跑?它就是一条一条路径去检查的。
我刚开始学STA那会儿,总觉得路径就是“从A到B”。后来被项目虐了几次才明白——路径的起点和终点,是有严格定义的。搞错了,分析结果就全偏了。
4.1 路径的起点与终点
一条时序路径,必须有一个起点和一个终点。工具只认这两种节点:
- 起点:时钟引脚(clock pin)、输入端口(input port)
- 终点:数据引脚(data pin)、输出端口(output port)
嗯,这里要注意:寄存器的时钟引脚只能是起点,数据引脚只能是终点。别搞反了。
重要:路径的起点和终点,必须是时序弧(timing arc)的端点。组合逻辑的中间节点,不能作为路径的起点或终点。
我在项目中遇到过有人把组合逻辑的输出当起点,结果工具报了一堆莫名其妙的违例。后来发现,是路径定义错了。
4.2 数据路径与时钟路径
一条完整的时序路径,其实包含两段:
- 数据路径(data path):从起点到终点,数据信号经过的路径
- 时钟路径(clock path):时钟源到寄存器时钟引脚的路径
工具在分析时,会把这两段分开计算。数据路径算延迟,时钟路径算时钟偏斜(clock skew)。
我个人习惯,在写约束时先确认时钟路径是否完整。时钟路径断了,数据路径分析得再准也没用。
小技巧:用report_timing命令时,加上-path_type full_clock_expanded,可以同时看到数据路径和时钟路径的详细信息。
4.3 四种时序路径类型
STA把路径分成四类。这四种类型,覆盖了所有需要检查的时序场景。
| 类型 | 起点 | 终点 | 典型场景 |
|---|---|---|---|
| 输入到寄存器 | 输入端口 | 寄存器数据引脚 | 片外信号进入芯片 |
| 寄存器到寄存器 | 寄存器时钟引脚 | 寄存器数据引脚 | 核心逻辑路径 |
| 寄存器到输出 | 寄存器时钟引脚 | 输出端口 | 芯片信号输出 |
| 输入到输出 | 输入端口 | 输出端口 | 纯组合路径 |
这四种路径,工具会分别检查建立时间和保持时间。每种路径的约束写法也不一样。
4.3.1 输入到寄存器路径
这种路径,起点是输入端口,终点是寄存器的数据引脚。约束时要用set_input_delay。
我曾经在项目中,因为input delay设得太紧,导致工具疯狂插buffer。后来发现,其实片外信号没那么快。嗯,input delay一定要和片外芯片对齐。
# 输入到寄存器路径的约束示例
set_input_delay -clock clk -max 2.0 [get_ports data_in]
set_input_delay -clock clk -min 0.5 [get_ports data_in]
4.3.2 寄存器到寄存器路径
这是最常见的路径。起点是寄存器的时钟引脚,终点是下一个寄存器的数据引脚。
工具会检查:
- 建立时间:数据必须在下一个时钟沿之前到达
- 保持时间:数据必须在时钟沿之后保持稳定
说白了,就是看数据能不能在一个时钟周期内,从第一个寄存器传到第二个寄存器。
注意:如果两个寄存器用的是不同时钟,要检查时钟域是否同步。异步时钟域之间的路径,STA默认不分析,需要单独处理。
4.3.3 寄存器到输出路径
起点是寄存器的时钟引脚,终点是输出端口。约束时用set_output_delay。
我建议,output delay的设定要考虑片外负载。负载越大,output delay就要留得越宽裕。
# 寄存器到输出路径的约束示例
set_output_delay -clock clk -max 3.0 [get_ports data_out]
set_output_delay -clock clk -min 1.0 [get_ports data_out]
4.3.4 输入到输出路径
这种路径没有寄存器,全是组合逻辑。起点是输入端口,终点是输出端口。
约束时,既要设input delay,也要设output delay。工具会检查组合逻辑的总延迟是否满足要求。
我记得有个项目,输入到输出路径的延迟要求特别严。最后没办法,只能在中间插了一级寄存器。嗯,有时候纯组合路径就是跑不快。
4.4 路径分析的实际意义
你想想看,STA工具为什么要分这四种路径?
因为每种路径的约束方式不同,检查的时序条件也不同。搞清楚了路径类型,你才能写出正确的约束,才能看懂工具的报告。
我个人习惯,在开始STA之前,先画一张路径类型图。把所有的输入端口、输出端口、寄存器都标出来。然后一条一条路径去分析。这样不容易漏。
核心要点:
- 路径起点:时钟引脚或输入端口
- 路径终点:数据引脚或输出端口
- 四种路径类型:输入到寄存器、寄存器到寄存器、寄存器到输出、输入到输出
- 每种路径的约束和检查方式不同
好了,时序路径的概念就讲到这里。下一章,咱们聊聊具体的时序约束怎么写。到时候我会拿实际项目中的例子,一条一条路径给你演示。