时序约束,STA

(1) clock

Q1.1什么是同步时钟?
时钟频率是整倍数,并且相互之间的相位是固定而且相差可预知的,才可以称得上是同步时钟。其他的都算异步时钟。
比如,
5M,10M是同步
2M,3M一般算异步
一个时钟,输出到另一个芯片中,转一圈后,以同样的频率返回到自己的芯片,因为无法确定时钟在另一个芯片里面的latency,所以输出的时钟与输入的时钟算异步
一个时钟进到2个PLL,就算那2个PLL的输出频率相同,一般也算是异步时钟,除非你de-skew

Q1.2 如何处理同步时钟?
设计要求严格的公司,就算是同步时钟,数据在同步时钟间传送时,依然要用meta-stability FF,可以set_false_path
如果放松要求,不用meta-stability FF,则同步时钟之间是real path,做CTS时,同步时钟要clock tree balance。
注意不同频率的同步时钟的最小时间间隔被用来检查setup
如果上升下降沿混用的话,setup的时间间隔就只有半个时钟周期了

Q1.3 如何处理异步时钟?
很简单,set_false_path
注意要from A to B,同时要from B to A

Q1.4 如何定义时钟?
create_clock 如果指定某个pin/port,就是实时钟,如果没有指定pin和port,就是虚拟时钟
巧妙利用waveform选项可以做出不同波形的时钟
被定义成时钟的net,在综合时,自动带有ideal network和dont_touch的属性。但是当它被用作data计算延迟时,idealnet的属性会自动消失

 

 

set_drive 0 clk

Note:

Toprevent buffering of the clock network, the script sets the input driveresistance of the clock port (clk) to 0 (infinite drive strength).

 


时钟会自动穿过逻辑单元,停在时序单元的时钟端,所以用FF产生的分频时钟要再用create_generated_clock定义一次

Q1.5 如何处理多选一时钟?
在实际应用当中,如果这几个时钟不会同时出现的话,则在定义时钟时,只选择最快频率的就可以了
如果是多个时钟同时出现,可以用set_case_analysis选一个,
也可以放它们全都过去,但是在MUX后面把它们之间set_false_path

Q1.6 巧妙定义时钟
直接在分频FF的Q端定义generatedclock时,有时会把分频FF的时序打掉,解决办法是在分频FF的Q端加一个时钟buf,从那个buf的输出端定义generatedclock,从而保证分频FF自身的时序完整
如果从source clock到generated clock之间有多条路径,你希望PT用指定的一条路径来计算时序的话,可以用set_case_analysis,set_disbale_timing 或者一级一级地定义generated clock来引导PT达到你的要求

分频器时序约束问题

http://bbs.eetop.cn/thread-316442-1-1.html
时序分析中同一时钟的不同路径问题

问题:

解答:

首先这个跟CPPR没关系,CPPR补偿是以同一路径的时钟为前提的,ABD,ACD路径不一样,所以不涉及到CPPR
后来做时序检查的时候分成两个case,set case analysis在D点,ABD和ACD分开检查

 

这个是典型的Clockreconvergency问题, 时钟源头一样,然后走不同的路径,然后在某个mux上重新汇聚,在做timingcheck的时候这两条路径互相check,就产生violation,然而这样的路径是虚假的,因为一个mux不能同时通过两个时钟.

解决方法可以在mux上设case_analysis,每个mode只过一条路径,这样mode会变多,需用MMMC来解.做时钟树的时候一般情况下两条路径做到大致平衡,不过也有不能平衡的情况,比如DLL.

 

一般解决方法:如果不想用MMMC的话,在B和C处,分别定义generated_clock,然后把它俩set_false_path
Q1.7 什么时候需要设置latency?
latency分为source latency 和 network latency 两种。 source latency是源时钟自带的,networklatency就是CTS后的clock tree insertion delay。
在综合时,一般不需要latency,
除非,
已知不同clock带有不同的source latency,并且它们之间有时序要求
预知不同clock会有不同的clock tree insertion delay,不想平衡它们,但是要满足他们之间的时序要求

做完CTS后,要把network latency去掉

请问set_clock_latency 设太大会有什么不好

Q1.8 如何设置uncertainty
clock uncertainty分为setup和hold,preCTS和postCTS几种不同的情况
一般的处理原则是:
preCTS,setup: uncertainty = PLL jitter + 预估的clock skew
preCTS,hold: uncertainty = 预估的clock skew

postCTS,set_propagate_clock [all_clocks]
postCTS,setup: uncertainty = PLL jitter
postCTS,hold: uncertainty = 0
有时fundry要求hold uncertainty保留一定的量,这时就把那个保留量加到上面的公式中

sdc文件中对clk的uncertainty、transition、latency的设置


(2) IO端口的约束

Q2.1如何加IO端口的约束?
最普通的方法是
对输入端,set_input_delay, set_driving_cell (也有用set_input_transition的,但是不多见)
对输出端,set_output_delay,set_load
对时钟端,set_clock_transition

dc综合时的clock transition应该参考什么设定?

这个和工艺与设计有关,一般建议是
65nm时, min(1/10时钟周期,150ps)
90nm时,后面的数字为200ps,130nm更大一些
不过如果你的时钟特别慢时,再小一点也可以。
set_drive ,set_load
180nm工艺dc综合里set_load,set_drive的值具体根据什么参考来约束啊,一点概念都没有 ,请大家帮帮忙了 。。。。。。

