admin 管理员组

文章数量: 887021


2024年2月20日发(作者:counter函数运用)

那么信号经过这个网络后,延迟为:2+1+2+1+(3+(4-1)×2)=15.

那么延迟减少了5。

接下来讲一下skew,既然知道了fanout对于delay的影响,下面看一个例子:

由于时钟到每个触发器的互连线长短不一样,造成信号到达clockpin的时间也不一样,触发器也不会同时翻转。Skew的定义就是最长路径减去最短路径的值。

根据时钟域以及路径关系,skew可以分为globalskew,localskew,interclockskew。

Globalskew是指,同一时钟域,任意路径的最大skew。

Localskew是指,同一时钟域,任意2个有逻辑关联关系的路径最大skew。

interClockskew是指,不同时钟域之间路径的最大skew

另外还有一个usefulskew。本来打算在setuptime和holdtime中讲解。这里先大概说下

如下图:时钟周期为10ns,各时钟路径延迟如下:可以看到有一条路径的slack为-1,说明这条路径违规。可以看到与这条路径相关的skew是T3-T2=-1ns。

下面我们利用usefulskew向前面一个slack比较充裕的路径(slack=2ns)借点time,来修正现在这条路径。如下图:

经过usefulskew,修正了原来的violator。

这就是usefulskew的作用,可以向前,或者向后接time来修正violator

忽然想起来这三个概念的时候有点模糊,所以重新看了下,下面总结如下:

传输时间(propagationtime):输入信号幅度在50%到输出信号幅度达到50%的时间间隔叫做传输时间,有高/低和低/高两种传输时间。

转换时间(transitiontime):输出信号幅度由10%达到90%的时间间隔,有高/低和低/高两种转换时间。

延迟时间(delaytime):输入信号在幅度为10%和输出信号达到10%的瞬间之间的时间间隔叫做延迟时间,分为高/低延迟时间和低/高延迟时间(高/低和低/高输出波形的变化过程)。

具体分析以下转换时间,如下:

对于dc,operating_condition中的rc树模型有点帮助。

DC概论三之setuptime与holdtime之二

前面一篇讲了基本的建立时间和保持时间以及时序路径划分。在这篇开始之前,先介绍一下很经典而且会时常用到的用来讲解的一个电路图,如下。这篇文章的讲解也会给予这个电路图,讲解的时候我把电路图分割成需要的部分:)

既然我们知道了建立时间和保持时间的含义,这篇主要是根据工厂提供的标准单元库中时序器件的建立时间和保持时间来预估我们的约束对设计的影响,是否满足时序要求,简单点就是说,时序有没有violator。

set_input_delay:

input_delay是设置外部信号到达输入端口的时间,dc会用它来计算留内内部逻辑的空余时间是多少。

之所以让ClkA和Clk的时钟周期不一致,主要是用来说明上图中黄色部分的。黄色部分的确认是很重要的。这是DC用来确定时间余量(slack)的关键。如上图所示,黄色部分已经确实是最小相位差。那么根据input_delay时间以及库中触发器的setup建立时间,可以知道留给内部逻辑的延迟时间是红色部分Tmin-Tinput_delay-Tsetup。综合过程中,dc会优化Logic2的时序,以使他达到时序要求。

同样set_output_delay是设置输出端口到数据采集处的延迟。如下图:

DC会根他来计算留给内部逻辑的时间。

这里还是要强调一下不同频率的问题:)

介绍完了input_delay和output_delay,以及skew.在分析时间余量之前再介绍下时钟的latency。

Latency分为sourcelantency和一般的latency。

Sourcelatency指的是时钟源到时钟端口的延迟。

Latency指的是时钟端口到内部时序器件的时钟管脚的延迟。

一般只考虑latency即可。

再看下latency对于内部逻辑的影响.下图是不考虑latency的情况:

内部逻辑延迟的限度为T2-T1-Tinput_delay-Tsetup。

当考虑了latency的时候。D1上的clock会变成时序图中的红色部分

那么留给内部逻辑的最大延迟为:T2’(T2+Tlatency)-T1-Tinput_delay-Tsetup。会发现留给内部逻辑的延迟会变大,那么会给DC更大的空间来综合。

