热度 1| ||
设计约束文件SDC全称synopsys design constrains,用于对设计进行设计约束。个人的理解SDC的作用主要是模拟芯片工作的真实场景,这个真实场景包括输入输出负载,运行频率,时钟质量,负载散出情况等,还有为了提升良率添加的margin。一定要小心的是,SDC与芯片功能直接相关,一定要完备合理(比如可以通过check_timing命令检查sdc文件有没有错误)。
如果按照芯片的工作环境去理解SDC,可以分为外部环境和内部环境。
输入管脚的输入延时和驱动特性。
输出管脚的输出延时和负载特性。
就是数据在设计之外的传输时间。可以通过以下命令约束:
set_input_delay
如果不知道多大,就要设置的尽可能大一些。
set_output_delay
如果不知道多大,就要设置的尽可能大一些。
指的是外部环境对输入管脚的驱动能力,可以用两种方式约束:
set_driven_cell
通过制定该输入管脚的驱动单元,通过库文件查询得到驱动能力,
尽量选驱动能力较弱的单元,为后续优化留margin。
或者
set_input_transition
通过人为指定输入的转换时间transition time来确定驱动能力
指的是输出管脚需要驱动的外部环境下的负载电容大小。用下面命令约束:
set_load
如果不知道load多大,人为设置尽可能大的负载。可以用set_load [load_of slow_lib/lib_cell/input_pin] [get_ports OUT]设置。
注:为什么要用转换时间的负载电容来约束设计呢?因为工具是通过二维查找表的方式确定门的延时,其中查找表的两个输入就是转换时间和负载电容。转换时间越短,说明前端的驱动能力越大,速度越快;负载电容越小,说明该节点越容易充电或者放电,速度也越快。
内部环境
包括design rule和timing constrain
表示设计者要求设计内部要符合的设计规则,比如一个输出能驱动的最大cell数量和最大负载电容,以及时钟信号数据信号的转换时间等,一般时钟信号比数据信号的要求更严格。这个设置的值肯定不能超过lib规定的最大值,我见过的一般都会比最大值小很多,不过具体如何影响还不十分清楚,以后有空跑个不同的design rule设置对比下PPA。
表示芯片内部的时钟分布,该部分要保证所有的时序单元都被正确的时钟驱动。其中正确的时钟指的是要和芯片实际工作的时钟有尽可能一样的周期(period)、转换时间(transition time/slew)、延时(latency)和uncertainty(skew+jitter+margin)等。
时序单元在这些时钟的驱动下,要满足建立时间和保持时间的约束。
对时钟周期的约束:
设置时钟周期
create_clock -period 2 [get_ports CLK] -name clock_name
默认占空比为50%。仅仅进行以上约束,时钟是理想的,有无穷的驱动能力,偏斜也是0,能够连接任意的buffer,dff等,而这是不符合“实际场景”的,为了使综合以后时钟树(在P&R中进行时钟综合)和综合前的时钟树匹配,需要人工设置约束uncertainty(skew,transition time,jitter,人为添加的margin,latency)。
对时钟uncertainty建模
uncertainty包括skew,jitter和margin。skew指的是时钟定义点到各个触发器的时钟差异,jitter指时钟的相位噪声,margin为认为留下的裕量,命令为:
set_clock_uncertainty -setup value [get_clock CLK]。
-setup主要用于建立时间分析,value 意味着Setup uncertainty,包括clock skew+jitter(抖动)+margin(按照经验留的裕量)。
set_clock_uncertainty -hold value [get_clock CLK]。
-hold主要用于保持时间分析,value 意味着hold uncertainty,包括jitter(抖动)+margin,hold就不会有clock skew了。
对时钟的网络延时(clock network delay)建模
时钟网络延时包括两部分,network latency(时钟网络定义点create_clock port到触发器时钟pin的延时)和source latency(真实时钟源点,PLL,到时钟定义点create_clock port的延时)。
set_clock_latency -source -max 5 clock_name
定义了source latency
set_clock_latency -max 5 clock_name
定义了network latency
set_propagated_clock [get_clocks CLK]
有了版图后用这个
对转换时间约束
set_clock_transition -max Tmax [get_clocks CLK]
用于分析建立时间
set_clock_transition -min Tmin [get_clocks CLK]
用于分析保持时间
时钟树综合前和时钟树综合后的约束文件区别
时钟树综合之前,需要建模时钟的两个latency(源和网络),uncertainty(skew,jitter和margin),transition time。
时钟树综合之后,有了真实的时钟延时,就只用建模源到时钟定义点的源延时和uncertainty,其中uncertainty只包括jitter和margin,因为有了真实的时钟,skew就可以通过工具计算得到命令如下:
set_propagated_clock [all_clocks]
用途是将时钟传递下去,EDA工具可以根据传播延时自动计算时钟的延时,更加精准。
约束组合逻辑时序两种方式
1、约束最大延时:
set_max_delay 1 -from A -to B
2、设置虚拟时钟,这时的虚拟时钟没有transition time, 没有latency,但是要有uncertainty(或许是margin)。
以上是自己理解的SDC基本概念,如有问题还请同行指正。以后有空再整理一下复杂点的SDC,比如时序例外、多时钟约束、时钟分频,多周期约束等。