Timing Analysis

同步设计

大多数数字设计是同步的,并且使用顺序元件构建。

同步设计消除了竞争现象,并且更适合设计流水线,提高了吞吐量。

假设所有顺序元件都是边沿触发的,并使用D触发器作为寄存器。

O0vHht.png

那么出发它有三个关键的时序参数

  • tcqt_{cq} 时钟到输出延迟,本质上是一个传播延迟。
  • tsetupt_{setup} 建立时间,即数据必须在时钟到来前到达。
  • tholdt_{hold} 保持时间,即数据在时钟到来后必须保持稳定的时间。

O0vLtx.png

O0vEjj.png

O0vQWp.png

时序约束

  • 在同步逻辑中,需要思考两个重要参数:
    • 最大延迟
    • 最小延迟

其最大延迟不能过大,以至于数据信号没有足够的时间从一个寄存器传到下一个寄存器,在下一个时钟沿到来之前还未完成。最小延迟也不能过小,以至于在同一个时钟周期内就穿过了多个寄存器。

最大延迟违例是由于数据路径过长所导致的,包括寄存器的建立时间 tsetupt_{setup} ,因此它通常被称为“建立路径(Setup Path)”。

最小延迟违例是由于数据路径过短,导致数据在保持时间 tholdt_{hold} 到之前就发生了变化,因此它通常被称为“保持路径(Hold Path)”。

建立最大约束

我们看一看一个时钟周期应该包含哪些内容?

  • 时钟上升沿之后,数据传播到 A 有一个延迟 tcqt_{cq}
  • 接下,必须在下一个时钟周期到来前,提前 tsetupt_{setup} 到达点 B

我们看图来理解

O0vSgU.png

对于右边图,我们这样看:

  • 蓝色路径为启动路径(Launch Path):从第一个寄存器(R1)的时钟沿开始,数据经过组合逻辑。
  • 红色路径为采样路径(Capture Path):在第二个寄存器(R2)上采样数据。
  • 绿色虚线为正时钟偏移(positive clock skew):R2 的时钟比 R1 晚到。
  • 同时,我们还需要留出一点余量(margin)作为安全事件

O0v0sY.png

那么,我们就能建立基本时钟公式

T>tcq+tlogic+tsetupT > t_{cq} + t_{logic} + t_{setup}TT 为时钟周期。

加入时钟偏移和其他余量之后

T+δskew>tcq+tlogic+tsetup+δmarginT + \delta_{skew} > t_{cq} + t_{logic} + t_{setup} +\delta_{margin}

建立最小约束

O0vdov.png

根据上文,我们显然有

tcq+tlogic>tholdt_{cq} + t_{logic} > t_{hold}

O0vsrq.png

同理,加上偏移和其他余量之后 $t_{cq} + t_{logic} - \delta_{margin}> t_{hold} + \delta_{skew} $

静态时序分析 STA

STA 检查所有可能路径在最坏情况下的传播延迟(最大/最小)。

  • 它有以下优点
    • 速度比基于时序的门级仿真快很多
    • 穷尽式检查 —— 即:每一个(受约束的)时序路径都会被检查!
    • 不需要生成输入激励向量(Vector) —— 不需要仿真输入激励。
  • 缺点:
    • 不检查电路的实际功能是否正确(只关注时序)
    • 必须定义时序约束/例外条件
  • 同时有许多限制
    • 仅适用于同步设计(synchronous design)
    • 不能分析组合逻辑反馈环(combinational feedback loops),如用基本逻辑门搭建的触发器
    • 不能分析异步时序问题(asynchronous timing),如跨时钟域(clock domain crossing)
    • 不会检查异步引脚上的毛刺效应(glitching),如组合逻辑驱动异步置位/复位(set/reset)引脚时的毛刺问题

时序路径

一个时序路径是从起点(Startpoint)到终点(Endpoint)的一条信号传播路径。

  • 起点(Startpoint, SP)可以是
    • 触发器的时钟引脚
    • 输入端口,也称为主输入(Primary Inputs,PI)
  • 终点(Endpoint, EP)可以是
    • 触发器的数据输入引脚(不包括时钟引脚)
    • 输出端口,也称为主输出(Primary Outputs,PO)
    • 存储器或硬核宏单元(Hard Macros)

时序路径有以下四种

O0vVGc.png

