讲义

对于静态时序分析来说,我们一般在完成PR也就是后端的布局布线之后进行,之后会补充OCV、mmmc等内容,进行完整的signoff静态时序分析,这里先介绍部分概念,能跑通比较简单的PT静态时序分析流程

静态时序分析 #

STA概述 #

静态时序分析(STA)是通过工具对同步电路中所有存在的时序路径进行分析,检查是否存在时序违例,是标准的timing Sign off方法 主要都是针对同步电路 时序的验证方法:

  • 动态时序分析(Dynamic timing simulation)
  • 静态时序分析(Static Timing Analysis)

动态时序分析(Dynamic Timing Analysis, DTA) #

  1. 方法特点
    • 基于仿真方法,通过施加具体输入测试向量,验证设计在特定条件下的时序行为。
    • 需要设计功能和测试向量的配合。
  2. 优势
    • 功能覆盖:能够验证特定输入条件下的时序行为。
    • 精确性:仿真电路的真实响应,能发现实际条件下的潜在问题。
  3. 劣势
    • 依赖测试向量:质量(覆盖率)取决于输入测试向量的全面性。
    • 仿真时间长:随着测试向量数量增加,仿真时间显著增长。
  4. 适用场景
    • 用于验证复杂场景下的时序问题。
    • 适合后仿真阶段的功能和时序联合验证。

静态时序分析(Static Timing Analysis, STA) #

  1. 方法特点
    • 采用穷举型逻辑,通过计算电路中所有可能路径的时序约束来验证设计的时序完整性。
    • 不需要特定输入向量,独立于信号值。
  2. 优势
    • 全面性:STA 对设计中的所有路径进行分析,确保所有时序检查无遗漏(如 setup/hold 检查)。
    • 效率高:不需要仿真输入,分析速度快,特别适合大规模设计。
    • 角点分析:可以在不同 PVT(工艺、温度、电压)角点快速分析。
  3. 适用场景
    • 用于设计的早期和后期阶段进行全面的时序验证。
    • 适合检查所有可能的时序路径。

对比总结 #

特性 静态时序分析(STA) 动态时序分析(DTA)
输入依赖 无需具体测试向量 需要测试向量
分析范围 全面,覆盖所有路径 受测试向量覆盖率限制
分析速度
验证场景 适合早期验证,分析所有角点 适合特定功能验证和实际条件下

所以,STA就是套用特定的模型,针对特定的电路在给定的时序约束上面分析设计是否有时序违例,所以进行STA一般需要3个文件

  • 时序模型 :lib文件
  • 特定的电路 : Netlist文件
  • 给定的时序约束 : sdc文件

常用的工具有 Synopsys: Prime Time(常用) Cadence: Tempus

本教程选用Prime Time作为时序分析的工具

STA分析流程 #

PT和DC综合的过程和命令都是十分相似的,与综合过程中对时序检查的区别:PT使用的是更加精准的时序模型,并且使用PT做STA会对所有的corner,也就是工艺角去分析,而综合一般只做一两个corner Alt text
我们通过在terminal输入

pt_shell

使用Prime Time的命令

第一步、读入文件 #

STA需要读入的基本文件有:

  • 工艺库的时序模型:工艺库时序lib文件
  • 逻辑综合的网表和spef文件等 :DC综合产生的门级网表与RC提取的spef文件
  • 时序约束文件:sdc文件,里面是关于时序的各种约束

工艺库的时序模型 #

时序分析的路径 #

对于静态时序分析来说,一条路径上的时序大致由3部分组成:

  • Cell delay :信号通过每个cell花费的时间
  • Net delay :每个cell的连线中的delay
  • Cell check time : 检查单元是否满足时序要求时所需要考虑的特定时间。包括两个方面:Setup Time(建立时间)、Hold Time(保持时间)

什么是Setup Time和Hold Time?
Setup time:逻辑单元(通常是触发器或寄存器)要求输入信号在时钟沿到来之前,必须提前稳定的时间。这是为了确保信号在时钟沿到达时被正确捕获。
Hold Time:指信号在时钟沿到达之后,必须保持稳定的时间窗口,以避免数据丢失。

首先我们来了解一下什么是时序弧,在计算路径延时的时候,工具是把每一条路径分成时序弧(timing arcs)来计算
Alt text
如果两个pin之间的timing存在因果关系,那么我们就把这种时序的关系叫做时序弧(timing arcs),主要分为定义时序延迟和定义时序检查两种。 每个cell的时序弧定义在lib文件里面,net之间没有时序弧,因为他们的延时是由RC参数计算出来的。

时序延时 #

时序延迟是描述信号在电路中传播的时间,通常分为以下几种类型:

  1. 组合逻辑延迟(Combinational Logic Delay)
  2. 时序逻辑延迟(Sequential Logic Delay)
  3. 三态门逻辑延迟(Tri-state Logic Delay)

组合逻辑延迟: #

