总流程1:库的设置2:设计的读入3:设置环境属性(1)set_operating_conditions(2)set_wire_load_model 和 set_wire_load_mode(3)set load(4)set_drive 或者 set_driving_cell4:设计规则约束(1)set_max_transtion(2)set_max_capacitance(3)set_max_fanout5:优化约束(1)create_clock(2)set_clock_uncertainty(3)set_clock_latency(4)set_input_delay(5)set_output_delay(6)set_false_path(7)set_multicycle_path(8)set_max_delay 和 set_min_delay(9)set_max_area7:一些编译命令及 DC 的输出格式注意:1:在前端设计中一般不做 hold_time 的约束,hold_time 的约束可以在后端修复!!!总流程:1:对库进行基本设置,如下:设置完成后应该查看.synopsys_dc.setup 里面库的设置和软件 application setup 处的设置是否一样!DC 的初始化文件.synopsys.dc.setup 需要用 ls –a 显示,命令:more .synopsys.dc.setup 查看文件内容!2:读入设计,两种方法:read 和 analyze+elaborateAnalyzer 是分析 HDL 的源程序并将分析产生的中间文件存于 work(用户可以自己指定)的目录下;Elaborate 则在产生的中间文件中生成 verilog 的模块或者VHDL 的实体缺省情况下,elaborate 读取的是 work 目录中的文件3:设置环境定义:如果不指定 operating_conditions,DC 自动搜索 link_library中的第一个库的工作环境作为优化时使用的工作环境。
1) set_operating_conditions:工作条件包括三方面 —温度、电压以及工艺;工作条件一般分三种情况:best case, typical case, worst case图形界面:#1:先进入 the symbol view of the top 界面,选择 top 模块#2:attributes—operating environment—operating conditions命令方式:#1:可通过 report_lib libraryname 命令来查看,如下图查看的是 slow.db库的工作条件,则使用命令:report_lib slow,右边是 report_lib fast另外一个例子,只是为了说明库中的 library name 必须是用 report_lib 命令得到下面图形中的 conditions 里面的库的 name:(******自己想的******)#2:一般综合时候只需考虑最差和最好两种情况即可,最差情况用于做建立时间(setup time)的时序分析,最好情况用于做保持时间( hold time)的时序分析最差情况-max 下使用 slow.db 库,最好情况-min 下使用 fast.db 库;{最差和最好情况和温度以及电压有很大关系,温度越大,延时越大;电压越大,延时越小;不过温度对延时的作用更大} 所以: ##1: 做建立时间分析时候用最差情况,命令:set_operating_conditions –max “slow”##2: 如果既要分析建立时间,又要分析保持时间,则需要两条命令:set_min_library slow.db –min_version fast.dbset_operating_conditions –min fast –max slow首先通过命令 set_min_library 同时设置 worst-case 和 best-case 的library,然后通过 set_operating_conditions 命令指定不同环境下使用的库模型;上面的命令指定的是:fast 库用于对 hold time 优化,slow 库用于对setup time 进行优化。
set_operating_conditions –min fast –max slow 命令中的 –min fast 和–max slow 可以互换2) set_wire_load_model 和 set_wire_load_mode命令方式:#1:set_wire_load_model: 设置连线负载模型, 为了估计模块输出的时序—transition time;DC 默认输出负载为 0负载模型可以通过 report_lib libraryname 命令下查看线的模型种类,如下图是 fast.db 库中的几种线的模型在布局布线前应使用较悲观的模型,对最坏的情况做综合,线负载模型由目标库提供max –min 选项指定该模型用于估计最大路径延迟和最小路径延迟例如:(写一个即可)set_wire_load_model -name tsmc13_wl40 -minset_wire_load_model -name smic13_wl50 –max :最坏情况或者可以直接设置负载模型:set_wire_load_model -name tsmc13_wl40 -library slow表示使用的是 slow 库里的 tsmc13_wl40 线模型。
2:自己不清楚如何选择的话,则让 DC 自动选择set auto_wire_load_selection true#3:上面的设置完成后,需要对负载模块的使用位置加以说明,三种模式,命令如下:set_wire_load_mode top 或set_wire_load_mode enclosed 或set_wire_load_mode segmented 关系如下:top : 指定模块互连线延迟的估计使用顶层模块的线负载模型enclosed: 指定模块互连线延迟的估计使用包含该连线的最小模块的线负载模型segmented: 将连线按模型边界分段,各段的延迟分别按照各自模块的线负载模型估计延迟,然后把估计结果相加得到该连线的延迟一般情况下使用的是:set_wire_load_mode top图形界面:上图中的第一步指的是先选择 top 模块,然后设置 top 模块下的环境属性附加:还可以给某个模块设置负载模型:(下面设置 timer 模块)***set current_design timer ***先转到 timer 模块下***set_wire_load_model -name tsmc13_wl40 或者下面的:(3) set load:设置输出负载 比较精确地计算输出电路的延迟,DC 需要知道输出电路驱动的所有负载。
该命令有两种用法:一种是直接给端口赋一个具体的值,另一种是结合命令load_of 指出它的负载相当于工艺库中哪个单元的负载值命令方式:#1:set_load 5 [get_ports OUT1] #2:set_load [load_of my_lib/and2a0/A] [get_ports OUT1]说明 OUT1 端口接的负载值地 my_lib 中 and2a0 单元的 A 管脚的负载值3:把上面命令 set_load [load_of my_lib/and2a0/A] [get_ports OUT1]中的get_ports OUT1 换为 all_outputs 就可以给全部输出端口赋值其中 load_of 命令可以算出某个引脚的负载电容值电路负载的大小会影响到它的延迟,而且负载越大,延迟越大,DC 在缺省情况下认为端口的负载电容都是 0,因此具有无穷大的驱动能力图形界面:必须先选中全部的输出负载然后再设置负载值!!!!!***********具体如何找这个负载不清楚!!!!!!!!!!!****************(4) set_drive 或者 set_driving_cell:设置输入驱动。
为了更加准确估计模块的输入时序,为了更加准确的估计输入电路的延迟,DC 需要知道信号到达输入端口的过渡时间(transition time) 默认下,DC 认为输入驱动的驱动能力无限大,即 transition time=0;Set_drive 使用确定的值来估计输入端的输入电阻,从而得到输入端口的延迟;set_driving_cell 是假定一个实际的外部驱动单元来估计输入的 transition time;该命令用于设置输入端口或者双向端口上的电阻值,该电阻值是用于驱动输入端口的单元的输入电阻,因此,该值越大,就说明输入端口的驱动能力越弱,连线的延迟也就越大更常用的是 set_driving_cell 命令,以库中某个单元电路的引脚驱动能力为基准来模拟输入端口的驱动能力例 1:首先通过 drive_of 指定具体的驱动单元电阻值,得到驱动单元电阻后,通过:set_drive+值+[get_ports clk] 命令给输入端口 clk 赋值下图是给除了 clk 以外的其它输入端口驱动:4:设计规则约束约束(DRC:design_rule_constraint)DRC 规则的优先级 : transition>fanout>capacitance(1) set_max_transtion:设置最大传输时间连线的转换时间是其驱动引脚的逻辑电平变化的时间,包括 rising time 和falling,从 10%的 VDD 变化到 90%的 VDD 所需的时间。
设定最大的转换时间 set_max_transtion,这个值一般设为周期的 10%例如:set_max_transtion 1.8 [current_design] 一般情况下 current_design 指的是 top2) set_max_capacitance:输出管脚可以驱动的最大电容值定义输出管脚可以驱动的最大电容值例:set_max_capacitance 1.5 [get_ports out1] 或者set_max_capacitance 1.5 [get_designs top](3) set_max_fanout:设置最大扇出负载连线的最大扇出负载指的是它所驱动的所有输入引脚的扇出负载的总和扇出负载不同于负载,它是个无量纲的数值max_fanout 经验值一般设为 20,即一个门的输出最多驱动 20 个输入引脚(如果每个引脚的输出负载是 1 的话) 计算 fanout 值,如下*******或者: set_max_fanout 3.0 [all_outputs]图形界面:在 attributes-optimization constraints-design constraints5:优化约束 Optimization Constraints(1) create_clock: 用于定义时钟的周期和波形(duty 及起始沿)duty:占空比,指高电平在一个周期所占的时间比率。
命令:create_clock –period 40 –waveform{0 20} [get_ports clk] :表示 CLK 周期40ns,上升沿 0 ns,下降沿 20 ns; 如果不定义 waveform, 则默认占空比为 50%或者:或者:#1: set_dont_touch_network:在 net 或 port 上设置 don’t touch 属性,主要用于clock 和 res。