2. 时序路径分析:建立时间与保持时间、时序路径的四种类型

各位同学,咱们今天聊点实在的。时序分析这东西,说白了就是搞清楚信号在芯片里跑一圈到底要多久。我刚开始做数字IC那会儿,总觉得时序约束是后端的事,跟我前端设计没关系。直到有一次,我写的模块在综合后时序惨不忍睹,被后端同事追着改了一个礼拜……嗯,从那以后,我再也不敢小看时序路径分析了。

2.1 建立时间与保持时间——触发器的“脾气”

先说说触发器的两个关键参数。你想想看,一个触发器要正确采集数据,得满足两个条件:

  • 建立时间(Setup Time):时钟有效沿到来之前,数据必须提前稳定下来的最短时间。
  • 保持时间(Hold Time):时钟有效沿到来之后,数据必须继续保持稳定的最短时间。

我习惯把这两个时间比作“公交车的关门时间”。建立时间就像你必须在车门关闭前上车,保持时间就像车门关闭后你不能再挤上去。如果数据在建立时间内没稳定,或者保持时间内变了,触发器就会进入“亚稳态”——说白了就是输出不确定,可能0可能1,甚至来回振荡。

核心要点:

  • 建立时间决定了电路能跑多快(最高频率)
  • 保持时间决定了电路能不能稳定工作(避免亚稳态)
  • 两者缺一不可,但实际项目中保持时间更容易被忽略

我的经验:我曾经在一个高速接口项目中,因为只关注了建立时间,忽略了保持时间,结果芯片在低温下频繁出错。后来加了一级延迟链才搞定。记住,保持时间问题往往在工艺角(PVT)最差情况下才会暴露,千万别偷懒。

2.2 时序路径的四种类型——STA的“四大家族”

静态时序分析(STA)把所有的时序路径归为四类。搞懂这四类,你就掌握了STA的骨架。我每次做新项目,第一件事就是把这四类路径的约束先搭起来。

2.2.1 寄存器到寄存器路径(Reg-to-Reg)

这是最常见、也最核心的路径。数据从一个触发器的输出(Q端),经过组合逻辑,到达另一个触发器的输入(D端)。

// 典型的Reg-to-Reg路径
always @(posedge clk) begin
    reg2 <= reg1 + data_in;  // reg1到reg2的路径
end

这类路径的时序公式很简单:

  • 建立时间检查:T_clk_q + T_combo + T_setup ≤ T_clk_period
  • 保持时间检查:T_clk_q + T_combo ≥ T_hold

说白了,就是组合逻辑不能太长,否则频率上不去。我建议初学者先从这个路径入手,因为它最直观。

2.2.2 输入到寄存器路径(Input-to-Reg)

这是从芯片的输入引脚到内部第一个触发器的路径。外部信号经过输入缓冲、组合逻辑,最终被触发器采样。

注意:这类路径的难点在于——你无法控制外部信号的到达时间。我曾经遇到一个客户,他们提供的时钟和数据之间总是有偏差,害得我不得不调整输入延迟约束。所以,输入延迟约束(set_input_delay)一定要和芯片手册对清楚

约束示例:

# 设置输入延迟,假设外部数据在时钟上升沿后2ns到达
set_input_delay -clock clk -max 2.0 [get_ports data_in]

2.2.3 寄存器到输出路径(Reg-to-Output)

这是从内部最后一个触发器到芯片输出引脚的路径。数据从触发器输出,经过输出缓冲,最终送到片外。

这类路径的约束关键是输出延迟(set_output_delay)。它表示外部器件需要数据提前多长时间准备好。我习惯这样理解:输出延迟就是“外部器件留给你的时间预算”。

# 设置输出延迟,假设外部器件需要数据在时钟沿前3ns到达
set_output_delay -clock clk -max 3.0 [get_ports data_out]

2.2.4 输入到输出路径(Input-to-Output)

这是纯组合逻辑路径,从输入引脚直接到输出引脚,中间没有寄存器。这类路径在STA中通常用最大延迟约束(set_max_delay)来限制。

实战建议:这类路径尽量少用。我见过一个设计,因为用了大量纯组合路径,导致时序收敛困难。如果非要用,记得加输入输出延迟约束,并且留足余量。

2.3 四种路径的对比总结

路径类型 起点 终点 主要约束 常见问题
Reg-to-Reg 触发器Q端 触发器D端 时钟周期 组合逻辑过长
Input-to-Reg 输入引脚 触发器D端 set_input_delay 外部时序不匹配
Reg-to-Output 触发器Q端 输出引脚 set_output_delay 输出驱动能力不足
Input-to-Output 输入引脚 输出引脚 set_max_delay 纯组合路径风险

2.4 我的分析流程

每次拿到一个新设计,我会按这个顺序检查时序路径:

  1. 先看Reg-to-Reg:这是核心,如果这里都过不了,其他路径不用看
  2. 再看Input-to-Reg:检查输入接口的时序余量
  3. 然后看Reg-to-Output:确保输出能满足外部器件要求
  4. 最后看Input-to-Output:这类路径通常很少,但一旦有问题就很麻烦

小技巧:用STA工具(比如PrimeTime)跑完分析后,先看最差路径(Worst Negative Slack, WNS)。如果WNS是负的,说明有路径不满足时序。别慌,先定位是哪类路径,再对症下药。

好了,这一章的内容就到这里。记住,时序路径分析是STA的基石。你把这四种路径搞明白了,后面学约束编写就会轻松很多。下一章我们聊聊如何编写基本的时序约束,到时候我会分享一些我踩过的坑。