DC综合操作流程设置流程.docx
《DC综合操作流程设置流程.docx》由会员分享,可在线阅读,更多相关《DC综合操作流程设置流程.docx(21页珍藏版)》请在冰豆网上搜索。
DC综合操作流程设置流程
总流程
1:
库的设置
2:
设计的读入
3:
设置环境属性
(1)set_operating_conditions
(2)set_wire_load_model和set_wire_load_mode
(3)setload
(4)set_drive或者set_driving_cell
4:
设计规则约束
(1)set_max_transtion
(2)set_max_capacitance
(3)set_max_fanout
5:
优化约束
(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_area
7:
一些编译命令及DC的输出格式
注意:
1:
在前端设计中一般不做hold_time的约束,hold_time的约束可以在后端修复!
!
!
总流程:
1:
对库进行基本设置,如下:
设置完成后应该查看.synopsys_dc.setup里面库的设置和软件applicationsetup处的设置是否一样!
DC的初始化文件.synopsys.dc.setup需要用ls–a显示,命令:
more.synopsys.dc.setup查看文件内容!
2:
读入设计,两种方法:
read和analyze+elaborate
Analyzer是分析HDL的源程序并将分析产生的中间文件存于work(用户可以自己指定)的目录下;Elaborate则在产生的中间文件中生成verilog的模块或者VHDL的实体缺省情况下,elaborate读取的是work目录中的文件
3:
设置环境定义:
如果不指定operating_conditions,DC自动搜索link_library中的第一个库的工作环境作为优化时使用的工作环境。
(1)set_operating_conditions:
工作条件包括三方面—温度、电压以及工艺;工作条件一般分三种情况:
bestcase,typicalcase,worstcase
图形界面:
#1:
先进入thesymbolviewofthetop界面,选择top模块
#2:
attributes—operatingenvironment—operatingconditions
命令方式:
#1:
可通过report_liblibraryname命令来查看,如下图查看的是slow.db库的工作条件,则使用命令:
report_libslow,右边是report_libfast。
另外一个例子,只是为了说明库中的libraryname必须是用report_lib命令得到下面图形中的conditions里面的库的name:
(******自己想的******)
#2:
一般综合时候只需考虑最差和最好两种情况即可,最差情况用于做建立时间(setuptime)的时序分析,最好情况用于做保持时间(holdtime)的时序分析。
最差情况-max下使用slow.db库,最好情况-min下使用fast.db库;
{最差和最好情况和温度以及电压有很大关系,温度越大,延时越大;电压越大,延时越小;不过温度对延时的作用更大}
所以:
##1:
做建立时间分析时候用最差情况,命令:
set_operating_conditions–max“slow”
##2:
如果既要分析建立时间,又要分析保持时间,则需要两条命令:
set_min_libraryslow.db–min_versionfast.db
set_operating_conditions–minfast–maxslow
首先通过命令set_min_library同时设置worst-case和best-case的library,然后通过set_operating_conditions命令指定不同环境下使用的库模型;
上面的命令指定的是:
fast库用于对holdtime优化,slow库用于对setuptime进行优化。
set_operating_conditions–minfast–maxslow命令中的–minfast和–maxslow可以互换。
(2)set_wire_load_model和set_wire_load_mode
命令方式:
#1:
set_wire_load_model:
设置连线负载模型,为了估计模块输出的时序—transitiontime;DC默认输出负载为0
负载模型可以通过report_liblibraryname命令下查看线的模型种类,如下图是fast.db库中的几种线的模型。
在布局布线前应使用较悲观的模型,对最坏的情况做综合,线负载模型由目标库提供。
-max–min选项指定该模型用于估计最大路径延迟和最小路径延迟。
例如:
(写一个即可)
set_wire_load_model-nametsmc13_wl40-min
set_wire_load_model-namesmic13_wl50–max:
最坏情况
或者可以直接设置负载模型:
set_wire_load_model-nametsmc13_wl40-libraryslow
表示使用的是slow库里的tsmc13_wl40线模型。
#2:
自己不清楚如何选择的话,则让DC自动选择
setauto_wire_load_selectiontrue
#3:
上面的设置完成后,需要对负载模块的使用位置加以说明,三种模式,命令如下:
set_wire_load_modetop或
set_wire_load_modeenclosed或
set_wire_load_modesegmented
关系如下:
top :
指定模块互连线延迟的估计使用顶层模块的线负载模型
enclosed:
指定模块互连线延迟的估计使用包含该连线的最小模块的线负载模型
segmented:
将连线按模型边界分段,各段的延迟分别按照各自模块的线负载模型估计延迟,然后把估计结果相加得到该连线的延迟
一般情况下使用的是:
set_wire_load_modetop
图形界面:
上图中的第一步指的是先选择top模块,然后设置top模块下的环境属性。
***附加:
还可以给某个模块设置负载模型:
(下面设置timer模块)***
setcurrent_designtimer***先转到timer模块下***
set_wire_load_model-nametsmc13_wl40
或者下面的:
(3)setload:
设置输出负载
比较精确地计算输出电路的延迟,DC需要知道输出电路驱动的所有负载。
该命令有两种用法:
一种是直接给端口赋一个具体的值,另一种是结合命令load_of指出它的负载相当于工艺库中哪个单元的负载值。
命令方式:
#1:
set_load5[get_portsOUT1]
#2:
set_load[load_ofmy_lib/and2a0/A][get_portsOUT1]
说明OUT1端口接的负载值地my_lib中and2a0单元的A管脚的负载值。
#3:
把上面命令set_load[load_ofmy_lib/and2a0/A][get_portsOUT1]中的get_portsOUT1换为all_outputs就可以给全部输出端口赋值。
其中load_of命令可以算出某个引脚的负载电容值。
电路负载的大小会影响到它的延迟,而且负载越大,延迟越大,DC在缺省情况下认为端口的负载电容都是0,因此具有无穷大的驱动能力。
图形界面:
必须先选中全部的输出负载然后再设置负载值!
!
!
!
!
***********具体如何找这个负载不清楚!
!
!
!
!
!
!
!
!
!
!
****************
(4)set_drive或者set_driving_cell:
设置输入驱动。
为了更加准确估计模块的输入时序,为了更加准确的估计输入电路的延迟,DC需要知道信号到达输入端口的过渡时间(transitiontime)。
默认下,DC认为输入驱动的驱动能力无限大,即transitiontime=0;
Set_drive使用确定的值来估计输入端的输入电阻,从而得到输入端口的延迟;
set_driving_cell是假定一个实际的外部驱动单元来估计输入的transitiontime;
该命令用于设置输入端口或者双向端口上的电阻值,该电阻值是用于驱动输入端口的单元的输入电阻,因此,该值越大,就说明输入端口的驱动能力越弱,连线的延迟也就越大。
更常用的是set_driving_cell命令,以库中某个单元电路的引脚驱动能力为基准来模拟输入端口的驱动能力。
例1:
首先通过drive_of指定具体的驱动单元电阻值,得到驱动单元电阻后,通过:
set_drive+值+[get_portsclk]命令给输入端口clk赋值。
下图是给除了clk以外的其它输入端口驱动:
4:
设计规则约束约束(DRC:
design_rule_constraint)
DRC规则的优先级:
transition>fanout>capacitance
(1)set_max_transtion:
设置最大传输时间
连线的转换时间是其驱动引脚的逻辑电平变化的时间,包括risingtime和falling,从10%的VDD变化到90%的VDD所需的时间。
设定最大的转换时间set_max_transtion,这个值一般设为周期的10%。
例如:
set_max_transtion1.8[current_design]一般情况下current_design指的是top。
(2)set_max_capacitance:
输出管脚可以驱动的最大电容值
定义输出管脚可以驱动的最大电容值。
例:
set_max_capacitance1.5[get_portsout1]或者
set_max_capacitance1.5[get_designstop]
(3)set_max_fanout:
设置最大扇出负载
连线的最大扇出负载指的是它所驱动的所有输入引脚的扇出负载的总和。
扇出负载不同于负载,它是个无量纲的数值。
max_fanout经验值一般设为20,即一个门的输出最多驱动20个输入引脚(如果每个引脚的输出负载是1的话)。
******计算fanout值,如下*******
或者:
set_max_fanout3.0[all_outputs]
图形界面:
在attributes-optimizationconstraints-designconstraints
5:
优化约束OptimizationConstraints
(1)create_clock:
用于定义时钟的周期和波形(duty及起始沿)
duty:
占空比,指高电平在一个周期所占的时间比率。
命令:
create_clock–period40–waveform{020}[get_portsclk]:
表示CLK周期40ns,上升沿0ns,下降沿20ns;如果不定义waveform,则默认占空比为50%。
或者:
或者:
#1:
set_dont_touch_network:
在net或port上设置don’ttouch属性,主要用于clock和reset信号,使DC不对这些nets插buffer,留到布局布线时综合。
#2:
set_dont_touch:
用于对current_design,cells,references,nets设置don’ttouch属性,阻止DC对它们进行映射或优化,一般在分模块综合和综合后优化时使用。
例:
set_dont_touch[get_cellsX_DATA_N_1_33B_reg[0]]
(2)set_clock_uncertainty:
定义好时钟后,就要设置时钟不确定性,即反映时钟偏差(clockskew),一般设为0.2-0.3。
命令:
set_clock_uncertainty0.3[get_clockscore_clk]
(3)set_clock_latency:
模拟时钟树插入后从时钟输入端口到寄存器clock端口的延时,用于布局布线前的综合和时序分析,一般设0.3-0.8。
命令:
set_clock_latency0.3[get_clockscore_clk]
set_clock_latency默认情况下代表:
NetworkLatency
(4)set_input_delay(看另一个总结的时序分析文档)
对于输入和输出延时,若不知要求,可设延时为周期的40%
命令:
set_input_delay–clockclk_name–maxmax_value–minmin_value
命令中的-max的选项:
指定输入的最大延迟,为了满足时序单元建立时间(setuptime)的要求。
-min的选项:
指定输入的最小延迟,为了满足时序单元保持时间(holdtime)要求。
例如:
set_input_delay–max5.8-clockclk_62_5M[all_inputs]
设置所有最大输入延迟为5.8ns,所有输入信号受到clk_62_5M时钟信号约束!
remove_input_delay[get_ports[listclk_62_5Mrst]]
去掉像clk、rst这些不需要设置输入延时的信号!
(5)set_output_delay:
命令和设置input_delay一样。
(6)set_false_path:
虚假路径。
set_false_path命令用于给出异步电路或者逻辑上不存在的电路,优化的时候所有加在该路径上的限制条件都不予以考虑。
如果要取消该设置,使用reset_path命令。
指出异步电路的路径:
如果CLKA和CLKB是属于不同的时钟晶振,因此,CLKA到CLKB的路径是异步电路。
set_false_path–from[get_clocksCLKA]–to[get_clocksCLKB]set_false_path–from[get_clocksCLKB]–to[get_clocksCLKA]
set_false_path-throughreset
其中reset信号一般采用“异步复位,同步置位”方式(置位是强制置1,复位是强制置0),所以对于reset信号和跨越时钟域的信号,都要设置为伪路径。
其它资料释义:
falsepath指的是电路中一些不需要考虑时序约束的路径,一般出现在异步逻辑中。
对多时钟域或不可实现的路径的处理:
用set_false_path指示DC不对这些路径进行时序优化,如果不对falsepath路径进行标识,DC会对所有的路径进行优化,从而影响关键时序路径。
(7)set_multicycle_path:
设置多路径
(8)set_max_delay和set_min_delay:
设置路径的最大最小延迟。
如果电路完全是组合逻辑电路,而没有时钟,可以使用这两条命令直接限制路径的最大最小的延迟。
例如,限制一个reset信号:
由于reset信号跨越了不同的模块,因此,一般在顶层模块中对该模块做限制:
即指定所有reset信号出发的路径的最大延迟都为5,
set_max_delay5–fromreset
限制一个从IN输入到OUT输出的最小路径:
set_min_delay10–fromIN–toOUT或
限制所以输入到输出的最小路径:
set_min_delay2–from[all_inputs]–to[all_outputs]
(9)set_max_area
current_designtop
set_max_area0(常用)
将top模块的面积设为0,此时综合后电路肯定不满足要求,但DC会对电路的面积进行优化,达到可能的最小面积,同时使得综合之后的电路没有“弹性”。
或者下面:
(不常用)
图像界面:
上图中的maxrise和minrise就是inputs或者outputs端口的最大延迟和最小延迟!
!
!
!
!
选择时候选中sameriseandfall选项!
!
!
以上所有的语句并不是需要全部都设置的,根据自己的设置来判断需要设置的内容即可!
!
!
!
!
!
!
!
!
!
上面设置完成后进行uniquify实例唯一化设置,然后再编译,方法:
(不是所有都有这一步的,看情况)
(1)界面上:
hierarchy—uniquify—hierarchy,出现对话框后选择ok,也可选中下面的instancestoberenamed…小框框,是进行强制唯一化的。
(2)命令:
uniquify或者uniquify–force(强制将所有调用模块重新命名)
7:
开始编译:
*****编译
compile
report_constraints或者report_constraint–all_violators//报告没有满足时序的约束条件
此时如果不满足的话可以加大映射的effort,如:
compile–map_efforthigh或其它命令进行优化。
report_timing
change_names-ruleverilog–hier
set_fix_multiple_ports_net–all
set_fix_hold[all_clocks]修正holdtime
write-formatverilog-hier-outputmux.sv//输出网表,自动布局布线需要(注意是.sv格式)
write-formatddc-hier-outputmux.ddc//输出ddc
write_sdfmux.sdf//输出延时文件,使用PT做静态时序分析时需要
write_sdcmux.sdc//输出约束设置信息,使用Astro或encounter自动布局布线需要
其它命令:
report_clock–skew–attribute生成时钟报告
report_port–verbose报告端口信息
report_port–vclk查看时钟端口所有属性
8:
DC的几种输出文件:
write–fddc–hierarchy–outputmy_ddc.ddc
write–fverilog–hierarchy–outputmy_verilog.v
#Writeouttheconstraints-onlysdcfile:
约束信息,布局布线需要
write_sdcmy_design.sdc
#Writeoutthescanchaininformation:
布局布线需要
write_scan_def–outmy_design.def
#Writeoutthephysicalconstraints:
输出全部的物理约束,布局布线需要
write_physical_constraints–outputPhysConstr.tcl
write_sdfmy_design.sdf:
输出延时信息,STA分析使用
-format:
指定保存的格式,可选的格式有:
db,edif,equation,lsi,mentor,pla,st,tdl,verilog,vhdl,xnf,缺省为db
-hierarchy:
指令DC保存所有设计层次
-output:
指定保存的文件名
电路综合完成之后,可以用report命令将电路的一些信息report出来分析,阅读报告时主要需要注意几个部分:
1)、看看报告中的综合库、线负载模型、工作条件等是不是你所要求的。
2)、看看报告的路径是最大路径还是最小路径,即看报告中的Pathtype为max,该路径是为了满足library中FF的setuptime的要求。
3)、看路径中是否有很大延迟的单元,或者输入/输出延迟是否很大
4)、看关键路径上是否有slack
5)、这样综合完成之后,对于最差工作环境下的库如果没有问题,对于最好的工作情况,可能会出现Holdtimeviolation.这时可用set_fix_hold[all_clocks],之后再compile,来让DC对电路中的holdtimeviolation进行处理。
6)、如果在综合之后发现电路中出现violation,即电路的时序不能满足要求,
当出现的slack比较小时,可以使用一些综合的选项来减小这些slack;如果slack比较大,通过综合的这些选项无法解决,则需要返回重新写HDL源代码。
一般在综合时violation较小时,可以用compile–inc–maphigh来减小路径的延迟。