静态时序分析的目标

  • 验证设计中所有路径是否满足最大延迟和最小延迟的约束:
    • 从门级网表(Gate-Level Netlist)开始
    • 每个逻辑门在标准单元库中都有时序模型(Timing Models)
    • STA 工具需要报告所有违反最大/最小延迟约束的路径
  • 但这就够了吗?
    • 我们只知道了知道所有违反时序约束的路径
    • 实际上,还希望知道所有路径的时序信息,并按照路径长短排序
    • 并且还需要知道问题出在哪里以去修复

一些基本假设

  • 我们的设计是同步的(synchronous),我们只讨论如何处理组合逻辑元件以及最大延迟约束
  • 我们假设使用引脚到引脚延迟模型(pin-to-pin delay model),每个门电路从输入到输出有一个固定的延迟值
  • 实际上门电路有许多因素影响,例如门类型,负载大小,波形形状,转换方向,具体的引脚位置,随机工艺偏差等
  • 实际设计中,这些延迟信息都来自标准单元库的 .lib 文件

简单路径表示

假设在一个电路中,由两个与门串联,并且每个与门时间延迟是2,我们要将这个电路转化成一个图模型:

  • SP 和 EP 转换成顶点,门也转换成一个顶点
  • 每个门的输出为一条鞭,每个输入引脚为一条边,并对应延迟信息
  • 最后加入源点 SRC 和汇点 SNK ,SRC 连接所有 SP, 所有 EP 连接 SNK

O0vY3r.png

  • 如果我们去穷举所有路径,路径数量会呈指数级增长,计算量巨大。因此,我们使用基于节点的分析方法,它:
    • 对于每一个节点,只找出所有路径最长延迟
    • 定义节点的到达时间(Arrival Time, AT)为从源点(SRC)到当前节点的最长路径时间
    • 定义节点的要求到达时间(Required Arrival Time, RAT)为信号最晚允许从该节点出发的时间

节点的 Slack 定义为:Slack(n)=RAT(n)AT(n)Slack(n)=RAT(n)-AT(n)

对于计算 AT 和 RAT 由于这是个 DAG ,我们直接使用拓扑排序 + DP 即可。

O0vliM.png

这幅图可以更生动说明 Slack 的含义。

假路径

我们计算的时候,已经假定图一定是联通的,但是结合上电路逻辑的话,就不一定联通,一些路径在拓扑上存在,但也永远不会激活,这种路径被称为假路径。

O0v9tG.png

设计限制

时序约束

STA 工具怎么知道我们想要的时钟周期是多少呢?

  • 它不知道,我们得告诉它,我们必须为设计定义约束
  • 这通常是通过 SDC 语法(Synopsys Design Constraints) 来完成的,这是一种基于 Tcl 的扩展语法

有三种主要的时序约束:时钟定义、建模芯片外环境、时序例外情况。

集合

即使你会使用 TCL , EDA 工具还或使用另外一种的数据结构,称为 “集合” 。

集合和 TCL 列表类似,但是它的值是指针,必须使用专门函数 foreach_in_collection 遍历集合

这里不展开。

设计对象

这几个术语都比较简单,直接用 ppt 内容

O0vj21.png

几个有用的函数

这些函数都返回集合,而不是 TCL list

  • get

  • [get_ports string] 返回所有匹配该字符串的 端口(ports)

  • [get_pins string] 返回所有匹配的 引脚(pins)(包括 cell/macro 内部的)

  • [get_nets string] 返回所有匹配的 线网(nets)

  • all

  • [all_inputs] 返回该模块的所有主输入端口(primary inputs)

  • [all_outputs] 返回该模块的所有主输出端口(primary outputs)

  • [all_registers] 返回该模块中的所有寄存器(通常是 D 触发器)

时钟定义

  • 为了设置 SDC 时序约束,我们必须定义一个时钟,这需要注意:
    • 时钟来自哪里?(例如:输入端口、PLL 输出等)
    • 时钟周期是多少?
    • 时钟的占空比是多少?

通过 create_clock -period 20 -name my_clock [get_ports clk] 定义一个时钟。

我们可以定义多个时钟,但必须注意时钟域交叉。

在综合中,我们可以用这个命令假设时钟是理想的,STA 工具不会考虑时钟路径上的延迟

set_ideal_network [get_ports clk]

但为了更贴近真实的时序,我们应该给时钟添加上升/下降时间(ns):

set_clock_transition 0.2 [get_clocks my_clock]

我们还可以加入时钟抖动(ns)

set_clock_uncertainty 0.2 [get_clocks my_clock]

最后,在完成时钟树综合(CTS)后,我们不再认为时钟是理想的,STA 工具会考虑实际时钟路径上的延迟和缓冲器,进行更精确的时序分析。

set_propagated_clock [get_clocks my_clock]

I/O 限制

现在时钟已经定义完成,reg2reg 的路径也同时被限制,但是 in2reg, reg2out,in2out 的路径怎么办呢?

  • 这需要思考以下两个问题
    • 哪个时钟在驱动 I/O 端口?
    • 芯片外部延迟又该如何建模?

通过时钟设置 IO 延迟

1
2
3
4
set_input_delay 0.8 -clock clk \
[remove_from_collection [all_inputs] [get_ports clk]]

set_output_delay 2.5 -clock clk [all_outputs]

这表明外部输入数据会在时钟边沿前 0.8ns 到达,内部数据必须在时钟边沿后 2.5ns 内传到输出端口,且排除时钟本身不作为输入信号处理。

更好的方法是使用虚拟时钟来定义环境模型,但是这里不介绍。

物理方法定义

此外还有一种方式是定义最大 I/O 延迟

1
2
3
4
set_max_delay 5 \
-from [remove_from_collection [all_inputs] [get_ports clk]]

set_max_delay 5 -to [all_outputs]

此外,我们还必须为输入信号设置驱动特性

1
2
set_driving_cell -cell [get_lib_cells MYLIB/INV4] -pin Z \
[remove_from_collection [all_inputs] [get_ports clk]]

最后,还需要为输出信号设置负载电容(Load Capacitance)

1
set_load $CIN_OF_INV [all_outputs]

$CIN_OF_INV 是一个定义好的负载值(例如 INV 门的输入电容),这种方式常用于门级网表后 STA 分析或没有完整 I/O 模型时。

我们可以用一张图总结目前学到的 io 延迟:

O0gUxG.png

时序例外情况

某些路径不需要被正常分析和优化,这就叫时序例外(Timing Exceptions)

路径不会同时起作用

O0gDlj.png

如图所示这两条黄色路径不会同时起作用,因此我们要让 STA 避免考虑这两条路径的相互影响,这在 tcl 语言是这样定义的:

1
2
set_false_path -through [get_pins mux1/I0] -through [get_pins mux2/I0]
set_false_path -through [get_pins mux1/I1] -through [get_pins mux2/I1]

这些命令表示:STA 不需要检查这些通过特定输入的路径

跨时钟域的数据传输

数据从时钟 C1 域的寄存器 F1 传输到时钟 C2 域的寄存器 F2

O0gLTp.png

1
set_false_path -from F1/CP -to F2/D

或者使用时钟组工具,告诉 STA 这两个时钟互质

1
2
set_clock_groups -logically_exclusive \
-group [get_clocks C1] -group [get_clocks C2]

如果是“等相位”的慢时钟到快时钟的传输,如图所示:

O0gEvU.png

我们可以设置多周期路径:

1
2
set_multicycle_path -setup -from F1/CP -to F2/D 2
set_multicycle_path -hold -from F1/CP -to F2/D 1

状态分析

在很多设计中,会有一些信号始终为某个常数值,例如设置某个寄存器以进入某种工作模式,在这种情况下,许多路径都是假路径:

  • 如果常数信号接在 MUX 选择线上,那么某些路径永远不会被选中
  • 如果某个 AND 门输入是 0,那么输出始终为 0,另一路输入变化也没意义

所以我们希望把这个常数传播到整个电路中,从而让 STA 工具忽略这些不相关的路径.

1
set_case_analysis 0 [get_ports TEST_MODE]

设计违例规则

最大转换时间,最大电容负载,最大扇出数等。

1
2
3
set_max_transition $MAX_TRAN_IN_NS
set_max_capacitance $MAX_CAP_IN_PF
set_max_fanout $MAX_FANOUT

面向良率的高级静态时序分析

高级STA内容会在课程后期讲解,你将会学习一些常见的概念和术语:

  • On-Chip Variation (OCV)
  • Advanced On-Chip Variation (AOCV)
  • Signal Integrity (SI)
  • More and more and more

时序检查

之前已经知道最大延迟和最小延迟了,但是在实际中,我们还需要考虑以下内容:

  • 恢复(Recovery)
  • 移除(Removal)
  • 时钟门控(Clock Gating)
  • 最小脉宽(Min Pulse Width)
  • 数据到数据(Data-to-Data)

Recovery, Removal and MPW

恢复检查:异步控制输入端在去使能(deasserted)之后,到下一个时钟沿(有效沿)到来之前,必须保持稳定的最短时间。

移除检查:异步控制输入端在去使能(deasserted)之前,从上一个时钟沿(有效沿)之后开始,必须保持稳定的最短时间。

最小时钟脉宽(MPW):从一个时钟上升沿或下降沿开始,时钟信号必须保持稳定的最短时间。

