什么是STA?
静态时序分析(Static Timing Analysis):是分析、调试并确认一个门级系统设计时序性能的方法。检验门级电路的最大延迟,以保证在指定的频率下,能否满足建立时间的要求;检验门级电路的最小延迟,以保证在指定的频率下,能否满足保持时间的要求。
STA需要检查哪些东西:检查sequential cell的setup/hold是否满足要求;检查Async Reset/Set recovery/removal是否满足要求;检查一个短脉冲,是否能被后续电路检测到;Clock gate setup/hold;
还包括计算design是否满足DRC(Design Rule Check)的要求:电路的最大电容不能超过设置的最大电容(capacitance)、电路的翻转时间(transition)不能超过设置的最大值,电路的扇出(fanout)不能超过最大值。
STA要检查很多内容:包括DFF的setup hold check、ARST check、pulse check、clock gate
check等。
DFF setup/hold
在时钟上升沿到来的时候,为了保证数据能确确实实的被采到,时钟对数据有建立时间(set up time)和保持时间(hold time)要求。CK to Q 的时间比 hold 时间长,就不会出现Metastable(亚稳态),如果出现 setup hold 不满足需求,那么就会出现 Metastable。
ARST check
包括在复位的时候,复位信号从0到1的时候,如果和时钟挨的太近,就会出现Metastable,时钟上升沿那个时刻,不确定采ARST的值为0还是为1,在上面图里ARST信号的recovery check Violation,所以时序不满足要求。
复位信号(低电平有效)时序检查,只检查上升沿,因为如果上升沿出现Metastable,可能会导致各个寄存器进入工作状态的时间不一致,有些寄存器开始工作了,有些寄存器还抓着ARST的低电平信号没进入工作状态,所以这种情况一定要进行时序检查,但是ARST下降的时候不用检查,因为哪怕违例了,你要所有寄存器复位,只有一部分复位还有一部分在工作状态,一部分先进入复位状态一部分后进入复位状态,不关先后最后都会进入复位状态,不会影响功能结果。
Signal pulse check
信号脉冲的宽度也要check timing,要检查信号持续一段时间的长度够不够,比如上面提到的复位信号,如果复位信号拉低的时间不够久,那么就有可能复位失败。
如果clk gate发生violation,比如clk_en在clk的下降沿才拉高,这样组合逻辑或门的输出clk_gate就会先低后高,产生一个非常短的毛刺,这就不行了,所以这里就要求clk_en在上升沿后面一点点,在下降沿前面一点点,这样就不会clk gate violation。
具体分析时序之前,先讲一讲产生时序问题的来源到底和什么有关(延迟)
综合 (synthesis):根据RTL设计和cell library,把RTL代码映射到最基本的门级cells,根据STA的timing constraints,尽量保证映射后的gate level design满足timing constraints。尽量把设计的面积和功耗优化到最小(优化面积和功耗,综合工具有很多cell可以选择,比如加法器就有行波进位和超前进位加法器,DC工具有很多选择,具体选择什么根据你的设计和约束来综合) ,已经尽量修复DRC violation(最大电容、最大扇出等),尽量让门级的congestion最小(增加线路密度,减小芯片面积)。
综合会涉及到一个工艺库的概念,不同的工艺综合出来的门电路的面积和延时都会不一样
cell library简介
各种工艺的library至少会提供三种library,slow/typical/fast三种,在slow工艺下主要关注setup分析,因为信号比较慢,容易setup violation,而在fast的时候主要关注hold的violation。现在的先进工艺还会提供不同的Vt工艺的cell library,分为:LVT、RVT、SVT( Standard V threshold )、HVT ( High V threshold ) 在每个VT下也至少会给出三种opration conor。不同的VT工艺下器件的delay是不同的LVT的器件delay是很小的,阈值电压越低,因为饱和电流变小,所以速度性能越高;但是因为漏电流会变大,因此功耗会越大。速度大小按快到慢依次排列为SLVT, LVT, RVT, HVT。 功耗大小却正好相反。(不要觉得是工艺部分自己就可以不用看了,在修复set up/hold violation的时候,就可以通过改变器件工艺角的方式来修复,所以需要知道LVT、RVT、HVT各自的区别)
如果用RVT的工艺角做了一块芯片最高跑到380M频率,而我们想让他跑到400M,那么就可以用更快速的LVT工艺的器件,替换一些critical path 上的器件,这样就能让电路整体的频率高一点,对应的也会牺牲一些功耗的代价。HVT什么时候用呢,在那些delay很小不是critical path的路径上把RVT的一些器件换成HVT的,在不影响电路速度的情况下就可以降低功耗。
对于一个cell的延迟,它延迟具体取多少,在cell library里是有具体设置显示的,并且他的查找方式是通过查找表的形式来的。
DRC在检查DC里面max capacitance和max loading 的设置时,最大值不能超过类似上面表的cell library规定的最大值。
时钟特性
同步时钟是能够明确定义多个时钟间如下关系的时钟:
① 时钟频率
② 时钟高低电平的持续时间(duty cycle)
③ 各个时钟的相位(waveform)
④ 时钟的input latency
异步时钟:不能明确定义多个时钟间以上关系的时钟源。
clock有很多参数,频率、占空比等,这里介绍一下和时钟有关的参数。
clock period (时钟周期):芯片上的时钟为了准确,一般都是由晶振生成。
clock jitter :就是指两个时钟周期之间存在的差值,这个误差是在时钟发生器内部产生的,和晶振或者PLL内部电路有关,布线对其没有影响。,这个一般问题不大,因为产生jitter的是晶振,可能晶振这个时钟周期为100ns,下一个时钟周期为101ns,产生了1ns的jitter,但是这也不会对时序有很大的影响,因为晶振是时钟树的源头,寄存器A有jitter,寄存器B也有jitter,大家都有clock jitter。
duty cycle :占空比,高电平占整个时钟周期的比例。
transition time:时钟的翻转不是直上直下的,其实有一个传输延时,传输延时定义是从时钟的10%~90%所花的时间(上升传输延时)和从时钟的90%~10%所花的时间(下降传输延时)。
phase 相位:第一个上升沿和第一个下降沿的位置,相对于零时刻的时间。
input latency:输入终点相对于时钟源头的延迟,latency,(走线导致的延时)
clock skew:clock tree 到不同的寄存器的距离是不同的,因为这些距离的不同到达寄存器的时间也不同,同一个时钟的同一个沿,到达不同寄存器的时间差异称为clock skew。
clock uncertainty:clock jitter + pessimistic (悲观量)
在SDC里创建一个时钟(用Tcl脚本写的)
port:顶层设计的端口
pin:input/output of a cell(not the top design)
STA Timing Path:① 输入到寄存器 ② 寄存器到输出 ③ 寄存器到寄存器 ④ 输入到输出
STA Start/End Points
Start Points:input ports、Clock pins of sequential cells(clocks)
End Points:output ports、Data pins of sequential cells、Clock pins of sequential cells(clocks)
set up check
如果有两个寄存器相连,set up 满足要求的条件是:前一个寄存器在clock 第一个上升沿发出的数据,能被后一个寄存器在第二个上升沿抓到(如果不能被第二个上升沿抓到,那就是delay太大了)。
hold check
如果有两个寄存器相连,hold满足要求的条件是:前一个寄存器在clock 第一个上升沿发出的数据,不能被后一个寄存器在第一个上升沿抓到(如果被第一个上升沿抓到,那就是delay太小了,数据很快就到第二个寄存器了)。
setup check 计算
如图所示的紫色路径数据从clk端,到达寄存器C的D端所需要的时间为:
data_arrive_time = clk_latency + clk_path1_delay + ck_to_q + logic_delay;
数据到达时间为时钟的延迟、时钟从外部到clk端的路径延迟、从clk端到数据输出有一个延迟、再加上组合逻辑延迟。
相应的寄存器C还有一个数据要求时间,如果数据延迟小于require那就没问题,如果大于require(数据来晚了)就会出现setup violation。
data_require_time = clk_period+clk_latency + clk_path2_delay - dff_set_up - clk_uncertainty;
数据需求时间:加一个时钟周期,因为C要求的数据是上一个周期的数据。
综合工具就会进行setup check:
setup_slack = data_require_time - data_arrive_time
if( setup_slack >= 0)
setup meet;
else
setup violated;
因为你数据到达的时间必须小于数据需求时间,也就是数据要在下一个时钟沿抓数据之前到达下一个寄存器且满足下一个寄存器的setup要求。
hold check 计算
data_arrive_time = clk_latency + clk_path1_delay + ck_to_q + logic_delay;
数据到达时间为时钟的延迟、时钟从外部到clk端的路径延迟、从clk端到数据输出有一个延迟、再加上组合逻辑延迟。
hold check的是寄存器C不能再当前时钟上升沿抓到寄存器B当前时钟上升沿的数据。
data_require_time = clk_latency + clk_path2_delay + dff_hold + clk_uncertainty;
综合工具会进行hold check:
hold_slack = data_arrive_time - data_required_time
if( hold_slack > = 0 )
hold meet;
else
hold violated;
数据到达时间要比数据要求时间长,因为是同一个时钟的数据,数据不能到的太快,不能在同一个时钟沿被后一个寄存器抓到,数据实际的到达时间要在窗口之后,不能被同一个时钟沿抓到。
setup check的时候,要走一个组合逻辑路径比较长的路径,这样容易setup violation,hold check的时候,要走一个组合逻辑路径比较短的路径,这样容易hold violation,就是在两种check阶段都要考虑最坏情况。
上面讲的setup check和hold check 针对的是来自同一个时钟的check,如果两个寄存器的时钟来源于两个不同的时钟源
对于setup check 还是用他的含义去理解,A寄存器在一个时钟沿的数据,在B寄存器的一个时钟沿抓到,但是两个时钟是异步时钟,不确定相位,所以综合工具就会找两个时钟相距最近(这里最近是找waveform波形最近的地方)的地方去做check。
异步时钟的STA分析里的hold分析,取setup check point 前一个上升沿作为hold check point,hold间隔最近的地方做hold check,如下图:
setup hold都会去找最差的情况去做check。
两个不同源的时钟,我们不希望他去分析STA,就可以下false_path,因为很多这样的violation是假的violation,我们不希望花很多的算力优化这些不会出错的地方上,就可以下false_path。
下约束的TCL,创建一个时钟:
下 input_delay:
input_delay 下的是外部信号的delay,内部还有的裕量是clock_period - input_delay,一般在逻辑的顶层,下的外部逻辑的delay。比如:
set_input_delay -clock CLK $dly [get_ports D]
下 output_delay也是一样
对于input_delay和output_delay都可以下最大值和最小值的delay constraint。最大值用于setup分析,最小值用于hold分析。
set_input_delay
例如给输入下最大6ns延迟和最小2ns延迟
看第二个时钟上升沿,在第二个时钟上升沿过了2ns后数据开始不稳定,因为clock delay最快是2ns,过了6ns后数据就稳定了,因为时钟最大delay是6ns,超过这个6ns后,数据就稳定了。
如果没有分别设置 max数值和min数值,那么综合工具就默认两个数值相同。
set_output_delay ,是设置端口外部的delay,所以留给内部的delay就只有T-$delay,当然这里注意:约束的output_delay也可以是负数,负数的意思就是,模块内部连接到外部部分的delay,必须大于这个负数的绝对值,比如:
set_output_delay -clock CLK -min -3 [get_ports OUT]
设置了output_delay是负数,那么你内部逻辑到output的delay必须大于3ns,这样,内部delay+外部delay > 0 才合理。可以理解为外部接了一个寄存器,然后寄存器的hold是3ns,在同一个时钟沿,前一个寄存器在该时钟沿的数据不能被后一个寄存器抓到,所以数据到后一个寄存器的delay必须大于该寄存器的hold time,否则就出现hold violation。设置外部delay为负数,其实目的是为了约束内部delay 必须大于这个负数的绝对值。
set_false_path
如果我们下了这个路径,意思就是不让工具做STA分析,例如:
set_false_path -from A -to B
※A→B之间的路径不check timing;但是B→A之间的路径仍需要进行check timing。
set_multicycle_path
如果数据持续两个周期,也就是setup分析的时候,前一个寄存器第一个时钟上升沿的数据可以被后一个寄存器第三个时钟上升沿抓到,不希望setup分析按默认的来,那就下set_multicycle_path,例如:
set_multicycle_path 2 -setup -from A -to B;
set_multicycle_path 1 -hold -from A -to B;
一般来说,如果用set_multicycle_path,setup约束和hold约束往往成对出现。比如上面设置了setup延迟一个周期(set_multicycle_path 2),还设置hold提前一个周期(set_multicycle_path 1)。这意思就是,数据在第一个上升沿发出,能被下一个寄存器第三个上升沿抓到(setup满足),数据在第一个上升沿发出,不能被下一个寄存器同一个上升沿抓到(hold满足),如果set_multicycle_path 2 -hold -from A - to B 那就是 数据在第一个上升沿发出,不能被下一个寄存器第二个上升沿抓到(hold满足)。
高级STA概念
on-chip-Variation:OCV
同一个芯片,不同位置的cell的PVT不一致,在STA分析setup的时候,在计算data_arrive_time时,故意用延迟大一点的工艺,让数据延时变大,而在下一个寄存器的时钟路径上用延时小的工艺,即让setup更容易违例。
但是这种方式有些过于悲观,原本能跑很高频率的电路,给这样悲观的分析,跑了一个低频率,所以实际上一般都是在延迟的基础上加一个5%的悲观量,这个具体多少人为设定。
common-Path-Pessimism-Remove :CPPR
在共同的clock路径上,cell的delay是一样的。比如计算setup的时候走了一条clock path经过了一个buffer,计算下一个寄存器的data_require_time的时候走了另一条clock path也经过了这个buffer那么两条路径都经过了这个buffer,按照OCV,我们不可能给这个buffer同时用好的工艺和坏的工艺来做悲观,所以这种情况下就可以把这个共同路径上的cell设为同样的工艺,即同样delay。
STA算例1:
Setup路径计算,取最长的延时,最大的延时的路径要在第二个时钟沿前到来,且应满足setup需求(data_required 中减去setup时间,因为数据要在setup窗口之前到达)。
slack = 8.75ns,代表setup还有这么多的裕量。
Hold路径计算,数据到达时间要比hold窗口还慢,保证数据不能被同一个时钟沿采到
STA算例2:
计算data_require_time 再计算data_arrive_time 然后计算裕是否够。
第一题,求最大工作频率(setup 分析):
时钟频率影响的只有setup分析,之前在写路径的时候,setup的data_require_time里是有一个clock_period的,所以setup分析是与时钟频率有关的,且容易推断出时钟频率越快,越容易出现setup violation。
每个寄存器都得分析setup的裕量
对寄存器1 来说:
寄存器1 的data_arrive有两条路径,一条是从din直接到D端的Path1,另一条是从F2的Q端到D端Path2。
Path1 :0.5 + 2 = 2.5 ns(din + Tandgate)
Path2 :1 + 1 + 2 + 2 = 6ns (两个buffer+Tcq+Tandgate)
data_require = Tcycle + Tbuffer- Tsu = Tcycle + 1 - 3 = Tcycle - 2
最长的delay为Path2,Path2的delay要小于data_require所以有不等式:
6 =< Tcycle - 2 从而有 T cycle >= 8ns
对寄存器2来说:
只有一条数据路径
data_arrive_time = 1 + 2 + 2 + 2 + 2 = 9ns
data_require_time = Tcycle + 1 + 1 - 3 = Tcycle - 1
data_require_time >= data_arrive_time 所以,Tcycle >= 10ns
综上,所以Tcycle >= 10ns 所以时钟最大工作频率为100MHz;
第二题,判断时钟10MHz时,是否有timing violation(hold 分析):
首先,电路的最大工作频率是100MHz,所以时钟为10MHz时,一定没有setup的violation,但是有没有hold 的violation我们不知道, 所以需要计算两个寄存器的hold是否会出现时序问题。
对寄存器1来说:
path1 :0.5 + 2 = 2.5 ns
path2 : 1 + 1 + 2 + 2 = 6ns
data_require_time = 1 + 2 = 3ns
hold分析要求数据延时要在时钟上升沿之后到来,所以data_arrive_time >= data_require_time
对于path1来说 2.5ns < 3ns,所以路径1会出现hold violation。
对寄存器2来说:
data_arrive_time = 1 + 2 + 2 + 2 + 2 = 9 ns
data_require_time = 1 + 1 + 2 = 4ns
9 > 4 满足要求,所以寄存器2不会hold violation。
实际上的STA分析是EDA工具帮我们分析的,工具会帮我们分析各条路径的setup/hold是否满足要求,所以对我们实际工程来说,我们只需要看timing报告就可以了,看是否有出现violation,如果有出现,要知道原因,以及如何修复violation。
STA自测
1.如果芯片tape out了,测试怀疑有setup violation,怎么确认?(降低时钟频率,clock_period 就变大了,setup check 的不等式就更容易满足了,如果降低了时钟频率结果电路从不能工作变到稳定工作了,那就很可能是setup violation了,如果PLL做死了,不能调时钟频率,那还可以调ck_to_q(用不同的工艺库,PVT),和logic_delay)
2.如果芯片tape out了,测试怀疑有hold violation,怎么确认(和setup 检测一样,如果hold violation了,那就是不等式不成立,那我们就想办法让不等式成立,同样的可以改PVT,也可以增加 logic delay,)?
3.什么是setup time 什么是hold time
4.写出setup check和hold check的判断公式
5.如果出现setup violation了怎么处理?
6.如果出现hold violation了怎么处理?(根据不等式调参数,比如换PVT,修改logic_delay)
7.clock jitter 和clock skew有什么区别?
8.同步时钟,异步时钟的区别
9.不希望两个异步时钟之间做STA怎么办?怎么下约束?
10.如果从寄存器A到寄存器B之间有多条组合逻辑路径,setup和hold分析的时候怎么分析?
11.设置output_delay的时候,delay可以是负数吗?为什么?
12.如果给你电路图,让你分析setup和hold时序是否满足要求,你能分析吗?如果让你判断该电路能跑的最高时钟频率为多少,能计算吗?