同样如果ClakA上面如果也设置了Latency在分析slack的时候也要算进去。

顺便介绍一下时钟的jitter,如下

正常的时钟到来时蓝色的时序图。但是由于无法预知的因素,时钟可能提前(粉色)或者延迟(红色)到来,这就是jitter。提前到来充为setupjitter,延迟到来充为holdjitter。

DC中把skew和jitter合成一个uncertainty。用set_clock_uncertainty来设置。

下文中提到的skew指的是合体,即uncertainty。

Uncertainty分为setup和hold,顾名思义,如上图理解即可。

DC概论四之setuptime与holdtime之三

(2009-01-1523:37:16)

转载

标签: 分类:DC初步

杂谈

下面开始正式分析时间余量slack。其实有了上面的知识,只要稍微说明下大家都会很明白。

在介绍slack之前,我们要先了解一下要求时间(requiredtime)和达到时间(arrivetime)的概念以及计算方法。

如果没有特殊说明,黑色clock代表没有影响因素的理想时钟,红色(粉色)clock代表收到latency影响的时钟。蓝色clock代表同时受到latency和skew(uncertainty)影响的时钟。

对于建立时间(setuptime)的到达时间和要求时间。

在分析前,记住,建立时间是分析路径中的考虑到各种最不利因素的最大延迟,打个比方:

前面一级用尽最大程度向后推(最大的延迟),本级就近打力气向前顶(最大不确定因素)。

然后看中间有没有漏气(slack为负,时序违规)。

1,输入端口到时序器件的数据端口。

上图中

要求时间=T2+Tlatency-Tuncertainty_setup-Tsetup

到达时间=T1+Tlantency+Tinput_delay+Tlogic2

2,时序器件的输出管脚到输出端口

上图中:

要求时间=T2+Tlatency-Toutput_delay-Tuncertainty_setup

到达时间=T1+Tlatency+Tcell+Tlogic5

3.时序器件到时序器件

上图:

要求时间=T2+Tlatency-Tuncertainty_setup-Tsetup

到达时间=T1+Tlatency+Tcell+Tlogic

4,输入端口到输出端口

如上图:

要求时间=T2+Tlatency-Tuncertainty_setup-Toutput_delay

到达时间=T1+Tlatency+Tinput_delay+Tlogic

我们再来看下保持时间,保持时间的到达时间和建立时间的到达时间是一样的。只是保持时间的要求时间不一样而已.

保持时间类似于龟兔赛跑:

系统要求时间就是尽可能的向后,而线上信号就是追那个要确定的时间,追上了,就没问题,追不上问题就有了。

说明:红色和粉色表示受latency影响,蓝色表示受uncertainty影响。

1.输入端口到时序器件的数据端口。

到达时间:Tarrive=T1+Tlatency+Tinput_delay+Tlogic

要求时间:Trequire=T2+Tlatency+Tuncertainty_hold+Thold

2.时序器件的输出管脚到输出端口

到达时间:Ta=T1+Tlatency+Tcell+Tlogic

要求时间:Tr=T2+Tlatency+Tuncertainty_hold+Thold-Toutput_delay

3时序器件到时序器件

到达时间:Ta=T1+Tlatency+Tcell+Tlogic

要求时间:Tr=T2+Tlatency+Tuncertainty_hold+Thold

4,输入端口到输出端口

到达时间:Ta=T1+Tlatency+Tinput_delay+Tlogic

要求时间:Tr=T2+Tlatency+Tuncertainty_hold+Thold-Toutput_delay

Slack计算:

对于建立时间:

Slack=要求时间-到达时间

对于保持时间

Slack=到达时间-要求时间

DC概论五之highfanout(1)

dc在综合高扇出的网络的时候,约束优先级是:

1.功能正确

(max_transition,max_fanout,max_capacitance)

ime(max_delay)

me(min_delay)

...

为了符合drc要求,dc通常花费很多时间来编译和修正这些DRCviolators。

路径上的cell延迟由input_transition和output_load(包括扇出pin上的load)决定,这个由查抄表可以得到。

