图像加速中的时序收敛 - 第2节

一、静态时序分析(STA)的基本概念

静态时序分析,说白了就是检查你的芯片能不能跑在目标频率上。我刚开始做设计时总觉得这步可有可无,直到有一次流片回来芯片死活上不了高频……嗯,从那以后我再也不敢跳过 STA 了。

STA 是一种穷尽式的时序验证方法。它不需要输入测试向量,而是通过分析电路中所有可能的路径,计算信号从起点到终点所需的时间。你想想看,这比动态仿真要高效得多——仿真只能覆盖你写的那些测试用例,而 STA 把所有路径都扫了一遍。

核心要点:STA 的目标是确保每个时序路径上的数据都能在时钟沿到来之前稳定到达,并且保持足够长的时间。

1.1 为什么需要 STA?

数字电路的本质是时序逻辑。每个寄存器都在时钟沿采样数据。如果数据来得太晚(建立时间违例),或者变化得太快(保持时间违例),寄存器就会采到错误的值。我在一个项目中遇到过这样的情况:综合后时序报告全是绿的,但后仿发现某些路径在极端工艺角下就是跑不过。后来一查,是 STA 约束没写全。

STA 能帮你回答三个问题:

  • 电路能不能在目标频率下正常工作?
  • 哪些路径是关键的瓶颈?
  • 修改后时序是否改善?

我的习惯:每次做完综合,第一件事就是看最差的几条路径。不要只看 setup,hold 违例往往更隐蔽。

1.2 STA 的基本术语

在深入路径分类之前,先理清几个关键概念。这些术语你会在时序报告中反复看到:

术语 含义 我的理解
建立时间 (Tsetup) 数据在时钟沿之前必须稳定的最短时间 数据要提前到,别迟到
保持时间 (Thold) 数据在时钟沿之后必须稳定的最短时间 数据别急着走,多待一会儿
时钟偏斜 (Clock Skew) 时钟到达不同寄存器的延迟差异 时钟不是同时到的,要算进去
时序裕量 (Slack) 路径实际延迟与要求延迟的差值 正数安全,负数危险

这里有个容易混淆的点:建立时间和保持时间都是寄存器的固有属性,不是你能改的。你能改的是组合逻辑的延迟。我曾经被一个实习生问过:「能不能把建立时间设小一点?」——不行,那是工艺决定的。

二、时序路径的四大分类

STA 把时序路径分成四类。这个分类很重要,因为每种路径的分析方法和优化手段都不一样。我习惯在项目开始前就把这四类路径的约束写清楚,省得后面返工。

路径分类总览:输入到寄存器、寄存器到寄存器、寄存器到输出、输入到输出。

2.1 输入到寄存器(Input to Register)

这类路径从芯片的输入端口开始,到第一个寄存器的数据输入端结束。说白了,就是外部信号进入芯片后,经过一些组合逻辑,最终被寄存器采样的过程。

分析这类路径时,你需要知道外部信号的到达时间(input delay)。这个值通常由芯片的数据手册或系统级约束给出。我在做图像传感器接口时,输入 delay 就是由 sensor 的时序参数决定的,差一点都不行。

// 典型的输入约束示例
set_input_delay -clock clk -max 2.5 [get_ports data_in]
set_input_delay -clock clk -min 1.0 [get_ports data_in]

注意:输入 delay 的 min 和 max 要分别约束。max 对应建立时间分析,min 对应保持时间分析。我曾经只设了 max,结果 hold 违例没发现,板子调了三天。

2.2 寄存器到寄存器(Register to Register)

这是最核心的一类路径,也是你优化时最常打交道的。它从一个寄存器的时钟端开始,经过组合逻辑,到下一个寄存器的数据输入端结束。

路径延迟 = 时钟偏斜 + Tclk-to-q + 组合逻辑延迟 + 走线延迟

要求:Tclk - Tsetup ≥ 路径延迟

说白了,就是时钟周期要大于路径延迟加上建立时间。我在做 500MHz 的图像处理流水线时,这类路径占了 90% 的优化工作。每减少一级组合逻辑,可能就能多跑 50MHz。

避坑指南:我曾经以为寄存器到寄存器的路径只跟组合逻辑有关,忽略了时钟偏斜。结果在 CTS 之后发现 slack 变差了,原来是时钟树没做好。

2.3 寄存器到输出(Register to Output)

这类路径从最后一个寄存器开始,到芯片的输出端口结束。它决定了数据从芯片输出需要多长时间。

分析时你需要知道外部电路对输出信号的到达时间要求(output delay)。这个值通常由下一级芯片的建立时间决定。我做过一个 HDMI 接口,输出 delay 必须精确到皮秒级,否则显示器会闪屏。

// 典型的输出约束示例
set_output_delay -clock clk -max 3.0 [get_ports data_out]
set_output_delay -clock clk -min 0.5 [get_ports data_out]

2.4 输入到输出(Input to Output)

这类路径直接从输入端口到输出端口,中间没有寄存器。说白了就是纯组合逻辑路径。在高速设计中,我建议尽量避免这种路径——因为它不受时钟控制,延迟完全由组合逻辑决定,很难收敛。

但有些场景避不开,比如异步复位信号、一些控制信号。这时候你要特别小心,因为 STA 工具对这类路径的分析依赖于你设置的 input/output delay 是否准确。

我的建议:如果可能,尽量在输入到输出路径上插入一级寄存器。哪怕只是打一拍,也能把异步路径变成同步路径,时序分析会简单很多。

三、知识体系结构图

下面这张图总结了本章的核心逻辑。你可以把它当作 STA 入门的地图:

静态时序分析(STA)知识体系 STA 核心目标 基本概念 建立时间 / 保持时间 时钟偏斜 / 时序裕量 穷尽式验证 四大路径分类 ① 输入 → 寄存器 ② 寄存器 → 寄存器 ③ 寄存器 → 输出 ④ 输入 → 输出 分析流程 设置约束 → 运行STA → 分析报告 → 优化关键路径 → 重新验证 优化手段 流水线 / 寄存器插入 / 逻辑优化

这张图把 STA 的核心逻辑串起来了。你从「核心目标」出发,先理解基本概念,再掌握路径分类,然后按分析流程走一遍,最后用优化手段解决问题。嗯,这就是我每次做时序收敛的套路。

本章小结:STA 不是玄学,是工程。把四类路径搞清楚,你的时序收敛之路就成功了一半。剩下的就是多跑几次、多分析报告、多积累经验。

可可精品资料库