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 时序路径分类
静态时序分析将所有路径分为四类,每类路径的起点和终点不同,约束方式也各有侧重:
- 输入到寄存器路径(Input to Register): 从芯片输入端口到内部寄存器的数据输入引脚。受输入延迟约束(set_input_delay)。
- 寄存器到寄存器路径(Register to Register): 从源寄存器时钟引脚到目标寄存器数据输入引脚。这是最核心的路径,受时钟周期约束。
- 寄存器到输出路径(Register to Output): 从内部寄存器时钟引脚到芯片输出端口。受输出延迟约束(set_output_delay)。
- 输入到输出路径(Input to Output): 从芯片输入端口到芯片输出端口,纯组合逻辑路径。受输入输出延迟组合约束。
常见误区: 初学者往往只关注寄存器到寄存器路径,而忽略 I/O 路径。在原型板部署中,I/O 路径的时序失败往往源于 PCB 走线延迟与 FPGA 内部延迟不匹配,调试难度更高。
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 工具兼容。