而net延迟是由net上的R,C决定的。在没有布局布线之前,我们不知道实际的R,C是多少,dc根据互联线模型(set_wire_load_model)来计算出R,C。然后根据得到的R,C计算出net上的延迟:

Net_delay=R*C*OC

其中系数OC是根据操作环境(set_opearting_conditions)中设置的rc树模型得到。

一般的工艺库的操作环境有三种,WORST,TYPICAL,BEST,分别是最差,典型,最坏。

在ic中出现highfanout的情况基本有三种:

1.时钟clock

2.复位reset

3.一般信号

dc中对于高扇出net的处理,基本就是加buffer(前提,如果没有对这条net设置一些约束,比如set_ideal_network,set_dont_touch,后面会讲到),以此来减少cell输出端的负载,从而减少transitiontime和delaytime,以及max_capacitance。而事实上我们是不希望dc这么处理的,我们希望的是可以在后端版图的时候让后端工具自己加buffer,因为我们不知道真实的highfanoutnet上的RC,所以不知道应该加怎么样的buffer,dc只是根据互联线模型来计算RC,接着加入buffer,不是真实的,只有布线以后我们才可以得到几乎真实的rc。

所以在dc综合过程中我们要阻止dc最highfanoutnet进行insertbuffer处理。因此这些没被处理的高扇出net就会引起一些drc或者timing错误,在dc中,dc用价值函数(costfunction)来判断这些约束对设计的影响。价值函数=DRCviolator和+timingviolator和。一般的,dc会根据所有drc和timing错误,通过使价值函数趋近等于0来修正这些违规。为了达到效果,dc会每次修正一个路径,然后重新计算价值函数,如果价值函数变小,说明设计被改进了。

在介绍如何处理highfanoutnet之前,先介绍3个命令。

Set_ideal_net(已经被set_ideal_network-no_propagate代替)忽略port,pin,net上的时序优化(timingoptimization),以及drc修正(drcfixxing)。network具有传输型。

Set_dont_touch(已经被set_dont_touch_network-no_propagate代替)忽略,port,cell,design,pin上的优化(timingoptimization),但是不会忽略DRC。network具有传输型

这样我们在综合的时候就要对highfanoutnet做一定的约束,让dc不对这些net做优化以及加入buffer。下面分三种情况来说明。

,对于clock,当我们用create_clock,orcreat_generated_clock创建clock的时候,这些clock已经有了ideal_network的属性。Dc已经不会在clocktree上加入buffer,同时也不会计算drcviolation,但是delaytiming仍然会被计算。不计算drc不是说没有负载。

,对于复位高扇出信号,因为没有那些属性,所以要手动设置,set_ideal_network

3.一般信号。同样需要手动set_ideal_network

下面看例子:

下面看一个高扇出实例,有时钟,有复位还有一般信号

moduletest(clk,clk_G,d_in,s_r1,s_r2,rst_N1,rst_N2,dout);

parametersize=1100;

inputd_in,rst_N1,rst_N2,s_r1,s_r2,clk_G,clk;

]outputdout;

regdout;

reg[size-1:1]tmp;

wireG_clk,rst_N,s_r;

integeri;

assignG_clk=clk&clk_G;

assignrst_N=rst_N1&rst_N2;

assigns_r=s_r1&s_r2;

always@(posedgeG_clkornegedgerst_N)begin

if(!rst_N)begin

dout<=0;

tmp<=0;

end

elsebegin

dout<=tmp[size-1]|s_r;

for(i=size-1;i>1;i=i-1)

tmp[i]<=tmp[i-1]|s_r;

tmp[1]<=d_in|s_r;

end

end

endmodule

综合脚本:

setlib$env(DC_LIB)

settarget_library""

setlink_library"*$target_library"

setsearch_path".../src../scripts$lib"

sethdlin_while_loop_iterations5000

analyze-formatverilogtest.v

elaboratetest

uniquify

link

check_design

create_clock-period100[get_portsclk]

set_operating_conditions-maxslow-minfast

set_wire_load_modetop

set_min_-min_

setinput_exp_clk[remove_from_collection[all_inputs][get_portsclk]]

set_input_delay60-clock[get_clocksclk]$input_exp_clk

set_output_delay30-clock[get_clocksclk][all_outputs]

compile

电路图:

下面是生成的网表的关键几个地方。

AND2X4U1106(.A(clk_G),.B(clk),.Y(G_clk));

AND2X2U1340(.A(s_r2),.B(s_r1),.Y(n2));

AND2X2U2441(.A(rst_N2),.B(rst_N1),.Y(n3));

在没有分析时序前,根据我们已经有的知识,基本上可以知道这几个net上可能存在的问题。

1.较大的延迟,因为每个net上都有1100个负载。

错误,max_transition,max_capacitance,max_fanout

3.较大的输出转换时间output_transition,尤其是U1340的output_transition作为下一级的input_transition,经过下一级的cell时候会造成更大的延迟。

时序分析

可以看到clocktree上没有插入buffer,但是cell的延迟却很大

Dc自动插入了buffer。

3一般信号

Dc同样自动插入了buffer。

下面我们修改一下脚本,如下;

setlib$env(DC_LIB)

settarget_library""

setlink_library"*$target_library"

setsearch_path".../src../scripts$lib"

sethdlin_while_loop_iterations5000

analyze-formatverilogtest.v

elaboratetest

uniquify

link

check_design

create_clock-period100[get_portsclk]

setinput_exp_clk[remove_from_collection[all_inputs][get_portsclk]]

set_input_delay60-clock[get_clocksclk]$input_exp_clk

set_output_delay30-clock[get_clocksclk][all_outputs]

set_ideal_network-no_propagate[get_netss_r]

set_ideal_network-no_propagate[get_netsrst_N]

compile

重新分析timing

基本和原来一样,cell上仍然有很大延迟。

原来插入的buffer现在没有了。不过令我不明白的是cell上竟然没有大延迟。等知道的朋友解答。

一般信号

同样dc也没有插入延迟,和希望的一样。不过也没有出现大延迟,不是很明白

DC概论五之highfanout(2)

虽然设置了set_ideal_net(network),set_dont_touch(network)但是clock上仍然有大延迟。

为了解决这个问题,我们还要继续设置高扇出的选项。

1.high_fanout_net_threshold,这个变量是用来指出,如果net的扇出个数超过指定值,那么他就是高扇出,同时drc检查,还有延迟计算都是这个数值计算,但是时间上net上的扇出是没有变的。

2.high_fanout_net_pin_capacitance,结合high_fanout_net_threshold使用的,当net的扇出超过threshold,那么net上的负载等于这2个数值的乘积。

进一步:修改脚本:

setlib$env(DC_LIB)

settarget_library""

setlink_library"*$target_library"

setsearch_path".../src../scripts$lib"

sethdlin_while_loop_iterations5000

analyze-formatverilogtest.v

elaboratetest

uniquify

link

check_design

create_clock-period100[get_portsclk]

setinput_exp_clk[remove_from_collection[all_inputs][get_portsclk]]

set_input_delay60-clock[get_clocksclk]$input_exp_clk

set_output_delay30-clock[get_clocksclk][all_outputs]

set_ideal_network-no_propagate[get_netss_r]

set_ideal_network-no_propagate[get_netsrst_N]

sethigh_fanout_net_threshold60

sethigh_fanout_net_pin_capacitance0.01

compile

时序分析:

可以发现cell的延迟已经很合理。

reset

Cell上的延迟和原来一样

一般信号

Apr之后

导出网标,修改约束文件成初始状态,继续分析时序:

可以看出apr工具自动加入了buffer,同时优化了net上的fanout

总结:

为了让dc在综合高扇出的net时候不插入buffertree和bufferchain,需要使用set_idea_network使这些搞扇出net避免时序优化(timingoptimization),时序更新(timingupdate),drc修正(drcfixxing)。但是这样设置之后,net上的高负载并没有消除,我们需要额外的参数进行设置.high_fanout_net_thresholdhigh_fanout_net_pin_capacitance.以减少dc综合时间,以及减少timingviolatorsreport


本文标签: 时间 时序 时钟 延迟 没有