时序分析的设计约束SDC怎么写呢?

创建时钟
使用sdc命令create_clock创建时钟,时钟周期20,占空比50%的时钟信号;
create_clock -name clk -period 20  [get_ports clk] -waveform{0 7}  
-waveform 时钟占空比,不指定该选项,则时钟默认占空比为50%
生成时钟
生成时钟:是基于一个主时钟并通过相关逻辑转换后,在相位,频率,占空比等方面和主时钟有一定变化的分支时钟;
生成时钟的时钟源来自主时钟,其相位参考主时钟;
生成时钟可以通过以下方式生成:
时钟分频
时钟倍频
时钟门控
通过sdc命令 create_generated_clock 来定义生成时钟:
create_generated_clock  -name  clk_gen  -source   [get_ports clk] [get_pins {dff/q}]  -divide_by 3  
-source 设定生成时钟的源引脚
divide_by 3 :3分频
divide_by:表示生成时钟通过分频生成;
multiply_by :表示生成时钟通过倍频生成;
edges: 占空比设置
生成时钟
可对生成时钟占空比进行设置:
占空比进行设置
create_generated_clock  -name  clk_lsb -source    [get_ports clk] [get_pins {dff/q}]  -edges {1 3 5}create_generated_clock  -name  clk_lsb -source    [get_ports clk] [get_pins {dff/q}]  -edges {1 5 9}  
分频器由源时钟下降沿触发:
源时钟下降沿触发
create_generated_clock  -name  gclk3 -source   [get_ports clk] [get_pins {dff/q}]   -edges {2 4 6}create_generated_clock  -name  gclk4 -source   [get_ports clk] [get_pins {dff/q}]   -edges { 4 6 8 }  
虚拟时钟
虚拟时钟即设计中不存在的时钟,定义虚拟时钟应满足:
设计中的某个时钟实际存在,但其时钟源不是来自设计中任何引脚和端口;
由于虚拟时钟和设计中的任何引脚和端口无直接关系,故定义虚拟时钟时并不指定时钟端口;
虚拟时钟用于作为输入输出端口延时约束的时钟源;
通过sdc命令创建虚拟时钟:
create_clock -name virtual_clk -period 10 -waveform {0 5}  
io端口延迟
输入延迟:在一个时钟周期内,外部逻辑的输出数据到达设计输入端口所需的时间;
输出延迟:在一个时钟周期内,设计输出端口数据到达外部逻辑所需的时间;
通过sdc命令set_input_delay在输入端口指定延迟;
set_input_delay -clock clk 1.2  [get_ports {io}]set_input_delay -max  -add_delay  -clock [get_clocks {clk}] 15   [get_ports {io}]set_input_delay -min  -add_delay  -clock [get_clocks {clk}]   15  [get_ports {io}]  
-add_delay:通知工具除了现存的约束外,这是一个额外的约束,不会覆盖前一个约束;如果没有-add_delay,那么后面的约束会覆盖前面的约束。
通过sdc命令set_output_delay在输出端口指定延迟;
set_output_delay -max  -add_delay   -clock [get_clocks {clk}] 15  [get_ports {io}]set_output_delay -min  -add_delay  -clock [get_clocks {clk}] 15  [get_ports {io}]  
负延迟:
下面值可能是负值:set_input_delay -max
set_input_delay -min
set_output_delay -max
set_output_delay -min
时钟分组
同步时钟:时钟存在固定的相位关系,来自同一个时钟源;异步时钟:不存在固定的相位关系;
为了让时序工具忽略异步时钟之间的时序路径或串扰分析,sdc提供了set_clock_groups命令,表明时钟组之间的时序路径不必考虑;
set_clock_groups   -name {clk_group1}   -group {gcck}   -group {rclk}    
-asynchronous:时钟彼此不共享相位关系时可使用;
例:
set_clock_groups   -name {clk_group1}   -group [get_clocks{cck1 clk2 clk3} ]  -group [get_clocks{cck4 clk5 clk6} ]   
表示:clk1,clk2,clk3分别异步于clk4,clk5,clk6;
伪路径
不需要做时序分析的时序路径,可以通过伪路径忽略该路径,使得工具对该路径不进行时序分析;
set_false_path -from [get_clocks clk1] -to [get_clocks clk2]  
定义两个时钟域clk1和clk2之间的路径为伪路径;
set_false_path -through  [get_pins x1] -through  [get_pins x2]  
定义按x1->x2的顺序通过x1 x2引脚的路径为伪路径;
-from,-to,-through指定false的路径;
-from x1 -to x2:表示从起点x1到终点x2的路径;
多周期路径
多周期路径,存在时序路径较长或者信号在延时等于几个时钟周期的时间,如果仍然按照单周期进行约束,可能会出现时序违例,如下图所示:
通过sdc命令set_multicycle_path:
set_multicycle_path -from [get_pins dff1/q] -to  [get_clocks dff2/d] -setup 5set_multicycle_path -from [get_pins dff1/q]  -to [get_clocks dff2/d]  -hold 4  
-setup和-hold成对出现;
保持时间比建立时间少一个周期;
最大最小延迟
当需要点对点对某些路径进行约束时,可通过最大最小延迟实现;
异步电路之间
输入信号直接通过组合逻辑后输出
当约束定义的是时序路径中的节点时,则约束的仅在两个节点之间;
set_max_delay -from [get_ports a1] -to [get_ports a2] 8set_min_delay -from [get_ports a1] -to [get_ports a2] 5  
上述定义a1到a2之间的时序路径的约束最大延时8ns最小延时6ns;
当约束定义是时钟时,最大最小延时将应用于该时钟源所控制的所有路径;
set_max_delay -from [get_clocks clk1] -to [get_clocks clk2] 8set_min_delay -from[get_clocks clk1] -to [get_clocks clk2] 5  
上述定义从时钟域clk1到clk2之间的所有时序路径的约束最大延时为8ns,最小延时为6ns;
io环境建模
输入驱动建模:默认情况下,如果没有设置外部输入驱动,时序分析工具则默认外部输入驱动为无穷大;
推荐查看:综合对象及环境属性
1.set_drive
设置外部输入驱动信息,通过该命令定义驱动该引脚的输入驱动电阻值,通过该驱动电阻值计算出驱动端的转换时间,并计入时序路径延时信息;
当定义为0时,代表输入端驱动力为无穷大;
set_drive 0              [get_ports clk]  
上述定义clk输入的驱动值为无穷大;
set_drive  -rise 0.4 [all_inputs]set_drive  -fall 0.3 [all_inputs]  
上述命令定义所有输入的驱动值,上拉驱动电阻为0.4,下拉驱动电阻为0.3;
-min指定最小电阻,用于保持时间分析;
-max指定最大电阻,用于建立时间分析;
如果不指定-max和-min,那么指定的值既用于建立时间分析,也用于保持时间分析;
2.set_driving_cell
指定驱动单元
set_driving_cell     -lib_cell invx1m [all_inputs]  
上述命令定义设计所有驱动力等价于单元库中invx1m单元的驱动力;
-lib_cell:指定驱动引脚的单元;
3.set_input_transition
通过set_input_transition 定义驱动该引脚的输入驱动端转换时间,设置的转换时间越大驱动力越小,当定义为0时,其代表输入端驱动力无穷大;
输出负载建模:默认情况下,如果没有设置外部输出负载,时序分析工具则默认外部输出负载为0;
1.输出负载可通过sdc命令set_load,定义外部负载为一个等效电容,其电容值即为负载值(指定的是负载的实际电容值);
set_load         10             [all_outputs]set_load           [expr [load_of $lib_name/and2x1m/a]*3]               [all_outputs]  
上述命令定义所有输出负载等效为库中与门and2x1m的引脚a的电容值的3倍;
负载类型:-pin_load,-wire_load可以指定负载类型是引脚负载还是线负载;
2.set_port_fanout_number value port_list
指定输出的扇出数(如果已知外部寄生负载并且已经通过set_load指定了外部寄生负载,则这个命令没有具体含义)
3.set_fanout_load value port_list
指定扇出负载(根据标准负载指定负载值)
其他时钟特性
1.时钟转换时间:
时钟在高低电平状态下切换所需要的延时;
通过scd命令 set_clock_transition 来定义时钟转换延时;
-rise 提供时钟上升沿的转换时间;
-fall 提供时钟下降沿的转换时间;
-max和-min 设置转换时间的最大最小条件;
set_clock_transition -rise 0.2 [get_clocks clk] set_clock_transition -fall -min 0.2 [get_clocks clk] set_clock_transition -fall -max 0.4 [get_clocks clk]  
该命令仅用于预布局阶段,即时钟树综合完成之前,再时钟树生成之后,该命令不应用于任何的后布局时序分析;
2.时钟不确定性
实际时钟本身与理想时钟存在一定的差异,比如时钟抖动,时钟偏斜等因素;
时钟偏斜:时钟到达不同触发器时间差异;
时钟抖动:时钟周期的不良偏差;
如上图,时钟到达p4时间为1.3ns,到达p3时间为1.2ns,那么不确定性延时为1.3-1.2=0.1ns;
通过sdc命令set_clock_uncertainty 可将时钟偏斜和抖动模型化;
set_clock_uncertainty 0.5 [get_clocks clk1] set_clock_uncertainty -setup 0.5 [get_clocks clk2] set_clock_uncertainty -hold 0.2 [get_clocks clk2]  
以上时钟不确定性为建立时间0.5ns,保持时间0.2ns;如下图所示:
不同时钟的不确定性
对于不同时钟不确定度建模时,源时钟可用-form,目的时钟可用-to;
#c1到c2的建立时间和保持时间不确定度set_clock_uncertainty -from c1 to c2 -setup 0.5set_clock_uncertainty -from c1 to c2 -hold 0.5 #c1上升沿到c2下降沿的不确定度set_clock_uncertainty -rise_from c1 fall_to c2  0.5 #c1和c2之间的不确定度set_clock_uncertainty -from c1 to c2  0.5set_clock_uncertainty -from c2 to c1  0.5  
3.时钟延迟
时钟信号从时钟源输出端到达时序单元时钟输入端(如触发器)所需要的时间,称为时钟延迟;
时钟延迟包括源延迟和网络延迟,源延迟是指源时钟到达时钟定义的端口的延迟;
网路延迟是指时钟定义的端口到时序单元时钟输入端的延迟;
通过sdc命令set_clock_latency来定义时钟延迟信息:
-source 设定源延迟:
set_clock_latency -source 0.5 [get_clocks c1]set_clock_latency -source -early 0.5 [get_clocks c1]set_clock_latency -source  -late 1.0 [get_clocks c1]  
最长路径的延迟可用-late,最短路径的延迟可用-early。
或者:
set_clock_latency -source -min 0.5 [get_clocks c1]set_clock_latency -source  -max 1.0 [get_clocks c1]  
当未设定-source时,表示网路延迟;
#上下降沿网路延迟set_clock_latency  0.5 -rise [get_clocks c1]set_clock_latency 0.3  -fall [get_clocks c1]  
时钟网路延迟和时钟源延迟区别:
时钟网络延迟是时钟树生成前的设置,当实际时钟树生成后,时钟网络延迟将通过set_propagated_clock被时钟树的实际结果所替代;而时钟源延迟则会一直存在。
模式分析
恒定状态约束:
根据设计中不同模式的需要,通过设置恒定状态约束来定义时钟选择端口的对应状态值,
在多个模式中选择的时候,设定指定单一模式(相当于mux选择器);
通过sdc命令set_case_analysis定义恒定状态约束;
如上图,假如clk_sel为0时,选择plldiv6_input,clk_sel为1时,选择plldiv2_input,则可设
set_case_analysis 0 [get_pins {mux.clk_sel}]  
上述定义模式端口mux.clk_sel恒定状态为0;
可以是0,1,rising,falling
其他sdc命令
指定工作条件和要执行分析类型:
set_operaing_conditions -max ss_1v62_125c -library ss_1v62_125c  
指定相应工作条件的库(根据pvt温度,电压,工艺决定)
线负载模型:
set_wire_load_model -name smic18_wl10 -library ss_1v62_125c  
屏蔽时序弧:
set_disable_timing -from s -to z [get_cells mux ]  
上述命令屏蔽选择器单元mux中从s端到z端的时序弧;
最大转换时间:
set_max_transition 0.8 [all _outputs]  
上述命令定义所有输出驱动最大转换时间为0.8ns;
最大电容负载:
set_max_capacitance 0.6 [all_outputs]  
上述命令定义所有输出驱动最大电容负载为0.6pf;
最大扇出:
set_max_fanout 15   [all_outputs]  
上述命令定义所有输出驱动最大扇出为15;
附:sdc命令
sdc约束分为:
时序约束
面积与功率约束
设计规则约束
接口约束
特定模式和配置约束
设计要求的异常
其他命令
时序约束
命令包括指定时钟特性,端口延迟,引脚和路径命令;
create_clock
create_generated_clock
set_clock_groups
set_clock_uncertainty
set_clock_latency
set_clock_transition
set_input_delay
set_output_delay
set_propagated_clock
set_clock_gating_check
set_ideal_latency
set_ideal_network
set_ideal_transition
set_max_time_borrow
set_resistance
set_time_derate
set_data_check
group_path
set_load
set_drive
set_input_transiton
set_fanout_load
面积与功率约束
set_max_area
create_valtage_area
set_level_shifter_threshold
set_level_shifter_strategy
set_max_dynamic_power
set_max_leakage_power
设计规则约束
set_max_transition
set_max_capacitance
set_min_capacitance
set_max_fanout
接口约束
set_load
set_drive
set_driving_cell
set_fanout_load
set_port_fanout_numberset_input_transitionset_input_delay
set_output_delay
特定模式和配置约束
set_case_analysis
set_logic_dc
set_logic_zero
set_logic_one
时序例外
set_false_path
set_multicycle_path
set_max_delay
set_min_delay
set_disable_timing
其他命令
set_wire_load_model
set_wire_load_mode
set_wire_load_selection_group
set_wire_load_min_block_size
set_units
set_operating_condition
sdc_version
sdc查询命令
get_cells
get_ports
get_pins
get_nets
get_clocks
all_inputs
all_output
all_registers
all_clocks
get_libs
get_lib_cells
get_lib_pins
current_design


搭建百富链城区块链推广分红系统
Wacom创始人大会:会议主要内容是关于VR和MR的开发
锐捷风电场远程维护解决方案的特点及功能实现
长春中国第一汽车集团历史回顾
蓝牙究竟比WiFi厉害在哪里,看完本文你就知道了
时序分析的设计约束SDC怎么写呢?
瑞为以人脸识别为出发点 未来将带来更多智能化行业应用
AR行业重要切入口解读及四大AR明星公司
nuScenes数据集引发自动驾驶汽车行业的信息共享文化
5G时代,IPTV平台如何顺势而为?5G大屏时代,如何开启智慧全场景?
中搜首推行业垂直搜索 专注电子商务信息
我国政策加速3D打印行业发展,预计2020年规模将超过200亿元人民币
谷歌或推出中国版搜索引擎,百度股价闻声大跌近8%!
台积电和ARM合作范围扩展至20纳米制程以下
5G+AI爆发 后智能电视时代
Purple Pi OH 开发板体验:应用开发的问题
未来是什么材料的世界?探索介质层材料的新趋势和挑战
瑞芯微电子PX5嵌入式芯片参数介绍
UCC3817控制IC设置PFC升压调节器及工作原理
长征七号改中型运载火箭发射出现异常