什么是 STA
静态时序分析(Static Timing Analysis, STA)是数字后端设计中最重要的验证手段之一。它通过分析设计中所有时序路径的延迟,来验证芯片是否满足时序约束。
基本概念
时序路径
典型的时序路径包括:
- Input to Register (I2R):从输入端口到寄存器
- Register to Register (R2R):从寄存器到寄存器
- Register to Output (R2O):从寄存器到输出端口
- Input to Output (I2O):从输入端口到输出端口
建立时间和保持时间
# STA 基础分析
create_clock -name sys_clk -period 10 [get_ports clk]
set_input_delay -clock sys_clk 2 [all_inputs]
set_output_delay -clock sys_clk 2 [all_outputs]
# 检查建立时间和保持时间
report_timing -max_paths 10
约束文件
时序约束是 STA 的基础:
# 时钟定义
create_clock -period 5.0 -name CLK [get_pins CLK]
# 设置时钟不确定度(用于考虑 OCV)
set_clock_uncertainty 0.5 [get_clocks CLK]
# 设置时钟过渡时间
set_clock_transition 0.1 [get_clocks CLK]
常见时序问题
建立时间违例
当数据到达时间晚于采样边沿时发生:
# Python 脚本:分析建立时间违例
def check_setup_violation(timing_path):
data_arrival = timing_path.launch_clock + timing_path.delay
data_required = timing_path.capture_clock - setup_slack
if data_arrival > data_required:
return True, data_arrival - data_required
return False, 0
保持时间违例
当数据在采样边沿之前被覆盖时发生:
#!/usr/bin/perl
# 分析保持时间违例
sub check_hold_violation {
my ($path) = @_;
my $data_arrival = $path->{capture_edge};
my $data_required = $path->{launch_edge} + $path->{min_delay};
if ($data_arrival < $data_required) {
print "Hold violation found: " . ($data_required - $data_arrival) . "ns\n";
}
}
报告解读
# 生成详细时序报告
report_timing \
-from [get_cells ff_reg*] \
-to [get_cells ff_reg*] \
-max_paths 5 \
-detail
总结
STA 分析需要关注:
- 所有时钟域的时序
- 异步接口的约束
- 多角(multi-corner)分析