组合逻辑延迟指的是信号在组合逻辑电路中传播所需的时间。组合逻辑电路的输出只依赖于当前输入的状态,不依赖于过去的状态,因此其时序延迟主要由电路内部的门延迟(如与门、或门、非门等)决定。
组合逻辑延迟可以按照输入输出信号的变化进行分类,主要包括:

  • Positive unate:输入输出信号变化相同
  • Negative unate:输入输出信号变化相反
  • non unate:输出信号不由输入决定

时序逻辑延迟 #

时序单元延迟,定义时序器件的时钟引脚到达输出端口的延迟,叫做边缘时序弧(Edge Timing arc)

三态门逻辑延迟 #

三态门(Tri-state Gate)是一种具有三个状态(高电平、低电平、三态)输出的逻辑门。在数字电路中,三态门的输出可以是高电平、低电平或者高阻抗状态(Z)。当输出处于高阻抗状态时,它相当于被断开,不对电路造成影响。
三态门逻辑延迟定义三态门组件使能信号到输出的延时时间

时序检查 #

在静态时序分析里面,软件就是对各个地方的时序进行检查,主要分为:

建立时间检查 #

Alt text 定义时序组件所需要的Setup Time,即数据信号需要提前多久到达

保持时间检查 #

Alt text 定义时序组件所需要的Hold Time,即数据信号需要保持多久时间稳定不变

恢复时间检查 #

Alt text 定义时序组件时钟沿到来之前,异步复位/置位信号不准启动的时间

清除时间检查 #

Alt text 定义时序组件时钟沿到来之后,异步复位/置位信号不准启动的时间

脉冲宽度检查 #

Alt text 定义时钟信号需要维持稳定的最短时间,依据信号维持在0或者1的电位分为2类,High pulse width和Low pulse width

时序约束文件 #

这里的约束文件命令和DC中的级别一致,但是需要加上

set_propagated_clock [all_clocks]

这个命令会将时钟设计成一个实际的延时(实际的线网延时),这步是必不可少的,没设置的话clock默认是理想的具有无穷大的驱动能力,时序就不准确。

具体命令 #

与DC综合类似,在读取文件前,我们需要设置需要的各种参数和pt搜索文件的路径
使用下面命令

pt_shell> set search_path [list \
         ./ \
         ../ \
         xxxx \
         ]

pt_shell> set link_library     [list "*" xxxx.db]
pt_shell> read_verilog xxx.v
pt_shell> current_design xxxx
pt_shell> link_design -verbose
pt_shell> read_sdc xxx.sdc
pt_shell> read_parasitic xxx.spef

在成功读入这些文件之后,如果我们读入了spef文件,那我们需要检查反标率(Annotated coverage)

反标率(Annotated Coverage) 是指在芯片设计的信号完整性和时序分析中,使用标注的寄生参数信息来覆盖整个设计的比例。这个指标表明有多少电路网线的寄生参数(如电阻、电容等)是通过 SPEF 文件(或类似文件)提供的精确数据标注的,而不是通过工具默认的估算模型生成的。

使用命令

pt_shell> report_annotated_parasitics

报告反标率 real nets中的complete net需要保证100%的coverage
如果设计里面的反标率不是100%,代表设计里的某些net上其实是没有延迟的,最后得到的结果是不准确的。

第二步、创建时序模型 #

首先,STA是基于时序路径去产生时序报告的,每条时序路径都能找到起点和终点。 起点:输入端口和时序器件的CLK端 终点:输出端口和时序器件的date、input端 时序路径可以分为4类:
1、输入端到触发器数据输入(in2reg)
Alt text
2、触发器时钟输入到触发器数据输入(reg2reg)
Alt text
3、触发器时钟输入到输出端(reg2out)
Alt text
4、输入端到输出端(in2out)
Alt text
然后工具就会根据这四种类型的时序路径,来计算逻辑的延迟,这里的计算方法就是把一条路径分成时序弧,然后根据工艺库里面的标准单元和线的延迟计算得到的
对于setup的检查(我们以从clk到触发器的D端这条路径为例) 工具会检查一下电路里每个触发器的数据和时钟的关系,是否满足我们之前讲过的建立时间的定义,对于第二个触发器,clk信号到FF2D端的时序路径,检查其d信号和clk信号,是否能够满足建立时间要求。 Alt text 如图所示,周期为T的CLK波形是原始波形,经过T_launch的延迟后,到达FF1的CK端,形成图中第二个波形,然后CLK经过ck端到Q的延迟,再经过一定的组合逻辑延迟,最终到达UFF2触发器的D端,发射的数据波形如第三个波形图所示,时钟CLK经过了T_capture的延迟,到达了FF2的CK端,如图第四个波形所示,对于FF2来讲,它如果想得到稳定的采样结果,数据必须在它的建立时间之前稳定,step2与step3过程中,这条从时钟到触发器D端的路径,我们称之为launch路径,发射路径,对应第三个波形图,step4的路径称为捕获路径,对应第四个波形图,因此,对于发射路径数据发送的延迟值,必须在图上的虚线之前就稳定下来。因为时间轴是从波形图左到右逐渐增大的,得到一个结论:上面这条发射数据逻辑的延迟的最大值只能到达图中的虚线处。 基于以上分析,得到建立时间检查的公式: \[ T_{\text{launch}} + T_{\text{ck\_2q}} + T_{\text{dp}} < T_{\text{capture}} + T_{\text{cycle}} - T_{\text{setup}} \] 各个 T 的含义

