返回文章列表
时序分析STAtimingsetuphold

静态时序分析:STA 基础指南

2024-06-1510 min

什么是 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 分析需要关注:

  1. 所有时钟域的时序
  2. 异步接口的约束
  3. 多角(multi-corner)分析