4. 时序路径(Timing Path):四种路径类型
说到时序分析,咱们得先搞清楚一个最基本的问题:时序路径到底在分析什么?
说白了,STA 就是沿着一条条路径,去检查信号能不能在规定时间内到达终点。我刚开始学 STA 的时候,总觉得路径类型这个概念太简单,不就是从 A 到 B 嘛。直到有一次 debug 一个接口时序问题,才发现自己连路径的起点终点都没搞对,查了半天白费功夫。
嗯,今天咱们就把这四种路径类型彻底讲清楚。
4.1 路径的起点与终点
先记住一个核心原则:每条时序路径都有明确的起点和终点。
起点可以是:
- 芯片的输入端口(input port)
- 寄存器的时钟引脚(clock pin)
终点可以是:
- 芯片的输出端口(output port)
- 寄存器的数据输入引脚(data pin)
你想想看,起点和终点一组合,正好就是四种路径类型。我习惯把这四种路径记成「两内两外」——两个在芯片内部,两个跨芯片边界。
4.2 四种路径类型详解
4.2.1 输入到输出(Input to Output)
这种路径也叫 I/O 路径。起点是芯片的输入端口,终点是芯片的输出端口。说白了就是信号从芯片的一个引脚进来,经过一些组合逻辑,直接从另一个引脚出去。
这种路径在纯组合电路中很常见。比如一个简单的加法器,输入从 A 和 B 进来,结果直接从 SUM 出去,中间没有任何寄存器。
我在项目中遇到过一种情况:客户要求芯片的某个控制信号必须在输入变化后 5ns 内反映到输出。当时我一看,这路径上串了三级组合逻辑,延迟加起来 6.2ns,直接超标了。后来拆了一级逻辑,换成查找表,才压到 4.8ns。
4.2.2 输入到寄存器(Input to Register)
起点是输入端口,终点是寄存器的数据引脚。这种路径描述的是:外部信号进入芯片后,经过组合逻辑,最终被内部寄存器采样。
举个例子:芯片的 DATA_IN 引脚进来一个数据,经过两级组合逻辑,送到寄存器 FF1 的 D 端。这条路径的时序检查,就是要保证数据在时钟沿到来之前稳定到达。
我记得有一次调试一个 SPI 接口,发现数据采样总是不对。查了半天,原来是输入路径上有个多路选择器,选择信号来得太晚,导致数据路径变长了。这就是典型的输入到寄存器路径问题。
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 端。中间的组合逻辑是一个加法器。
4.2.4 寄存器到输出(Register to Output)
起点是寄存器的时钟引脚,终点是输出端口。这种路径描述的是:内部寄存器的数据经过组合逻辑,最终送到芯片的输出引脚。
比如芯片内部有个状态寄存器,它的输出经过一些译码逻辑,送到 OUT_PORT 引脚。这条路径的时序检查,就是要保证数据在时钟沿之后,能在规定时间内到达输出端口。
我曾经遇到过一个 DDR 接口的设计,输出路径上有个很大的多路选择器,导致数据从寄存器到输出端口的延迟太大,超出了外部器件的建立时间要求。后来我把多路选择器拆成两级,中间插了一级寄存器,才解决问题。
4.3 四种路径对比总结
| 路径类型 | 起点 | 终点 | 典型场景 | 约束方式 |
|---|---|---|---|---|
| 输入到输出 | 输入端口 | 输出端口 | 纯组合逻辑路径 | set_input_delay / set_output_delay |
| 输入到寄存器 | 输入端口 | 寄存器 D 端 | 外部信号采样 | set_input_delay |
| 寄存器到寄存器 | 寄存器时钟引脚 | 寄存器 D 端 | 内部流水线 | create_clock |
| 寄存器到输出 | 寄存器时钟引脚 | 输出端口 | 内部信号输出 | set_output_delay |
4.4 实际项目中的路径分析思路
我个人在做时序分析时,会按这个顺序来:
- 先看 reg-to-reg 路径——这是芯片内部的主干道,占了大部分路径
- 再看 I/O 路径——输入到寄存器和寄存器到输出,这些涉及芯片边界,容易出问题
- 最后看输入到输出路径——这种纯组合路径在复杂芯片里其实不多,但一旦有,往往是最难修的
你想想看,为什么 reg-to-reg 路径要优先看?因为它的时序约束最简单——就是时钟周期。如果 reg-to-reg 都跑不过,那说明你的设计本身就有问题,I/O 路径修得再好也没用。
嗯,关于四种路径类型,今天就讲到这里。记住一句话:搞清楚了路径的起点和终点,时序分析就成功了一半。