时钟门控检查

时钟门控是指在时钟路径上出现阻止时钟传播的信号,时钟门控的使能路径必须比时钟信号提前足够的时间到达,以确保无毛刺的功能(同时在时钟沿之后也要保持一段时间)。

命令

report_analysis_coverage 检查你是否已经完全约束了你的设计。

check_timing 执行一系列时序约束的一致性与完整性检查,以确保设计中指定的约束是合理且完整的。

或许在任何综合或布局布线工具中,最重要的命令是 report_timing

这一部分请通过 ppt 学习

Multi Mode Multi Corner

在综合期间,我们(通常)针对最坏情况进行时序目标设定,但是最坏情况是什么?

直观来看,那就是慢速角落(例如 SS 工艺,VDD -10%,125°C)

不需要进行保持时间(hold)检查,因为时钟是理想的。

但是还有其他工作模式怎么办?例如测试模式,我们是否需要在相同(高)时钟速度下完成时序收敛?

为了解决这个问题,只需要准备一个额外的 SDC 文件并重新运行 STA / 优化。

1
2
3
4
# 设置工作模式为测试模式
set_case_analysis 1 [get_ports TEST_MODE]
# 创建一个测试时钟,频率远低于功能时
create_clock –period [expr $TCLK/100] –name TEST_CLK [get_ports TEST_CLK]

但在真实设计中,情况只会更多,有多个工作模式和电压域,使用真实时钟时,还需要注意保持时间,很容易面对上百种 corner。

O0gSOv.png

分析视图

为了简化设置,我们创立分析视图,为 setup 和 hold(即最大和最小)时序约束选择使用哪一个视图。

O0gcLc.png

一个分析视图是由一个延迟工况和约束模式构成的。

1
2
3
4
5
6
7
8
9
10
create_analysis_view -name turbo \
-constraint_mode turbo_mode -delay_corner slow_corner_vdd12

create_analysis_view -name low_power \
-constraint_mode low_power_mode -delay_corner slow_corner_vdd05

create_analysis_view -name turbo_hold \
-constraint_mode turbo_mode -delay_corner fast_corner_vdd13

set_analysis_view -setup {turbo low_power} -hold {turbo_hold}

延迟工况告诉工具该如何计算延迟,所以它包含了时序库和寄生参数提取规则。

约束模式本质上是对应某个特定工作模式下的 SDC 约束命令和条件集合。

约束模式

一个约束模式就是一组相关的 SDC 文件,当你在多个分析视图之间切换时,STA 工具会自动将相关约束应用到设计中

1
2
create_constraint_mode -name turbo_mode -sdc_files {turbo.sdc}
create_constraint_mode -name low_power_mode -sdc_files {low_power.sdc}

延迟工况

而延迟工况则要复杂一些,它由一个时序条件、一个 RC 工况以及其他一些我们现在不讨论的内容组成。

1
2
3
4
5
6
7
8
create_delay_corner -name slow_corner_vdd12 \
-rc_corner {RCmax} -timing_condition {ss_1p2V_125C}

create_delay_corner -name slow_corner_vdd05 \
-rc_corner {RCmax} -timing_condition {ss_0p5V_125C}

create_delay_corner -name fast_corner_vdd13 \
-rc_corner {RCmin} -timing_condition {ff_1p3V_m40C}

时序条件和库集合

别急,我们还没完,一个时序条件是一组库集合,用于某个特定的电源域,我们要将时序条件和库集合关联起来。

1
2
create_timing_condition -name tc_ss_1p2V_125C \
-library_sets ss_1p2V_125C

一个 库集合(library set) 是一些 .lib 表征文件的集合,这些文件会被用来对相关门电路进行时序建模。

这包括标准单元和其他宏单元,如 RAM 和 I/O。

有时还会包含用于噪声分析的 “SI” 表征数据。

1
2
3
4
create_library_set -name ss_1p2V_125C \
-timing [list ${sc_libs}/ss_1p2V_125C.lib ${mem_libs}/ss_1p2V_125C.lib \
${io_libs}/ss_1p8V_125.lib] \
-si ${sc_libs}/ss_1p2V_125C.si

RC 工况

RC 工况是一组用于 RC 提取的规则集合,它可能包含一个用于快速提取的“电容表”,以及一个用于精确提取的 QRC 技术文件(techfile)。

1
2
create_rc_corner -name RCmax -cap_table ${tech}/RCmax.CapTbl -T {125} \
-qx_tech_file ${tech}/RCmax.qrctech

O0gVFM.png

(完)