符号 中文含义 详细描述
T_launch 发射触发器时钟树的延迟 表示发射触发器(launch flip-flop,UFF1)的时钟树延迟。
T_ck_2q 触发器时钟到 Q 的延迟 表示从触发器时钟信号到输出 Q 信号的延迟。
T_dp 组合逻辑数据路径的延迟 表示从发射触发器输出到捕获触发器输入的组合逻辑路径的延迟。
T_capture 捕获触发器时钟树的延迟 表示捕获触发器(capture flip-flop,UFF2)的时钟树延迟。
T_cycle 时钟周期 表示系统的时钟周期。
T_setup 捕获触发器的建立时间 表示捕获触发器数据稳定所需的时间。

总之,工具就是对于整个电路进行上述类似的检查,确保所有路径的建立时间与保持时间都能符合标准,这里又有一个新的概念,时间裕量(Time slack)

时间裕量(Time Slack) #

时间裕量是指信号在某一条路径上满足时序约束后剩余的时间,用于评估时序设计是否有余量或存在时序违例。时间裕量分为 建立时间裕量(Setup Slack)保持时间裕量(Hold Slack) 两种。

1. 建立时间裕量(Setup Slack) #

公式: \[ \text{Setup Slack} = T_{\text{capture}} + T_{\text{cycle}} - T_{\text{setup}} - (T_{\text{launch}} + T_{\text{ck\_2q}} + T_{\text{dp}}) \]

建立时间裕量:

  • 确保信号能够在时钟沿到来前稳定传递到捕获触发器的输入端,满足建立时间要求。
  • 如果裕量不足(负值),可能需要优化时钟周期或减少路径延迟。

2. 保持时间裕量(Hold Slack) #

公式: \[ \text{Hold Slack} = T_{\text{capture}} + T_{\text{hold}} - (T_{\text{launch}} + T_{\text{ck\_2q}} + T_{\text{dp}}) \] 保持时间裕量:

  • 确保信号在时钟沿到来后不会发生数据竞争,能够正确采样数据。
  • 如果裕量不足(负值),可能需要插入延迟单元来调整数据的传播时间。

我们最后要求slack > 0 在数字电路中,整个电路的速度(时钟频率 ( f ))由最差的一条时序路径决定,裕量越大,电路设计的时序越宽松,那么电路可优化的空间也越大。
通过优化,我们可以尽量减少裕量,主要保证 Slack 为一个接近 0 的值,同时对功耗进行优化。

如果是DC综合后的时序检查,我们一般会要求裕量要剩余足够多,并且可以暂时不处理保持时间的违例,因为在后端进行布局布线的时候,会插入很多buff,并且会引入连线的延时,这样很多保持时间的违例会自动消失,而对于setup的违例,也就是建立时间的违例,我们在综合后,布局布线前是要全部修复并且留出足够裕量的,不然到后端步骤的时候,setup是比hold难修复很多的。

第三步、产生并分析时序报告 #

使用 check_timing 命令检查设计中是否有路径没有被约束:

pt_shell> check_timing

如果存在未约束路径,工具会报告相关警告或错误。需要确保设计中所有的路径均已设置约束。

使用 report_clock 命令检查时钟是否设置正确:

pt_shell> report_clock

验证时钟的定义是否正确,包括时钟名、周期、占空比等信息。

使用 report_qor 命令查看整体综合后的质量总结:

pt_shell> report_qor

提供有关时序、面积和功耗等关键性能指标的统计信息,方便设计者评估设计质量。

report_timing 命令查看具体的 Setup/Hold 时序信息:

pt_shell> report_timing

分析时序路径,检查是否存在 Setup 或 Hold 违例。

第四步、时序修复 #

时序修复的目标是修复设计中的 Setup 或 Hold 时序违例,确保时序闭合。 使用 fix_eco_timing 命令修复 Setup 时序违例 fix_eco_timing 是 PrimeTime 提供的一种自动修复时序违例的命令,可通过优化路径实现时序闭合。 命令格式:

pt_shell> fix_eco_timing -type setup -v

使用 `fix_eco_timing`` 命令修复 Hold 时序违例 Hold 时序违例可以通过同样的命令进行修复。

pt_shell> fix_eco_timing -type hold -v

我们在DC综合后的时序分析环节要确保所有的setup违例都修复

第五步、产生sdf文件 #

当所有的违例都修复之后,我们可以输出sdf文件

SDF 文件包含延迟数据(包括路径延迟、边沿延迟等),通常用于静态时序分析和仿真工具中,我们一般在后仿中会读入SDF文件,让波形带上延迟信息,进行进一步验证

pt_shell> write_sdf xxx.sdf

生成标准延迟格式(Standard Delay Format, SDF)文件,用于后续的静态时序分析或仿真。