2. 时序分析基础:建立时间与保持时间、时钟偏斜、时钟抖动、时序路径分类

时序收敛是 FPGA/ASIC 设计从 RTL 到物理实现的关键门槛。本章从最核心的时序参数出发,建立时序分析的底层认知,为后续原型板部署中的时序调试打下理论基础。

2.1 建立时间与保持时间

时序分析的核心是检查寄存器(Flip-Flop)的数据输入是否满足其采样窗口要求。这个窗口由两个参数定义:

参数 符号 定义 违反后果
建立时间 Tsu 时钟有效沿到来之前,数据输入必须保持稳定的最短时间 数据无法正确捕获,导致逻辑错误
保持时间 Th 时钟有效沿到来之后,数据输入必须保持稳定的最短时间 数据被错误地采样到下一拍,造成功能紊乱
关键认知: 建立时间约束了路径的最大延迟,保持时间约束了路径的最小延迟。时序收敛的本质就是让所有路径的延迟同时满足这两个边界。

在静态时序分析(STA)中,建立时间检查通常称为 setup check,保持时间检查称为 hold check。两者缺一不可,且优化方向往往相反:优化 setup 可能需要插入流水线或降低逻辑深度,而优化 hold 则可能需要插入缓冲器增加延迟。

2.2 时钟偏斜

时钟偏斜(Clock Skew)是指同一个时钟信号到达不同寄存器的时钟引脚的时间差。它由时钟网络的物理布线长度、负载差异、工艺偏差等因素引起。

  • 正偏斜(Positive Skew): 目标寄存器的时钟到达时间晚于源寄存器。有助于改善 setup 裕量,但会恶化 hold 裕量。
  • 负偏斜(Negative Skew): 目标寄存器的时钟到达时间早于源寄存器。有助于改善 hold 裕量,但会恶化 setup 裕量。
  • 全局偏斜(Global Skew): 芯片内任意两个寄存器之间的最大时钟到达时间差。
  • 局部偏斜(Local Skew): 时序路径上源寄存器和目标寄存器之间的时钟到达时间差,直接影响时序裕量计算。
实战提示: 在原型板部署中,时钟偏斜往往比仿真模型更大,因为 PCB 走线、连接器、FPGA 封装都会引入额外偏斜。建议在时序约束中预留 10%~20% 的偏斜裕量。

2.3 时钟抖动

时钟抖动(Clock Jitter)是指时钟沿在时间轴上的随机或确定性偏移。它分为两类:

类型 来源 对时序的影响
随机抖动 热噪声、闪烁噪声、电源噪声 降低 setup/hold 的有效裕量,通常以 RMS 值衡量
确定性抖动 串扰、电源纹波、PLL 锁定误差 表现为周期抖动或周期间抖动,可预测但难以完全消除

在时序分析中,抖动通常被建模为时钟周期的缩减量。例如,若系统时钟周期为 10 ns,抖动为 ±100 ps,则有效分析周期为 9.8 ns。原型板上的时钟源(如板载晶振、PLL 输出)的抖动指标必须纳入时序约束文件。

2.4 时序路径分类

静态时序分析将所有路径分为四类,每类路径的起点和终点不同,约束方式也各有侧重:

  1. 输入到寄存器路径(Input to Register): 从芯片输入端口到内部寄存器的数据输入引脚。受输入延迟约束(set_input_delay)。
  2. 寄存器到寄存器路径(Register to Register): 从源寄存器时钟引脚到目标寄存器数据输入引脚。这是最核心的路径,受时钟周期约束。
  3. 寄存器到输出路径(Register to Output): 从内部寄存器时钟引脚到芯片输出端口。受输出延迟约束(set_output_delay)。
  4. 输入到输出路径(Input to Output): 从芯片输入端口到芯片输出端口,纯组合逻辑路径。受输入输出延迟组合约束。
常见误区: 初学者往往只关注寄存器到寄存器路径,而忽略 I/O 路径。在原型板部署中,I/O 路径的时序失败往往源于 PCB 走线延迟与 FPGA 内部延迟不匹配,调试难度更高。
时序路径分类与关键参数关系 输入→寄存器 set_input_delay 寄存器→寄存器 时钟周期约束 寄存器→输出 set_output_delay 输入→输出 组合约束 输入延迟 外部器件 Tco PCB 走线延迟 Tsu / Th 检查 时钟偏斜影响 时钟抖动裕量 输出延迟 外部器件 Tsu PCB 负载电容 纯组合延迟 输入→输出约束 无时钟沿参与 时序收敛 = 所有路径同时满足 Tsu 与 Th 要求 考虑时钟偏斜、抖动、PVT 变化后的最差情况分析 建立时间裕量 Tcycle - Tdelay - Tsu - Tskew - Tjitter 保持时间裕量 Tdelay - Th - Tskew 抖动影响 有效周期 = Tcycle - Tjitter_pp

2.5 时序分析中的关键公式

在实际时序分析工具中,建立时间和保持时间的检查公式如下:

// 建立时间检查(Setup Check)
T_data_arrival + T_setup <= T_clock_capture + T_cycle - T_jitter

// 保持时间检查(Hold Check)
T_data_arrival >= T_clock_capture + T_hold + T_jitter

// 其中:
// T_data_arrival  = 源时钟沿到数据到达目标寄存器 D 端的延迟
// T_clock_capture = 时钟从源点到达目标寄存器时钟引脚的延迟
// T_cycle         = 时钟周期
// T_jitter        = 时钟抖动(通常取峰峰值的一半)
工程经验: 在原型板部署阶段,建议在时序约束中显式声明时钟不确定性(set_clock_uncertainty),将偏斜和抖动合并为一个裕量值。例如:set_clock_uncertainty -setup 0.2 [get_clocks sys_clk]。这比单独设置偏斜和抖动更简洁,且与主流 EDA 工具兼容。

2.6 本章小结