4. 时序路径(Timing Path):四种路径类型

说到时序分析,咱们得先搞清楚一个最基本的问题:时序路径到底在分析什么?

说白了,STA 就是沿着一条条路径,去检查信号能不能在规定时间内到达终点。我刚开始学 STA 的时候,总觉得路径类型这个概念太简单,不就是从 A 到 B 嘛。直到有一次 debug 一个接口时序问题,才发现自己连路径的起点终点都没搞对,查了半天白费功夫。

嗯,今天咱们就把这四种路径类型彻底讲清楚。

4.1 路径的起点与终点

先记住一个核心原则:每条时序路径都有明确的起点和终点

起点可以是:

  • 芯片的输入端口(input port)
  • 寄存器的时钟引脚(clock pin)

终点可以是:

  • 芯片的输出端口(output port)
  • 寄存器的数据输入引脚(data pin)

你想想看,起点和终点一组合,正好就是四种路径类型。我习惯把这四种路径记成「两内两外」——两个在芯片内部,两个跨芯片边界。

核心记忆法: 起点要么是输入端口,要么是时钟引脚;终点要么是输出端口,要么是数据引脚。2×2 = 4 种路径。

4.2 四种路径类型详解

4.2.1 输入到输出(Input to Output)

这种路径也叫 I/O 路径。起点是芯片的输入端口,终点是芯片的输出端口。说白了就是信号从芯片的一个引脚进来,经过一些组合逻辑,直接从另一个引脚出去。

这种路径在纯组合电路中很常见。比如一个简单的加法器,输入从 A 和 B 进来,结果直接从 SUM 出去,中间没有任何寄存器。

我在项目中遇到过一种情况:客户要求芯片的某个控制信号必须在输入变化后 5ns 内反映到输出。当时我一看,这路径上串了三级组合逻辑,延迟加起来 6.2ns,直接超标了。后来拆了一级逻辑,换成查找表,才压到 4.8ns。

我的经验: I/O 路径的约束通常来自芯片规格书。如果发现时序违例,优先考虑减少组合逻辑级数,或者加流水线寄存器。

4.2.2 输入到寄存器(Input to Register)

起点是输入端口,终点是寄存器的数据引脚。这种路径描述的是:外部信号进入芯片后,经过组合逻辑,最终被内部寄存器采样。

举个例子:芯片的 DATA_IN 引脚进来一个数据,经过两级组合逻辑,送到寄存器 FF1 的 D 端。这条路径的时序检查,就是要保证数据在时钟沿到来之前稳定到达。

我记得有一次调试一个 SPI 接口,发现数据采样总是不对。查了半天,原来是输入路径上有个多路选择器,选择信号来得太晚,导致数据路径变长了。这就是典型的输入到寄存器路径问题。

注意: 输入到寄存器路径的起点是输入端口,不是外部器件的输出。很多新手会搞混,以为起点是外部芯片的寄存器。记住,STA 只分析芯片内部路径,外部延迟通过 input delay 约束来建模。

4.2.3 寄存器到寄存器(Register to Register)

这是最核心、最常见的路径类型。起点是第一个寄存器的时钟引脚,终点是第二个寄存器的数据引脚。中间可以经过组合逻辑,也可以直接连线。

说白了,这就是我们常说的 reg-to-reg 路径。STA 会检查:第一个寄存器在时钟沿输出数据后,经过组合逻辑延迟,能不能在下一个时钟沿之前稳定到达第二个寄存器。

我个人的习惯是,先看 reg-to-reg 路径能不能满足时序。因为这类路径占了芯片内部 80% 以上的路径,它们搞定了,整个芯片的时序就稳了一大半。

举个例子:

// 一个简单的 reg-to-reg 路径
always @(posedge clk) begin
    reg1 <= data_in;      // 第一个寄存器
    reg2 <= reg1 + 1;     // 第二个寄存器,中间有加法逻辑
end

这条路径的起点是 clk 到 reg1 的时钟引脚,终点是 reg2 的 D 端。中间的组合逻辑是一个加法器。

关键点: reg-to-reg 路径的时序裕量 = 时钟周期 - (clk->Q 延迟 + 组合逻辑延迟 + 建立时间)。如果这个值小于 0,就说明时序违例了。

4.2.4 寄存器到输出(Register to Output)

起点是寄存器的时钟引脚,终点是输出端口。这种路径描述的是:内部寄存器的数据经过组合逻辑,最终送到芯片的输出引脚。

比如芯片内部有个状态寄存器,它的输出经过一些译码逻辑,送到 OUT_PORT 引脚。这条路径的时序检查,就是要保证数据在时钟沿之后,能在规定时间内到达输出端口。

我曾经遇到过一个 DDR 接口的设计,输出路径上有个很大的多路选择器,导致数据从寄存器到输出端口的延迟太大,超出了外部器件的建立时间要求。后来我把多路选择器拆成两级,中间插了一级寄存器,才解决问题。

避坑指南: 我曾经在输出路径上忘记考虑输出负载的影响。同样的组合逻辑,驱动 2pF 负载和驱动 10pF 负载,延迟能差一倍。所以做输出路径分析时,一定要带上准确的输出负载模型。

4.3 四种路径对比总结

路径类型 起点 终点 典型场景 约束方式
输入到输出 输入端口 输出端口 纯组合逻辑路径 set_input_delay / set_output_delay
输入到寄存器 输入端口 寄存器 D 端 外部信号采样 set_input_delay
寄存器到寄存器 寄存器时钟引脚 寄存器 D 端 内部流水线 create_clock
寄存器到输出 寄存器时钟引脚 输出端口 内部信号输出 set_output_delay

4.4 实际项目中的路径分析思路

我个人在做时序分析时,会按这个顺序来:

  1. 先看 reg-to-reg 路径——这是芯片内部的主干道,占了大部分路径
  2. 再看 I/O 路径——输入到寄存器和寄存器到输出,这些涉及芯片边界,容易出问题
  3. 最后看输入到输出路径——这种纯组合路径在复杂芯片里其实不多,但一旦有,往往是最难修的

你想想看,为什么 reg-to-reg 路径要优先看?因为它的时序约束最简单——就是时钟周期。如果 reg-to-reg 都跑不过,那说明你的设计本身就有问题,I/O 路径修得再好也没用。

嗯,关于四种路径类型,今天就讲到这里。记住一句话:搞清楚了路径的起点和终点,时序分析就成功了一半

课后思考: 如果一个路径的起点是输入端口,终点是输出端口,中间经过了一个寄存器,这算哪种路径类型?答案是:它会被拆成两条路径——输入到寄存器和寄存器到输出。STA 工具会自动帮你拆分。