马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
1 静态时序分析基本概念1.1 概述静态时序分析即static timing analysis(STA),简单定义:套用特定的时序模型(timing model),针对特定电路分析其是否违反设计者给定的时序限制(即时序约束),对数字电路的时序进行计算、预计的工作流程,该流程不需要通过输入激励的方式进行仿真。静态时序分析因为不需要仿真,就能够保证数字电路的设计时序,非常方便,在一些大型的芯片系统中,如果要通过后仿真来保证时序的话,仿真工作量太多,时间成本过高,所以都是通过静态时序分析+形式验证来保证了数字电路的时序,确保数字系统没有出现时序问题,这种方式就要求静态时序分析的约束非常到位,每个test point都要覆盖,不覆盖的,要确保原因,通过coverage report来一一分析每个test point。静态时序分析的主要目的是确保数字电路在给定的工作条件(如电源电压、温度、工艺角等)下,满足时序要求。它通过遍历电路中存在的所有时序路径,计算信号在这些路径上的传播延时,并检查信号的建立和保持时间是否满足约束要求。 本质:满足每个寄存器的建立时间和保持时间
关键路径:时序路径中最长的一条,决定系统的最快工作速度1.2 建立时间和保持时间建立时间(Tsu):时钟有效沿到来之前数据必须保持稳定的最小时间; 保持时间(Th):时钟有效沿到来之后数据必须保持稳定的最小时间。
1.2.1 发射沿和锁存沿发射沿(launch edge):源寄存器(前级寄存器)数据变化的时钟边沿,也是静态时序分析的起点; 锁存沿(latch edge):目的寄存器(后级寄存器)数据锁存的时钟边沿,也是静态时序分析的终点。 如下图:
通常来说,Latch Edge 比 Launch Edge 晚一个时钟周期(Tclk),即它们之间通常是相差一个时钟周期的关系。 1.2.2 数据到达时间数据到达时间(Data Arrival Time):输入数据在有效时钟后到达所需要的时间,主要分为三个部分:时钟到达寄存器时间(Tclk1)、寄存器输出延时(Tco)和数据传输延时(Tdata)。
如上图,数据到达时间计算公式如下: Data Arrival Time = Launch Edge+Tclk1+Tco+Tdata 1.2.3 时钟到达时间(锁存)时钟到达时间(Clock Arrival Time):锁存时钟从latch edge到达目的寄存器(destination register)输入端所用的时间。
如上图,时钟到达时间计算公式如下: Clock Arrival Time = Latch Edge+Tclk2 1.2.4 数据需求时间以下情况分别不考虑建立不定态(Setup Uncertainty)和保持不定态(Hold Uncertainty),这里uncertainty主要是指时钟抖动(clock jitter)。建立(Setup)数据需求时间:
计算公式如下: (Setup) Data Required Time = Clock Arrival Time −Tsu = Latch Edge + Tclk2 −Tsu 保持(Hold)数据需求时间
计算公式如下: (Hold) Data Required Time=Clock Arrival Time +Th = Latch Edge + Tclk2 +Th 1.2.5 建立关系与保持关系建立关系(Setup Relationship):对于两个相邻的寄存器,后一级(目的)寄存器每次锁存(latch)的数据应该是前一级(源)寄存器上一个时钟周期锁存过的数据。 保持关系(Hold Relationship):实际上是同一个edge,也就是说目的寄存器的数据保持时间可能遭到源寄存器同一个时钟沿所传输数据的“侵犯”。(这里可以换一个说法,根据建立关系,需要保证launch clock下一次发射的数据不会过早到来而“侵犯”到本次latch clock的数据锁存。)
1.2.6 建立余量和保持余量建立余量(Setup Slack) = 建立(Setup)数据需求时间 - 数据到达时间(Data Arrival Time)
计算公式如下: Setup Slack = (Setup) Data Required Time − Data Arrival Time (Setup) Data Required Time = Latch Edge + Tclk2 − Tsu Data Arrival Time = Launch Edge + Tclk1 + Tco + Tdata 若考虑 Latch Edge − Launch Edge = T Tskew = Tclk2 − Tclk1 = 0 建立余量可以化简为: Setup Slack = T − Tsu − Tco − Tdata 当Setup Slack>0,即建立余量为正时(数据到达时间要早于建立数据需求时间),满足时序要求。由此可见,源寄存器与目的寄存器之间的数据传输延迟Tdata不能太长,延迟越长,slack越小。保持余量(Hold Slack) = 数据到达时间(Data Arrival Time)- 保持(Hold)数据需求时间
计算公式如下: Hold Slack = (Next) Data Arrival Time − (Hold) Data Required Time (Next) Data Arrival Time = Next Launch Edge + Tclk1 + Tco + Tdata (Hold) Data Required Time = Latch Edge + Tclk2 + Th 若考虑 Next Latch Edge =Latch Edge Tskew = Tclk2 − Tclk1 = 0 建立余量可以化简为: Hold Slack = Tco + Tdata − Th 当HoldSlack>0,即保持余量为正时(下次数据到达时间要晚于保持数据需求时间),满足时序要求。由此可见,源寄存器与目的寄存器之间的数据传输延迟Tdata不能太短,延迟越短,slack越小。 1.3 分析方法以分析的方式区分,可分为path_based和block_based两种。DC就是基于path_based的。 时序路径(Timing path)可分为一下四类: (1)输入到寄存器的路径 (2)寄存器到输出的路径 (3)输入直接到输出全组合逻辑的路径 (4)寄存器到寄存器之间的路径
其实所有时序路径都可以归为第4类来进行时序分析。 (1)可认为外部寄存器时钟输出到Q经过延时到达寄存器D端的延时 (2)可认为芯片寄存器Q端经过延时到达外部寄存器D端的延时 (3)设置了max_delay就认为是片外两个寄存器之间的路径延时已经设置不能超过这个数值也就是所谓的周期。 2 时序约束2.1 概述主要包括了周期约束、偏移约束和静态路径约束。通过附加约束条件,可以使综合布线工具调整映射和布局布线过程,使设计达到时序要求。 周期约束就通过创建时钟进行,偏移约束就设定input_delay和output_delay,静态路径约束就设计max_delay。也就是对上述的4中路径类型进行约束,就可以达到时序分析的目的。 2.2 Clock相关概念clock需要明确一点,clock由于受到工艺影响,存在不稳定的波动。 而时钟有下面几个基本概念: 2.2.1 时钟树(clock tree)时钟树,是个由许多缓冲单元(buffer cell)平衡搭建的网状结构,它有一个源点,一般是时钟输入端(clock input port),也有可能是design内部某一个单元输出脚(cell output pin),然后就是由一级一级的缓冲单元搭建而成,具体的多少级,根据你的设置以及所使用的单元而定,目的就是使所有终点的clock skew(一般最关心这个)、insertion delay以及transition,满足设计要求。
2.2.2 时钟偏斜(clock skew)和时钟抖动(clock jitter)时钟偏斜(clock skew):指时钟信号到达不同时钟树终点的时间差,即时钟分支信号在到达寄存器的时钟端口过程中,会存在延时,由于延时的存在,到达不同寄存器时钟端口的时钟信号存在有相位差,也就是无法保证所有寄存器时钟端口的时钟边沿对齐 时钟抖动(clock jitter):指两个不同时钟周期之间存在的差值,这个误差是在时钟发生器内部产生的,和晶振或者PLL内部电路有关。所有时钟都有一定抖动量:相对于理想时钟沿,实际时钟存在不随时间积累的、时而超前、时而滞后的偏移
2.2.3 时钟延时时钟从时钟源出发到达触发器时钟端的延时。包括:时钟源延时(source latency)和时钟网络延时(network latency) 时钟源延迟:也称为插入延迟,是时钟信号从其实际原点到设计中时钟的定义点的传输时间。 时钟网络延迟:是时钟信号从其定义点到寄存器时钟引脚的传输时间。
2.3 约束准则周期约束就为时钟约束,因为每个系统都会有恒定的时钟周期,这根据系统方案确定。 静态路径约束即max_delay,这是因为有些路径可能是纯逻辑路径,这时就需要加入max_delay进行约束,避免逻辑延时太长。 那么为什么也要设置input_delay和outpu_delay? 因为如果不设置input_delay和outpu_delay,那么工具并不知道外部端口信息(主要指数模接口信号)的,并不认为这条路径是时序路径,也就是说工具并不会分析这条path。由于大多数信号跟芯片内部都是需要有数据交互的,所以必须通过设置input_delay和output_delay的方式告诉工具此处的timing信息,这样才能保证交互的信号能够正确被芯片内外正确采样和输出,从而保证芯片工作正常。 当然如果设置了load和driver信息,工具同样能够识别外部端口的相关信息,进行时序分析。但是进行input_delay和out_delay更为准确直观。 当然有些特殊的信号,如果在芯片启动后就保持为稳定的常值信号,那么实际上是不需要对这些信号进行时序分析的,这些信号就可以忽略input_delay或output_delay的约束。 2.4 约束技术2.4.1 基本概述主要讲述input_delay和out_delay的约束技术。 对于ingput_delay和output_delay关键是理解下面两句话的定义: set_input_delay是指该输入信号是在时钟沿后多长时间到达模块的port上的。
相当于芯片外部寄存器Q端输入到内部寄存器D端的时序为: Tlogic+Tinput_delay+Tsetup<=Tclk。设定的intput_delay,Tsetup和Tclk为固定,那么工具只能优化Tlogic。 set_output_delay是指该输出信号在后级模块中需要在时钟沿之前提前多长时间准备好。
相当于芯片内部寄存器Q端输入到外部寄存器D端时序为: Tlogic+Toutput_delay+Tsetup<=Tclk。设定的output_delay,Tsetup和Tclk为固定,那么工具只能优化Tlogic。 2.4.2 定义输入延时的最大值和最小值
对于input_delay,设置Max值,主要用于setup分析,为了保证时序,进行悲观约束,可以尽量优化内部时序,让外部时序例如模拟端电路可以更为宽松,但是缺点可能会造成面积偏大或者时序优化不过。 设置min值,主要用于hold分析,是为了保证内部时序的hold time,如果约束过小,可能会导致接口处出现比较多的hold volation,在auto_fix_hold的情况下,工具就会自动在接口处插入buffer,满足芯片内部的hold time,但是实际上模拟接口过来的延时并不会完全为0,所以插入的这些buffer可能是多余的,浪费面积。 2.4.3 定义输出延时的最大值和最小值
对于out_delay,设置Max值,同样是为了保证时序,进行悲观约束,可以尽量优化内部时序,让外部时序例如模拟端电路可以更为宽松,但是缺点可能会造成面积偏大或者时序优化不过。 设置min值,主要用于hold分析,是为了保证外部时序的hold time,如果约束过大,可能会导致外部时序不满足hold time;不过如果约束过小,在auto_fix_hold的情况下,工具就会自动在接口处插入buffer,满足芯片内部的hold time,这时可能会额外多插入比较大的buffer,所以一般会设置一个较小的值就行了。 注意,在设置的input_delay和output_delay时,约束的clock,要跟信号所在的时钟域设置为同一时钟,不同时钟的话会则为异步了。 3 环境约束3.1 驱动强度和电容负载除了上面的input_delay,output_delay,还要指定驱动强度、电容负载这些约束,input drive和output load,这些是为了更准确的模拟出真实电容的时序。 因为input_delay,output_delay约束只是描述了reg2reg input output path多少延时是可行的,但是并没有详细描述在什么样的条件下这些delay必须满足。 门的延时是input transition和output load的函数,默认DC工具对于output port声明理想的负载(zero),对于input port声明也是理想的transition time(zero),这会导致比较乐观的path timing,不符合实际情况。 因为输入端口(模拟端电路信号)对芯片内部第1级单元进行驱动,并不是无限大的驱动能力的,就会有上升和下降转换时间,不同负载就会有不同的电平转换时间。同理,输出端口驱动芯片外部,输出电容负载的大小就会影响到transition time。 set_drive是指input端口的驱动能力,设置的值会影响端口到第1级单元的net的transition,从而影响内部路径的延时。 set_load是指output端口的负载,设置的值会影响输出到端口的net上的电容,从而影响相应路径延时。 为了更加精确的path timing必须对input drive和output load做精确的建模。 这些数值理论上都需要模拟端给出相对准确的数值。 3.2 设置输入输入驱动默认情况下,DC工具假设端口上的transition time为0,或驱动无穷大。 set_input_transition或set_driver_cell,可以二选一。 set_input_transition是指定确定的transition time的值。 set_driver_cell命令明确说明输入端口由一个真实的外部单元驱动,可通过库中的单元信息估算transition time;当然也可以直接set_drive(以电阻值为计量) 3.3 设置电容负载默认情况下,DC工具假设端口上的外部电容负载为0。 通过用load_of选项明确说明电容负载的值为工艺库中某一单元引脚的负载(一般是选择输入引脚),或可以使用set_load指定电容负载为某些常值。 如果输入输出电容结构都不知道的情况下,如何做这些设置呢? Input_drive设置比较小的drive_cell,比如一个BUFX1 Output_load设置一个比较大的负载,比较一个较大的BUFX6/A
4 False_path4.1 什么是false_path1、从逻辑上考虑,与电路正常工作不相关的那些路径。比如测试逻辑,静态或准静态逻辑,又或者有逻辑关系存在,但实际工作不会有数据通路的那些路径。 2、从时序上考虑,在综合时不需要分析的那些路径。比如异步时钟域的路径 反正就是不希望综合工具对这些路径进行时序分析的路径,都可以称为false path 4.2 哪些路径可能是false_path1、跨时钟信号通过寄存器打两拍保持异步信号同步的路径。 2、上电只写一次的寄存器路径;或者上电默认就是固定电平的信号通过的路径。 3、不同工作模式。 4.3 添加false_path的理由减小布线时间:设置false_path后,工具就不会在该路径进行时序检查和优化,就会将主要精力放在关键路径布局布线。 提高QOR(quality of result):提高综合、布局布线和实现的质量。 综合工具也会主要精力和面积用于关键路径的优化,使得面积有很大优化和后续的时序有很大保证。 5 Multi_cycle_path5.1 什么是multi_cycle_path多周期路径multi_cycle_path:在一些特殊情况,组合逻辑的传输延时超过了一个时钟周期,则这条组合逻辑路径被视为多周期路径,multi_cycle_path。对于多周期路径,进行时序分析时,需要在脚本文件中对这部分设计设置多周期路径约束。5.2 setup time检查Setup检查时,capture edge在5个时钟周期。 5.3 Hold time检查通常情况下,hold检查默认在setup检查的前一个时钟周期的上升沿。但是对于多周期路径而言,如果在此处检查,则对数据特别严格,很容易出现violation且不符合常理要求。因为hold检查的是延时最小的时间,所以在进行多周期路径hold time检查时,需要在默认的hold检查边沿再向前移动4个时钟边沿。 在多周期路径,对于setup time,一定要自己检查设定的周期数N,然后一定要给hold time检查设置为N-1个周期,这样才能保证setup和hold是比较合理的。
6 时序报告分析当出现时序不满足的情况下,可以从下面几点入手分析: 1、大的延时和大的转换时间(high fanout & large transition) 当发现slack为负时,要检查线网上有没有很大的延时和很大的转换时间,如果有,那么可能是以下原因引起的: a : 高扇出 b:long nets:长连线---需要插入buffer来解决较长的连线 c:long strength cells :低驱动cell。有些可能是set_dont_touch的cell导致。 2、memory path :memory输出口,这种一般是IP固定比较大的setup time。 如上设置的multi_cycle_path,就是IP MTP 数据输出有很大的延时,远大于时钟周期,所以就设置多周期路径,要不然时序分析肯定不满足的。 3、路径没有优化 STA违例可能出现在没有优化的路径,可通过检查数据路径来检查这种情形。单元是否有很大的延时?可不可以手动优化这些数据路径?单元是不是被dont_use或dont_touch? 4、路径仍然不满足时序 如果路径有很强的单元驱动但还是不满足时序,那么可以尝试检查是否有延时和线负载大的引脚。把单元放置近一些可能就会使延时变小一点,或者加入buffer减小线延时。 5、检查clock_skew以及clock级数的值是否合理,违例是否使由skew引起 项目中有些拿时钟来做运算的,这些就导致后端时钟树布出来的级数会有异常,导致violation出现。 6、注意在buffer上的大的延时,这一般是由非法的负载引起的,很大的负载(跟高扇出类似) 7、检查是否input delay和output delay设置是否合理;检查SDC约束是否合理 8、是否由负载的逻辑门存在,即cell_delay+net_delay > 1 period9、是否存在不合法的路径,异步时钟;或不可能同时工作的路径,这些路径检查后可设置false_path 10、是否存在离散clock gating(latch+and搭建),如果存在离散的clock gating,没有将两者靠近布局布线,易引发hold问题;
|