解答:

如果你会布局布线的话
随便赋一个值,完成综合,然后做后端
从后端拿到一个精确值,返回来定driver和load,再重新做综合

版主解答:

set_drive很少用了
一般用set_driving_cell . set_load用来约束output port,
set_driving_cell/set_input_transition 用来约束input port
对于pad输出, load一般是10~30pf (很大了),
对于模块输出 ,load一般是 0.XXX pf
对于input transition,一般比查找表再大些的范围内

 

How to"set drive" and "set load" in DC?

if thisis a digital block inside an analog module, you can request to the analogdesigner, the load/drive capability for each pins and define betterconstraints.

 If you want to add this constraint at padlevel, you need to know the PCB used, and every think like this, package....

 

Ingeneral, I only apply the set load/drive only for pin between analog/digital,because, this could have an impact on timing. The pad are so "slow",this constraints do not add much info.


Q2.2 哪些端口不需要约束?
静态信号可以set_false_path,比如reset,test_mode,function_mode_select
不能真的什么约束都不加

Q2.3 什么样的reset信号可以set_false_path?
如果在工作时,reset信号有效时,时钟信号不翻转,就可以set_false_path
如果reset信号动作时,时钟也有动作的话,就不能set_false_path

Q2.4 像reset那样的high fanout信号需要设定为ideal net吗?
如果是false path的话,可以设为ideal net
一般不需要设为ideal net,让DC加入buffer tree后,有利于估算功耗和面积

Q2.5 如果有一组输出信号,需要他们之间对齐,但是不太在乎有多大的延迟,这时应该如何约束?
如果有输出时钟的话,在那个输出时钟端口定义一个generated_clock,其它信号的output_delay都相对于这个generated_clock而定。只要有max和min,就可以把所有信号卡在一个范围之内
如果没有输出时钟的话,用set_output_delay -reference_pin

Q2.6 如何计算input和output delay?
如果是block的input和output delay,可以预先分配,比如输出端,输入端各1/3,中间的连接1/3
block的端口最好都flop-in,flop-out
如果是chip IO,要度其他芯片的IO时序和电路板上面的延迟,比较麻烦

set_input_delay的时间设置

set_input_delay/output_delay是设置外面的delay, 从而保留芯片内部的IO delay来约束
input io 到flop和flop到output port的delay,
一般紧约束为外面留70% , 里面留30% ,但实际上有些port要调整,不是每个port都需要一样的值 ,

set_input_delay [expr 0.7* $clk_period ] -clock $clk [all_inputs]
set_output_delay [expr 0.7 * $clk_period ] -clock $clk [all_outputs ]

(3) DRV
DRV有时也加DRC,与物理检测的DRC不是一个概念
DRV包括,
set_max_transition 与工艺相关,65nm的话,在0.6ns左右
set_max_fanout 与工艺相关,一般在12~20之间
set_max_capacitance
set_max_power
set_max_area

4) falsepath,multicycle path
Q4.1 什么情况下需要set_false_path?
异步时钟之间,
到meta-stability 的第一个FF路径,
静态信号

Q4.2 何时会用到multicycle_path?
太长的path,
不会每个周期都变的信号
注意:在RTL中,前端一定要多周期工作一次的功能

一般set_multicycle_path -setup
要同时写set_multicycle_path -hold

 

(5) wire loadmodel
wire load model是一种简单地根据fanout来估算wire delay的方法,在综合时,一般根据设计的大小选择对应的WLM
有时也会用zero wire load model,这时的clock period要相应减小15~25%,或者clock uncertainty增加15~25%

set_wire_load_model两种模式top和enclosed到底有什么区别?

更加准确的计算wire delay的方法是DC topo和RC physical,
他们在综合时会粗略地做个place,然后根据距离来计算延迟



(6) clock gating
Q6.1 如何加clock gating?
局部的clock gating在综合时,会自动加进去。加clockgating后,不但会减小功耗,还会改善时序,因为本来到D端的逻辑,一部分被移到CK端了,简化了D端的逻辑
整个block的clock gating,一般直接在RTL里面加,因为DC没有那么聪明

Q6.2 需要对clock gating加什么特别的约束吗?
如果使用标准库里面的ICG单元,不需要附加任何特别的约束,前后端的工具都认得它
如果用latch+and自己搭的clock gating,你要对那个and单元set_disable_clock_gating_check,还要告诉后端,一定把latch和and摆在一起
一般只在没有动态切换时钟时,才可以用一个and/or做clockgating,这时也要set_disable_clock_gating_check

 

(7)case_analysis
set_case_analysis可以强制某个node为0/1
这个0/1会沿着纯逻辑组合单元向前传送,如果没有特别设定的话,会停在时序单元上
注意,只是是向前传,不会向左右2边和向后传
举例:
如果设在输出端上,那么所有fanin端都会被强制为0/1
如果只设在某个输入端上,与之相连的输出端和其他输入端都不受影响

(8)ideal net/network
ideal_net只作用于这条net
ideal_network会把这个属性传送下去
clock net自动带有ideal net属性
其他net,何时需要设定ideal net?见Q2.4

你可能感兴趣的:(STA)