静态时序分析笔记
11 Aug 2024 15667字 53分 次 STA打赏作者 CC BY 4.0 (除特别声明或转载文章外)
1 前言
本文是《Static Timing Analysis for Nanometer Designs A Pravtical Approach》一书以及涉及到的概念的笔记。
2 基础概念
2.1 传播延迟(Propagation Delay)
通过设置输入/输出的上升/下降沿的阈值点来计算传播延迟。比如用以下四个变量来定义的点:
下图表明传播延迟是如何根据这四个点计算的:
- :输出下降沿延迟
- :输出上升沿延迟
2.2 转换率(Slew Rate)与转换时间(Transition Time)
转换率和转换时间互为倒数。
转换率通过以下四个上升/下降沿的阈值来计算:
下图表明转换时间根据这四个点的计算:
- :下降沿转换时间
- :上升沿转换时间
2.3 时钟延迟(clock latency)
指从时钟源到终点所花费的总时间。时钟源通常是定义时钟的节点,比如PLL的输出端口。终点通常是同步元件(例如触发器)的时钟引脚。
2.4 偏移(Skew)、抖动(Jitter)与不确定性(Uncertainty)
偏移是指2个或多个信号(data或clock)之间的时序之差的最大值。
抖动是指信号在两个不同周期之间存在的差值。时钟抖动是在在时钟发生器内部产生的,和晶振或PLL内部电路有关。
Uncertainty = Skew + Jitter + Margin。
2.5 时序弧(Timing Arc)
分类:
- 单元弧(Cell Arc),每个单元都有多个时序弧
- 组合逻辑单元:单元每个输入到每个输出都有时序弧
- 时序逻辑单元:
- 时钟输入引脚到输出引脚,例如CK到Q,为时序单元内部路径的传输延迟(Delay Arc)
- 时钟输入引脚到其他引脚,例如CK到D,用于setup、hold分析(Timing Check Arc)
- 线弧(Net Arc)
- 一个单元的输出到下一个单元的输入之间的路径,引起传输延迟
每个时序弧都有时序极性(Timing Sense):
- 正单调(Positive Unate):输入的极性变化导致输出极性的变化相同或不变,例如与门,或门
- 负单调(Negative Unate):输入的极性变化导致输出极性的变化相反或不变,例如与非门,或非门
- 非单调(Non Unate):输入的极性变化决定不了输出极性变化,也要取决于其它输入状态,例如异或门
2.6 最大和最小时序路径
逻辑通过几条不同的路径传播到终点,每条路径的传播时间被称为路径延迟(Path Delay),这包括该路径上cell和net的总延迟。延迟最大的叫最大路径(Max Path/Late Path),延迟最小的路径叫最小路径(Min Path/Early Path)。
2.7 建立、保持时间相关概念和计算
2.7.1 基础概念
- 启动时钟(Lauch Clock):传输到源寄存器的时钟。
- 锁存时钟(Latch Clock):传输到目的寄存器的时钟。
- 启动沿(Lauch Edge):源寄存器(前级寄存器)数据变化的时钟边沿,也是静态时序分析的起点。
- 锁存沿(Latch Edge):目的寄存器(后级寄存器)数据锁存的时钟边沿,也是静态时序分析的终点。
- 数据到达路径(data arrival path):数据在两个寄存器间传输的实际路径。
- 数据需求路径(data required path):数据在两个寄存器传输的理论所需时间的计算路径。
- 数据到达时间(Data Arrival Time):数据在两个寄存器间传输的实际传播时间,计算方法见2.9.4。
- 数据要求时间(Data Required Time):包含数据建立要求时间和数据保持要求时间,计算方法见2.9.4。
2.7.2 时序路径
时序路径的形态:
- 从输入端口到内部时序单元的路径:in2reg
- 从时序单元到时序单元的内部路径:reg2reg
- 从内部时序单元到输出端口的路径:reg2out
- 从输入端口到输出端口的路径:in2out
时序路径分段:
- 源时钟路径(Source Clock Path):从时钟源点(通常是input port)到源寄存器的clock pin的路径。
- 目的时钟路径(Destination Clock Path):从时钟源点到目的寄存器的clock pin的路径。
- 数据路径(Data Path):指数据传播的路径。从时序单元的时钟引脚或数据输入端口开始,到时序单元的数据输入引脚或一个数据输出端口结束。
2.7.3 建立、保持时间
建立保持时间是寄存器固有特性参数,时间长短由器件本身决定。
- 建立时间(Setup):在锁存时钟沿之前,即将被采样数据需要提前保持稳定的时间。
- 保持时间(Hold):在锁存时钟沿之后,已被采样数据需要继续保持稳定的时间。
- 建立关系(Setup Relationship):两个相邻的寄存器,其后级寄存器(目的寄存器)每次锁存的数据应是前级寄存器(源寄存器)上一个时钟周期锁存过的数据。
- 保持关系(Hold Relationship):实际上是同一个edge,也就是说目的寄存器的数据保持时间可能遭到源寄存器同一个时钟沿所传输数据的“侵犯”。(这里可以换一个说法,根据建立关系,需要保证launch clock下一次发射的数据不会过早到来而“侵犯”到本次latch clock的数据锁存。)
2.7.4 余量计算
数据到达时间(Data Arrival Time):数据在两个寄存器间传输的实际传播时间。
数据要求时间(Data Required Time):包含数据建立要求时间和数据保持要求时间。
建立时间裕量(Setup Slack):数据建立要求时间与数据到达时间的差。
建立余量为正时(数据到达时间要早于建立数据需求时间),满足时序要求。
保持时间裕量(Hold Slack):数据到达时间与数据保持要求时间的差。
保持余量为正时(下次数据到达时间要晚于保持数据需求时间),满足时序要求。由此可见,源寄存器与目的寄存器之间的数据传输延迟Tdata不能太短,延迟越短,slack越小。
2.8 时钟域(Clock Domain)
由同一个时钟驱动的触发器所在的区域为一个时钟域。
如果两个时钟域之间没有数据路径,则这两个时钟域相互独立。相反如果有数据路径跨时钟域,则必须确定这条路径是真还是假。
例如,一个两倍频时钟驱动的触发器发起数据,再由一倍频时钟驱动的触发器捕获数据,就是真实路径(real path)。如果设计人员将时钟同步器明确放置在两个时钟域之间,即使好像存在从一个时钟域到另一个时钟域的时序路径,但数据没有被约束要在一个时钟周期内通过同步器传播,因此这样的路径被称为伪路径(false path),因为是由时钟同步器来确保数据正确地跨时钟域传播。可以使用set_false_path命令指定时钟域之间的伪路径。分辨出哪些跨时钟域路径是真实的,哪些是伪路径,是时序验证工作的重要组成部分,这使得设计人员可以专注于验证真实的时序路径。
还有一种伪路径的例子。比如通过二选一MUX选择时钟源,虽然只有一个时钟域,却有两个时钟,而这两个时钟是互斥的,因为一次只有一个时钟处于有效状态,因此这两个时钟之间不存在时序路径。
2.9 工作条件
工作条件定义为工艺(Process)、电压(Voltage)和温度(Temperature)的组合,简称PVT。逻辑单元的延迟和互连走线的延迟是根据特定的PVT计算的。
3 标准单元库
标准单元库包含时序信息、单元面积、功能等信息。
3.1 引脚电容
单元的每个输入和输出都可以在引脚(pin)上指定电容。在大多数情况下,仅为单元输入引脚指定电容,而不为输出引脚指定电容,即大多数单元库中的输出引脚电容为0。
电容单位通常为皮法拉(pF),一般在库文件的开头指定。
3.2 时序建模
逻辑单元的时序模型(timing model)旨在为设计中的各种单元实例(instance)提供准确的时序信息。通常会从单元的详细电路仿真中获得时序模型,用以对单元工作时的实际情况进行建模,且需要为逻辑单元的每个时序弧都建立一个时序模型。
分为线性延迟模型和非线性延迟模型。
3.2.1 线性时序模型(linear delay model)
使用input transition time和output load capacitance两个参数的线性函数表示cell delay和output transition time。计算形式如下:
其中A、B、C为常数。 对于亚微米(submicron)技术,线性延迟模型在输入过渡时间和输出负载电容的范围内并不准确,因此,目前大多数单元库都使用更复杂的模型,例如非线性延迟模型。
3.2.2 非线性延迟模型(non-linear delay model)
非线性延迟模型通常是表格模型,被称为NLDM(Non-Linear Delay Model),用于延迟,输出压摆计算或其它时序检查。NLDM表格里提供了input transition time和output load capacitance的各种组合下的单元延迟。例如:
上述反相器的NLDM描述了输出引脚OUT的延迟信息。根据该表格,输入下降沿的input transition time为0.3ns且output load capacitance为0.16ps时,反相器的上升沿的延迟为0.1018ns。
NLDM模型不仅可以用于计算单元延迟,还可以用来计算输出引脚的过渡时间(Output transation time),即上表中的cell_rise变成了rise_transition,cell_fall变成了fall_transition。
如果输入过渡时间和输出电容无法与表格条目中的值对应,可以利用二维插值的方法得到。
3.3 时序模型——组合单元
以二输入的与门为例,可知该单元的两个timing arc均为positive_unate,且有以下四种延迟:
- A to Z output rise
- A to Z output fall
- B to Z output rise
- B to Z output fall
因此NLDM将会有四个表格模型用于指定延迟。
3.4 时序模型——时序单元
以下图所示的时序单元为例,考虑以下时序弧:
对于同步输入,例如D或SI、SE,有以下时序弧:
- Setup检查时序弧(rise and fall)
- Hold检查时序弧(rise and fall)
对于异步输入,例如CDN,有以下时序弧:
- Setup检查时序弧(rise and fall)
- Hold检查时序弧(rise and fall)
对于触发器的同步输出,比如Q或QN,有以下时序弧:
- CK到输出的传播延迟时序弧(上升和下降)
3.4.1 同步检查:Setup/Hold
Setup/Hold同步时序检查是为了确保数据正常的通过时序单元传播。概念见2.9.3。
一个时序单元的同步引脚的Setup/Hold约束通常用二维表来描述:
上面是相对于CK的上升沿,一个时序单元输入引脚D上的Setup/Hold时间约束。二维数组的索引是D和CK上的transation time。
其中rise_constraint表和fall_constraint表针对的是constrained_pin;timing_type指定了单元是上升沿触发还是下降沿触发。
上述例子中的一些hold time是负值,这是可接受的。这通常发生在当数据路径从触发器的引脚到内部的锁存点比对应的时钟路径长。所以hold time为负,意味着触发器的数据引脚可以先于时钟引脚变化,并怡然满足保持时间检查。(我理解触发器内部CK和D的路径差又把这个负值补偿到正值了)。
触发器的建立时间也可以是负值。这代表在触发器的引脚上,数据可以在时钟引脚变化后变化,却依然满足setup时间检查。
但setup和hold时间不能同时为负值。为了让setup和hold time检查一致,两者的和必须为正。因为建立时间必须发生在保持时间之前,建立时间加保持时间的时间宽度就是信号必须保持稳定的区间。
对于触发器,在扫描数据输入(Scan Data Input)引脚有负的保持时间是很有帮助的,这给了时钟偏移一定灵活性,在扫描模式下就不需要为了修复保持时间为例而插入大量的Buffer。
3.4.2 异步检查:Recovery/Removal
异步引脚,比如异步清除(Clear)或异步置位(Set)引脚可以覆盖单元的任何同步行为。当有一个异步引脚有效时,输出是由异步引脚控制的。当异步引脚为无效,时钟的有效沿开始在数据输入端所存。异步的Recovery/Removal约束检查确保异步引脚在下一个有效时钟沿之前确定恢复到无效状态。
- Recovery time:异步引脚被设置为无效后们再下一个有效时钟沿之前需要保持稳定的最短时间
- Removal time:异步引脚可以被设置为无效前,在一个有效时钟沿之后需要保持有效的时间
除了同步和异步时序检查,还有一个检查来确保单元输入引脚的秒冲宽度满足最小要求。比如时钟引脚的脉冲宽度小于指定的最小值,时钟可能没有正确的所存数据。
3.4.3 传播延迟
时序单元的传播延迟时从时钟的有效沿到输出的上升或下降沿。这是非单调时序弧。下例时下降沿触发的触发器,从时钟引脚CKN到输出Q的传播延迟弧:
3.5 状态相关的时序模型
3.6 Black Box的接口时序模型
3.7 高级时序模型
3.8 功耗建模
3.9 单元库中的其它属性
面积规范,可以是该单元占据的真实的硅上面积,也可以是相对测量值:
功能规范,指定了引脚或引脚组的功能:
SDF条件属性支持标准延迟格式SDF(Standard Delay Format)文件的生成以及在反标(backannotation)期间的条件匹配。就像when条件指定用于时序分析的状态相关模型的条件一样,SDF标注(annotation)时状态相关时序的相应条件由sdf_cond来表示。
3.10 特征化和工作条件
PVT。
4 互联寄生参数
5 延迟计算
6 串扰和噪声
7 配置STA环境
STA只处理同步电路。
7.1 指定时钟
要指定时钟,需要提供以下信息:
使用create_clock指定的时钟为Master Clock。
同样需要对时钟误差进行估计:
还有时钟延迟(Clock Latency)。有两种时钟延迟:网络延迟(Network Latency)和源延迟(Source Latency)。
- Network Latency:时钟定义点到触发器时钟引脚的延迟,是在时钟树综合之前对时钟树延迟的估计,一旦时钟树构建完成,Network Latency就可以忽略(假设使用了set_propagated_clock命令)
- Source Latency:时钟源头到时钟定义点的延迟,可以是片上(PLL到clock source)也可以是片外延迟,时钟树构建完成依然存在
7.2 生成时钟
Generated Clock是从Master Clock派生出来的。例如二分频电路的输出端需要重新定义一个Generated Clock。
把CLKPDIV2定义为一个Generated Clock,可以与Master Clock在同一个时钟域,不需要进行额外的约束。对于Master Clock,时钟的源头在Master Clock的定义点;对于Generated Clock,时钟的源头也在Master Clock而不是Generated Clock。这意味着在timing report里,时钟路径的起点永远都是Master Clock的定义点。因此定义为Generated Clock的优势是能够自动把源延迟计算进来。
下面的例子是生成时钟的频率比源时钟高:
7.2.1 MUX上的时钟
当MUX的输入端都有时钟时,没必要在输出端定义时钟。
如果Sel是常量,输出会自动得到正确传播的时钟。
如果Sel没有被约束,STA会使两个时钟都经过MUX传播。在这种情况下,STA可能会报告两个时钟之间的路径,这显然是不存在的(在设计的其他地方没有两个时钟之间的路径),这就需要设置False Path或指定两个时钟之间的互斥关系,进而避免报告不正确路径。
如果Sel不是静态的,在期间工作时可以改变,则需要对MUX的输入进行时钟门控检查没确保MUX输入端的时钟会按照MUX的Sel安全地切换。详见第十章。
7.2.2 时钟门控单元输出端上的主时钟
下图例子中时钟SYS_CLK被一个触发器的输出端门控。因为触发器的输出端不是静态的,处理这种情况的一个方法是在与门单元的输出端定义一个Generate Clock。
下图例子中,两个时钟输入进一个与门单元,如果与门单元的输入都是时钟,那就可以安全的在与 门单元的输出定义一个新的主时钟,因为很可能该单元的输出和任一输入时钟都没有相位关系。
在内部引脚创建时钟会影响路径延迟的计算,要求设计者手动计算源延迟。例如下图例子,生成了一个二分频时钟和两个有相位差的时钟。
下图的例子可以使用-edge_shift配合-edge使用,使相应的沿偏移,形成新的generated波形。它指定了沿列表中每个沿的偏移量(以时间为单位)。
沿列表中的沿排列必须是非降序排列,但是同一沿可以使用两次,进而实现时钟脉冲独立于源时钟的占空比。上面例子中的-edge_shift选项指明将源时钟的沿1移动Ons得到第1个沿,将源时钟的沿1移动5ns得到第2个沿,将源时钟的沿5移动Ons得到第3个沿。
7.2.3 使用invert选项生成时钟
下列例子使用invert选项来生成时钟。
7.2.4 生成时钟的延迟
生成时钟也可以被指定时钟延迟。同样包括两种时钟延迟:网络延迟(Network Latency)和源延迟(Source Latency)。一个生成时钟的总延迟包含以下三部分。
一个生成时钟可以以生成时钟作为它的源;一个生成时钟只能有一个源。
7.2.5 典型的生成时钟的场景
下图是一个典型的ASIC中时钟分配的场景。晶振(Oscillator)位于芯片外部,生成一个低频时钟(典型值为10~50MHz),该时钟被芯片上的PLL当作参考时钟生成一个高频低抖动(Low-Jitter)的时钟(典型值为200~800MHz)。这个PLL时钟输入到一个时钟分频逻辑,然后生成ASIC所需要的各种时钟。
在时钟分配的一些分支上,可以存在时钟门控单元(Clock Gate Cell),用来关闭设计中不活跃的时钟,节省功耗。PLL也可以在输出端连接一个MUX做Bypass。
在参考时钟进入芯片输入引进的地方会为参考时钟定义一个主时钟。第二个主时钟定义在PLL的输出端。PLL输出端的时钟和参考时钟没有相位关系,所以是两个主时钟,而不是主时钟和生成时钟。通常情况下,所有时钟分频器逻辑产生的时钟都被指定为是PLL输出端主时钟的生成时钟。
7.3 输入延迟
STA不能检查没有约束的路径上的任何时序,所以任何路径都应该被约束,才能被分析。也有例外,可以不约束不关心的逻辑的相关输入。
下图展示了DUA的一条输入路径。
在Launch Edge时刻开始,外部逻辑所用的延迟为,所以延迟约束在输入引脚INP1定义了外部延迟。在这个例子里,指定的延迟是相对于时钟CLKA的。
以上约束指定了在输入INP1的外部延迟是0.8ns,该延迟是相对于时钟CLKA的。如果CLKA的周期为2ns,引脚INP1的逻辑在设计内部可用的传播时间为2-0.8=1.2ns。这就意味着Tcomb2+Tsetup必须小于1.2ns,这样触发器UFF1才可以可靠的捕获外部寄存器UFF0发射出来的数据。
以上为指定外部延迟的最大值,如果同时考虑最大和最小延迟,则参考如下电路图和约束。
INPA的最大最小延迟分别对应着最坏情况(最大时序工艺角下的最长路径)和最佳情况(最小时序工艺角下的最短路径)。Tclk2q的最大和最小延迟分别为1.1ns和0.8ns,组合逻辑延迟Tcomb1最大和最小延迟为5.6ns和2.2ns,因此CLKP到INPA的最大和最小延迟为6.7ns和3ns。在INPA上的波形可以看出数据到达设计输入并且期望保持稳定的时间窗口。因此,考虑到外部延迟,设计内部的可用建立时间的最小值是15ns-6.7ns,最大值是15ns-3ns。
还有一些其他例子:
7.4 输出延迟
先看只指定最大延迟的例子。
Tcomb1和Tcomb2是经过组合逻辑的延迟,时钟CLKQ的周期定义了从触发器UFF0到UFF1的总可用时间。外部逻辑的延迟是Tcomb2+Tsetup,指定为输出延迟约束的一部分。数据必须及时到达外部触发器UFF1,以满足建立时间要求。
下面是有最大和最小延迟的例子。最大路径延迟为7.4ns,最小延迟路径为-0.2ns。
![img23][img23]
输出约束如下:
下列是结合输入延迟约束的列子。
7.5 时序路径组
设计中的时序路径可以被当做路径的集合。每条路径都有起点和终点。STA中的路径是依据有效起点和终点来记录的。有效起点包括输入端口、同步器件(FF、MEM)的时钟引脚。有效终点包括输出端口、同步器件的数据输入引脚。因此一条有效的时序路径可以是:
- 输入端口到输出端口
- 从输入端口到触发器或存储器的输入
- 从触发器或存储器的时钟引脚到触发器或存储器的输入
- 从触发器或存储器的时钟引脚到输出端口
时序路径可以根据路径终点相关的时钟被分为不同的路径组(Path Group),所以每个时钟都有一组和它相关的路径。也会有默认路径组,它包括了所有异步路径。
7.6 外部属性建模
之前的约束足够约束芯片内部的所有路径并进行时序分析,但还不够得到IO引脚的精确时序,因此需要以下命令精确建模设计的环境。
7.6.1 驱动能力建模
命令set_drive和set_driving_cell是用来对外部资源的驱动能力建模,如果没有这些约束,默认所有的输入假设拥有无限的驱动力,意味着输入引脚的转换时间为0。
set_drive在DUA的输入引脚明确指定了驱动电阻的值
8 时序验证
9 接口分析
[img23]: [img24]: [img25]: [img26]: [img27]: