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之前,先画一张路径类型图。把所有的输入端口、输出端口、寄存器都标出来。然后一条一条路径去分析。这样不容易漏。

核心要点:

  • 路径起点:时钟引脚或输入端口
  • 路径终点:数据引脚或输出端口
  • 四种路径类型:输入到寄存器、寄存器到寄存器、寄存器到输出、输入到输出
  • 每种路径的约束和检查方式不同

好了,时序路径的概念就讲到这里。下一章,咱们聊聊具体的时序约束怎么写。到时候我会拿实际项目中的例子,一条一条路径给你演示。