2. 时序分析基础:建立时间与保持时间、时钟周期与频率、时序路径的组成

各位同学,咱们今天聊点实在的。

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

2.1 建立时间与保持时间——触发器的“脾气”

每个触发器都有两个“底线”:建立时间(setup time)和保持时间(hold time)。你想想看,数据在时钟沿到来之前,必须提前稳定下来,这个提前量就是建立时间。数据在时钟沿之后,还得再稳住一会儿,这就是保持时间。

我在项目中遇到过这样一个坑:一个高速接口的保持时间违例,查了三天,最后发现是时钟树偏斜太大。嗯,保持时间违例比建立时间更难修,因为它跟时钟频率无关,只跟工艺偏差有关。

核心公式(记牢了):

  • 建立时间检查:T_clk_period ≥ T_clk2q + T_comb + T_setup + T_skew
  • 保持时间检查:T_clk2q + T_comb ≥ T_hold + T_skew

我的个人习惯:做时序约束时,我会给建立时间留5%~10%的余量,但保持时间我基本不留余量——因为保持时间违例没法通过降频解决,必须从物理设计上修。

2.2 时钟周期与频率——芯片的“心跳”

时钟周期和频率,就是芯片的心跳。100MHz的时钟,周期是10ns。听起来简单吧?但实际项目中,时钟树上的每一级buffer都会引入延迟。

我曾经接手过一个项目,综合报告显示最高能跑500MHz,结果后端做完,只能跑350MHz。为什么?因为时钟树综合(CTS)之后,时钟偏斜和插入延迟把余量吃掉了。所以,我建议你在前端设计时,至少留20%的时序余量。

时钟频率 周期 典型应用
100 MHz 10.0 ns 低速控制接口
500 MHz 2.0 ns DDR内存接口
1 GHz 1.0 ns 高速SerDes
2 GHz 0.5 ns 高性能CPU核心

注意:不要只看频率数字。同样的1GHz,在28nm工艺下可能很轻松,到了7nm工艺下,因为线延迟占比变大,反而更难收敛。我曾经在7nm项目上吃过这个亏——以为频率不高就放松了约束,结果后端跑出几十万条违例。

2.3 时序路径的组成——起点、终点、组合逻辑

一条完整的时序路径,说白了就三部分:起点(startpoint)、组合逻辑(combinational logic)、终点(endpoint)。

  • 起点:通常是触发器的时钟引脚,或者是输入端口
  • 终点:通常是触发器的数据输入引脚,或者是输出端口
  • 组合逻辑:就是起点和终点之间的所有门电路和连线

你想想看,数据从起点出发,经过一堆与门、或门、多路选择器,最后到达终点。这条路上的每一级门都会引入延迟,每一段连线都会增加RC负载。我在项目中见过最夸张的一条路径,中间串了40多级组合逻辑——那基本是没法收敛的。

下面这张图,是我画的一个典型时序路径结构,帮你理解数据是怎么“跑”的:

典型时序路径结构 起点 触发器 (clock→Q) 组合逻辑 与门 / 或门 / 多路选择器 延迟 = 门延迟 + 线延迟 级数:通常建议 ≤ 15级 终点 触发器 (D→Q setup/hold) T_clk2q T_comb 时钟周期 T_clk = 1 / f_clk 总延迟 = T_clk2q + T_comb → 必须 ≤ T_clk - T_setup

避坑指南:我曾经遇到一个案例,综合工具报的路径延迟只有2.5ns,但实际芯片只能跑到200MHz(周期5ns)。后来发现,那条路径上有一个多路选择器,输入选择信号是异步的,导致组合逻辑里出现了“假路径”。所以,做时序分析时,一定要先确认所有路径都是“真路径”。

2.4 三种路径类型

STA工具会把路径分成三类,每一类的约束方式都不一样:

  1. 输入到寄存器(input-to-register):从输入端口到触发器的D端。需要约束输入延迟。
  2. 寄存器到寄存器(register-to-register):从触发器到触发器。这是最核心的路径,也是我们优化最多的。
  3. 寄存器到输出(register-to-output):从触发器的Q端到输出端口。需要约束输出延迟。

我个人习惯,在做RTL编码时,就先把寄存器到寄存器的路径控制在12级组合逻辑以内。超过15级的,我会主动插入流水线。这样做的好处是,后端做物理设计时,基本不会因为时序违例而大改代码。

记住一句话:时序收敛不是后端一个人的事。前端设计时多花10分钟考虑路径深度,后端就能少花10天去修违例。


可可精品资料库