总结课程的文章:http://t.csdn.cn/fWPf9
目录
1.时序分析的上半部分总结——STA的check point检查类型!
1.同步时钟下的 DFF Setup/hold check ——寄存器setup/hold 检查——DFF时钟端和数据输入端D
2.Async Reset——Set recovery/removal requirement 的 check——DFF时钟端和异步复位端
3.信号脉冲宽度的检查(signal pulse requirement check)—— 时钟和异步复位端 产生的脉冲宽度不能太短
4.时钟脉冲门(clock gate)的setup/hold check——clk_en信号和clk信号之间,en信号
5.DRC(Design Rule Check)的要求——电路的最大电容(capacitance)、电路的翻转时间(transition)、电路的扇出(fanout)
2.时序分析的上半部分总结——cell library简介!
1.data_arrive_time 从时钟端开始,使得数据从寄存器D pin到另一个寄存器D pin的时间
2.data_require_time 数据必须在哪个时间之前就要来,最晚时间点,如果data_arrive_time <= data_require_time,就算满足setup检查
4.总结:数据到达的时间必须小于数据需求时间,也就是数据要在下一个时钟沿抓数据之前到达下一个寄存器且满足下一个寄存器的setup要求。
总结1.0:hold check的是寄存器C不能在当前时钟上升沿抓到寄存器B当前时钟上升沿的数据。
6.3对于input_delay和output_delay都可以下最大值和最小值的delay constraint。
6.5 set_multicycle_path——有些时候如data_en保持两个周期
1.时序分析的上半部分总结——STA的check point检查类型!
1.同步时钟下的 DFF Setup/hold check ——寄存器setup/hold 检查——DFF时钟端和数据输入端D
2.Async Reset——Set recovery/removal requirement 的 check——DFF时钟端和异步复位端
http://t.csdn.cn/asbd7,恢复时间和去除时间——异步清零的恢复需求/去除需求。 removal time /recovery time 类似于DFF的setup time / hold time,不同之处在于前者是用来描述异步复位的。 总结:描述异步复位——的 recovery/removal 和DFF寄存器的 setup/hold 相似。
复习:1.为什么在异步复位/置位端会有 recovery/removal的需求?
假设没有 reset/removal 形成的时间窗口,那么如图中在CK的上升沿,ARST同时生效,此时寄存器是复位?还是将D端的数据寄存到Q?——存在歧义!
3.信号脉冲宽度的检查(signal pulse requirement check)—— 时钟和异步复位端 产生的脉冲宽度不能太短
4.时钟脉冲门(clock gate)的setup/hold check——clk_en信号和clk信号之间,en信号
5.DRC(Design Rule Check)的要求——电路的最大电容(capacitance)、电路的翻转时间(transition)、电路的扇出(fanout)
2.时序分析的上半部分总结——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规定的最大值。
3.时序分析的上半部分总结——时钟特性!
同步时钟是能够明确定义多个时钟间如下关系的时钟:
① 时钟频率
② 时钟高低电平的持续时间(duty cycle)
③ 各个时钟的相位(waveform)
④ 时钟的input latency
异步时钟:不能明确定义多个时钟间以上关系的时钟源。 clock有很多参数,频率、占空比等,这里介绍一下和时钟有关的参数。 clock period (时钟周期):芯片上的时钟为了准确,一般都是由晶振生成。
clock jitter :就是指两个时钟周期之间存在的差值,这个误差是在时钟发生器内部产生的,和晶振或者PLL内部电路有关,布线对其没有影响。,这个一般问题不大,因为产生jitter的是晶振,可能晶振这个时钟周期为100ns,下一个时钟周期为101ns,产生了1ns的jitter,但是这也不会对时序有很大的影响,因为晶振是时钟树的源头,寄存器A有jitter,寄存器B也有jitter,大家都有clock jitter。
transition time:时钟的翻转不是直上直下的,其实有一个传输延时,传输延时定义是从时钟的10%~90%所花的时间(上升传输延时)和从时钟的90%~10%所花的时间(下降传输延时)。
phase 相位:第一个上升沿和第一个下降沿的位置,相对于零时刻的时间。
input latency:输入终点相对于时钟源头的延迟,latency,(走线导致的延时)
clock skew:clock tree 到不同的寄存器的距离是不同的,因为这些距离的不同到达寄存器的时间也不同,同一个时钟的同一个沿,到达不同寄存器的时间差异称为clock skew。
clock uncertainty:clock jitter + pessimistic (悲观量)
4.STA—静态时序分析—下
4.1 STA术语
port:顶层设计的端口
pin:input/output of a cell(not the top design)
4.2 STA的Timing path——路径类型——4种
STA Timing Path:① 输入到寄存器 ② 寄存器到输出 ③ 寄存器到寄存器 ④ 输入到输出
1.输入——组合逻辑——输出:
2.input——(组合逻辑)——register寄存器:需要check这条路径的Timeing check能不能过!与之前check的种类不一致,这只是一条path的check!
3.内部:从一个元件如sequential cell——到另一个元件如register
4.输出——会定义output delay— —如 clk: ck to Q 然后经过sequential 到output,能否满足output delay
4.3 STA Start/End Points
Start Points:input ports、Clock pins of sequential cells(clocks 可以推广到clock,工具会自动去找时钟接到的寄存器)
End Points:output ports、Data pins of sequential cells、Clock pins of sequential cells(clocks,时钟永远是起点,但是可以-2,就会在把时钟接的第二个模块作为终点吧(from clock0 - to clock1))
5. setup/hold check 计算
setup 的要求、setup 行为上的解释 如果有两个寄存器相连,setup 满足要求的条件是:前一个寄存器A在clockA 第一个上升沿发出的数据,能被后一个寄存器B在clockB第二个上升沿抓到(即二者的延迟在一个时钟周期以内,如果不能被clockB第二个上升沿抓到,那就是delay太大了)。
hold 的要求、hold 行为上的解释 如果有两个寄存器相连,hold满足要求的条件是:前一个寄存器在clockA 第一个上升沿发出的数据,不能被后一个寄存器在clockB第一个上升沿抓到(如果被第一个上升沿抓到,那就是delay太小了,数据很快就到第二个寄存器了)。
5.1 Setup check 计算
如果有两个寄存器相连,setup 满足要求的条件是:前一个寄存器A在clockA 第一个上升沿发出的数据,能被后一个寄存器B在clockB第二个上升沿抓到(即二者的延迟在一个时钟周期以内,如果不能被clockB第二个上升沿抓到,那就是delay太大了)。
数据到达的时间必须小于数据需求时间——setup检查要求数据比时钟先到
选的最长路径——路径的data arrive到达时间最大——但也满足小于等于data require需求的时间——则说明,到达时间更端的路径也都满足 setup check
1.data_arrive_time 从时钟端开始,使得数据从寄存器D pin到另一个寄存器D pin的时间
如图所示的紫色路径数据从clk端,到达寄存器C的D端所需要的时间为: data_arrive_time = clk_latency(外部时钟过来) + clk_path1_delay + ck_to_q + logic_delay; 数据到达时间为时钟的延迟、时钟从外部到clk端的路径延迟、从clk端到数据输出有一个延迟、再加上组合逻辑延迟
2.data_require_time 数据必须在哪个时间之前就要来,最晚时间点,如果data_arrive_time <= data_require_time,就算满足setup检查
相应的寄存器C还有一个数据要求时间,如果数据延迟小于require那就没问题,如果大于require(数据来晚了)就会出现setup violation。 data_require_time = clk_period (因为是CLKA的0号时钟沿 在CLKB的1号时钟沿)+clk_latency + clk_path2_delay - dff_set_up (DFF 查找表,查到DFF setup)- clk_uncertainty; 数据需求时间:加一个时钟周期 clk_period,因为C要求的数据是上一个周期的数据。
3.检查工具的计算
绿色的部分是一样的
解决:
1.等式右边要大于等于左边——clk_period时钟周期可以通过调节时钟PLL——减小时钟频率——如果发现芯片能够符合要求了——等式满足,说明很有可能就是 setup check不满足了
2.PLL调不了,把ck_to_q 变小、dff_setup减小(负的) ——PVT——调节温度(降低)和电压等等(1V —— 改1.05V试试)
4.总结:数据到达的时间必须小于数据需求时间,也就是数据要在下一个时钟沿抓数据之前到达下一个寄存器且满足下一个寄存器的setup要求。
5.2 Hold check 计算
如果有两个寄存器相连,hold满足要求的条件是:前一个寄存器在clockA 第一个上升沿发出的数据,不能被后一个寄存器在clockB第一个上升沿抓到(如果被第一个上升沿抓到,那就是delay太小了,数据很快就到第二个寄存器了)。——所以这里不会存在 clk_period这一项——所以数据要来的比时钟慢——因为B不能在第一个上升沿抓到A第一个上升沿的数据(?还未更新)
真实数据到达的时间必须大于数据需求时间——hold检查要求数据比时钟后到
因为真实想要传输的数据,需要在第一个寄存器的一个周期以后,即第二个寄存器的第二个时钟周期才采集数据。
所以选一条最短的路径——最短的路径的数据来的很早——也能满足数据hold的需求——那最长的路径也会满足hold的需求
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;
让不等式更容易成立: 方法ck to q 和 logic delay放大——PVT!!!——降低电压、增加温度
总结1.0:hold check的是寄存器C不能在当前时钟上升沿抓到寄存器B当前时钟上升沿的数据。
总结:数据到达时间data arrive time要比数据要求时间data required time长,因为是同一个时钟的数据,数据不能到的太快,不能在同一个时钟沿被后一个寄存器抓到,数据实际的到达时间要在窗口之后,不能被同一个时钟沿抓到。
setup check的时候,要走一个组合逻辑路径比较长的路径,这样容易setup violation hold check的时候,要走一个组合逻辑路径比较短的路径,这样容易hold violation 就是在两种check阶段都要考虑最坏情况。
5.3 寄存器的时钟来源于两个不同的时钟源
上面讲的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
6.其他基础知识
两个不同源的时钟,我们不希望他去分析STA,就可以下false_path,因为很多这样的violation是假的violation,我们不希望花很多的算力优化这些不会出错的地方上,就可以下false_path
6.1下约束的TCL,创建一个时钟:
6.2下 input_delay:
input_delay 下的是外部信号的delay,内部还有的余量是clock_period - input_delay,一般在逻辑的顶层,下的外部逻辑的delay。 比如:set_input_delay -clock CLK $dly [get_ports D]
下 output_delay也是一样:
6.3对于input_delay和output_delay都可以下最大值和最小值的delay constraint。
input_delay 最大值用于setup分析,output_delay最小值用于hold分析。——外部影响!
看第二个时钟上升沿,在第二个时钟上升沿过了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 必须大于这个负数的绝对值
6.4 set_false_path不需要检查的地方
如果我们下了这个路径,意思就是不让工具做STA分析, 例如:set_false_path -from A -to B ※A→B之间的路径不check timing;但是B→A之间的路径仍需要进行check timing。
6.5 set_multicycle_path——有些时候如data_en保持两个周期
如果data数据需要稳定两个周期,也就是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满足)
7.高级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。
下节内容: