3270516346
//创建目录
#!/bin/bash
#mkdir -p analyzed
mkdir -p logs
mkdir -p reports
mkdir -p netlist
mkdir -p tmax
mkdir -p svf
mkdir -p WORK
//为变量赋值
export ultra_switch=false
export high_switch=false
export area_switch=false
export power_switch=false
export fix_hold_switch=false
export exit_switch=true
//运行DC,让DC读取”read_rtl.tcl”文件,运行中的输出存放在“read_rtl.log”文件中
dc_shell-xg-t -f ./scripts/read_rtl.tcl |tee -i logs/read_rtl.log
#****************************************************
Date//显示当前时间
#****************************************************
//读取系统变量的值并将值赋给相应的tcl中的变量
set exit_switch [getenv exit_switch]
//设置顶层文件
set TOP_MODULE aes_ASIC
set_svf ${svfDir}/${TOP_MODULE}.svf
//设置工作路径
define_design_lib WORK -path WORK
//读取设计rtl文件
analyze -format verilog -lib WORK [sh ls $topDir/*.v]
elaborate $TOP_MODULE
//显示当前设计
current_design $TOP_MODULE
link//链接设计文件
if { [link] == 0 } {//如果链接错误,则退出
echo "Linking Error when deal with $TOP_MODULE"
exit;
}
Uniquify//保证mudule定义的唯一性
if { [check_design] == 0 } {//检查设计是否正确
echo "Check Design Error when deal with $TOP_MODULE"
exit;
}
//保存设计
write -format ddc -hierarchy -output ${netlistDir}/${TOP_MODULE}_unmapped.ddc
date
#****************************************************
# Finish and Quit
#****************************************************
//退出
if {$exit_switch == "true"} {
exit
}
#!/bin/bash
//创建文件夹
#mkdir -p analyzed
mkdir -p logs
mkdir -p reports
mkdir -p netlist
mkdir -p tmax
mkdir -p svf
mkdir -p WORK
//为变量赋值
#dont enable ultra_switch, too slow
export ultra_switch=false
export high_switch=true
export area_switch=false
export power_switch=false
export fix_hold_switch=false
export exit_switch=true
export remove_tie_dont_use_switch=true
//运行DC并让DC读取”constraint.tcl”文件,运行输出存放到文件”contrainst_compile.log”
dc_shell-xg-t -f ./scripts/constraint_compile.tcl |tee -i
#****************************************************
#Note: clocks and reset signals were assumed as ideal
#****************************************************
#****************************************************
#设置时钟周期
set SYS_CLK_PERIOD 9.0
#****************************************************
#****************************************************
#显示当前时间
date
#****************************************************
#读取系统变量的值,并将值赋给相应的“tcl”变量
set fix_hold_switch [getenv fix_hold_switch]
set exit_switch [getenv exit_switch]
set area_switch [getenv area_switch]
set power_switch [getenv power_switch]
set ultra_switch [getenv ultra_switch]
set high_switch [getenv high_switch]
set remove_tie_dont_use_switch [getenv remove_tie_dont_use_switch]
# Define some variables for design -- {aes_ASIC}
#****************************************************
#设置顶层模块、复位和时钟引脚
set TOP_MODULE aes_ASIC
set Rst_list [list PAD_wb_rst_i]
set Clk_list [list PAD_wb_clk_i]
#生成“svf”文件并指定其存放位置,用于FM时指导FM验证
set_svf ${svfDir}/${TOP_MODULE}.svf
#Read saved unmapped ddc file 读取上一步保存的ddc设计文件
read_ddc ${netlistDir}/${TOP_MODULE}_unmapped.ddc
#****************************************************
# Define The Design Enviroment 设置芯片环境
#****************************************************
#set_min_library是DC98版本引进的一个新命令,该命令允许用户同时指定最坏情况和最佳情况的库。
#set_min_library -min_version
#该命令可用于修正保持时间违例或用于合理优化。
set_min_library smic18_ss.db -min_version smic18_ff.db
set_min_library smic18IO_line_ss.db -min_version smic18IO_line_ff.db
#set_min_library smic18IO_stagger_ss.db -min_version smic18IO_stagger_ff.db
#set_min_library vs_dp_16x64_worst.db -min_version vs_dp_16x64_best.db
#set_operating_conditions 描述了设计的工艺、电压及温度条件。Synopsys库包含这些条件的描述,通常描述为WORST、TYPICAL和BEST情况。
#WORST情况工作条件通常用于布图前综合阶段,因此以最大建立时间优化设计。BEST情况通常用于修正保持时间违例。
#Set_operating_conditions
#有可能用WORST和BEST情况同时进行优化设计。如下所示,在上述命令中使用-min和-max选项进行优化。这对修正设计保持时间违例十分有用。
#set_operating_conditions -min BEST -max WORST
set_operating_conditions -analysis_type bc_wc -min best -max worst
#set_wire_load_mode命令用来为DC提供估计的线载信息,反过来DC使用线载信息把连线延迟建模为负载的函数。
#通常Synopsys工艺库中列出了许多线载模型,每个模型代表一个特定大小的模块。
#set_wire_load_mode -name
#set_wire_load_mode定义了三种同建模连线负载相关的模式,分别为top、enclosed和segmented。
#top模式定义层次中的所有连线将继承和顶层模块同样的线载模型。exclosed指定所有连线(属于子模块的)将继承完全包含该子模块的模块线载模型。例如设计者综合完全被模块A包含的子模块B和C,则子模块B和C会继承为模块A定义的线载模型。
#segmented用于跨越层次边界的连线。在上例中,子模块B和C继承特定于他们的线载模型,而子模块B和C间的连线(在模块A)会继承为模块A指定的线载模型。
#set_wire_load_mode
set_wire_load_mode "segmented"
set_wire_load_model -name reference_area_10000000 -library smic18_ss
#****************************************************
# List of dont use cells. Avoiding scan and jk flip-flops, latches
#不使用单元格列表。 避免扫描和 jk 触发器、锁存器
#****************************************************
if 1 {
set_dont_use smic18_ss/FFSD*
set_dont_use smic18_ss/FFSED*
set_dont_use smic18_ss/FFJK*
set_dont_use smic18_ss/FFSJK*
#if set_dont_use latch, the result is wrong
#set_dont_use smic18_ss/LAT*
#set_dont_use smic18_ss/RSLAT*
#set_dont_use smic18_ss/*LX
#set_dont_use smic18_ss/*1X
#set_dont_use smic18_tt/FFSD*
#set_dont_use smic18_tt/FFSED*
#set_dont_use smic18_tt/FFJK*
#set_dont_use smic18_tt/FFSJK*
#set_dont_use smic18_tt/LAT*
#set_dont_use smic18_tt/RSLAT*
#set_dont_use smic18_tt/*LX
#set_dont_use smic18_tt/*1X
set_dont_use smic18_ff/FFSD*
set_dont_use smic18_ff/FFSED*
set_dont_use smic18_ff/FFJK*
set_dont_use smic18_ff/FFSJK*
#set_dont_use smic18_ff/LAT*
#set_dont_use smic18_ff/RSLAT*
#set_dont_use smic18_ff/*LX
#set_dont_use smic18_ff/*1X
}
#****************************************************
# remove dont_use attribute 删除 dont_use 属性
#****************************************************
if { $remove_tie_dont_use_switch == "true" } {
set_attribute [get_lib_cells smic18_ss/TIE*] dont_touch false
# set_attribute [get_lib_cells smic18_tt/TIE*] dont_touch false
set_attribute [get_lib_cells smic18_ff/TIE*] dont_touch false
set_attribute [get_lib_cells smic18_ss/TIE*] dont_use false
# set_attribute [get_lib_cells smic18_tt/TIE*] dont_use false
set_attribute [get_lib_cells smic18_ff/TIE*] dont_use false
}
#****************************************************
# clock defination and reset
#****************************************************
#MAX freq : 125M
#physical clock and reset
#检查设计
current_design $TOP_MODULE
#建立时钟并指定时钟的引脚、周期、占空比
create_clock -name wb_clk -period $SYS_CLK_PERIOD -waveform [list 0 [expr $SYS_CLK_PERIOD /2]] [get_ports PAD_wb_clk_i]
#create_clock -name wb_clk -period $SYS_CLK_PERIOD -waveform [list 0 [expr $SYS_CLK_PERIOD/2]] [get_pins U_wb_clk_i/D]
#set_dont_touch_network用来对port,pin,clock来设置dont_touch_network的属性。
#所谓的dont_touch_network属性就是在优化的时候,不会对原有的器件进行替换
set_dont_touch_network [all_clocks]
#wb_clk
#set_ideal_network用来对port,pin,net来设置ideal_network属性,所谓的ideal_network属性就是0电阻0电容+所有的cell和net都dont_touch。
#因此就会0转换时间,0延时,综合优化的时候不会对路径的cell和net进行优化。
set_ideal_network [get_pins "U_wb_clk_i/D"]
set_dont_touch_network [get_ports "$Rst_list"]
set_ideal_network [get_ports "$Rst_list"]
#****************************************************
# clock constraints
#****************************************************
#时钟从时钟源到触发器的延时
set_clock_latency 0.8 [all_clocks]
#时钟的不确定时间
set_clock_uncertainty 0.3 [all_clocks]
#时钟转换时间
set_clock_transition 0.3 [all_clocks]
#这个命令可以报出design中的clock信息
report_clocks -nosplit > ${reportsDir}/${TOP_MODULE}.clocks.txt
#****************************************************
# drive and load, max_fanout,max_capacitance
#****************************************************
set MAX_LOAD [load_of smic18_ss/NAND2HD2X/A]
#set_drive命令用于指定输入端口的驱动强度,主要用于模块建模或芯片端口外驱动电阻。
#0值表示最高驱动强度且通常用于时钟端口。
set_drive 0 [get_ports "$Rst_list"]
set_drive 0 [get_ports "$Clk_list"]
#set_driving_cell用于对输入端口驱动单元的驱动电阻进行建模,
#这一命令将驱动单元的名称作为其参数并将驱动单元的所有设计约束应用于模块的输入端口。
set_driving_cell -lib_cell PLBI8S [remove_from_collection [all_inputs] \
[get_ports [list PAD_wb_clk_i PAD_wb_rst_i]]]
#最大电容(maxcapacitance)的约束
set_max_capacitance [expr $MAX_LOAD*12] [get_designs *]
#set_load将工艺库中定义的单位上的容性负载设置到设计的指定连线或端口。
#它主要用于在布图前综合过程中设置模块输出端口的容性负载和往连线上反标注布图后提取的电容信息。
set_load [expr $MAX_LOAD*15] [all_outputs]
#最大扇出(max_fanout)的设计规则的约束
set_max_fanout 10 [all_inputs]
#最大转换时间
set_max_transition 1.0 $TOP_MODULE
#****************************************************
# input delay and output delay
# input delay and output delay were set to 50% clock period
#****************************************************
#should use -max and -min
#define ports (exclude *clk ports)
#jtag ports; use set_case_analysis?
#input delay : max : period - setup
#input delay : min : hold
#output delay : max : setup
#output delay : min : -hold
#列出输入和输出端口
set wb_in_ports [remove_from_collection [all_inputs] [get_ports [list PAD_wb_clk_i PAD_wb_rst_i]]]
set wb_out_ports [get_ports [list PAD_wb_dat_o PAD_wb_ack_o]]
#设置输入和输出延时
set_input_delay -max 5 -clock wb_clk $wb_in_ports
set_input_delay -min 0.1 -clock wb_clk $wb_in_ports
set_output_delay -max 5 -clock wb_clk $wb_out_ports
set_output_delay -min -1 -clock wb_clk $wb_out_ports
#exit
#****************************************************
# false path
#****************************************************
#set_case_analysis is enough?
#FALSE PATH就是我们在进行综合分析时,不希望综合工具进行分析的那些路径。
set_false_path -from [get_ports "$Rst_list"]
#****************************************************
# case_analysis set_case_analysis给某个Pin指定固定电平,然后时序分析会根据该结果优化原先的电路。
#****************************************************
set_case_analysis 0 [get_pins "U_wb_rst_i/D"]
#****************************************************
# area and power 面积和功耗约束
#****************************************************
if { $area_switch == "true" } {
set_max_area 0
}
if { $power_switch == "true" } {
set_max_total_power 0 uw
}
#****************************************************
# don't touchset_dont_touch_network用来对port,pin,clock来设置dont_touch_network的属性。
#所谓的dont_touch_network属性就是在优化的时候,不会对原有的器件进行替换。
#****************************************************
set_dont_touch [get_cells U_* ]
#****************************************************
# Map and Optimize the design
#****************************************************
check_design
#compile
#avoid "assign"
set verilogout_no_tri true
set verilogout_equation false
#dxzhang:should be used only once
#加上这个命令之后,综合之后的网表就不会出现assign语句,否则会出现
set_fix_multiple_port_nets -buffer_constants -all
#compile -map_effort high -boundary_optimization
#compile -map_effort medium -boundary_optimization
if {$ultra_switch == "true"} {
set_ultra_optimization true -force
}
if {$high_switch == "true"} {
#边界优化
compile -map_effort high -boundary_optimization
} else {
compile -map_effort medium -boundary_optimization
}
#****************************************************
# fix_hold_time
#****************************************************
#优化保持时间
if {$fix_hold_switch == "true"} {
set_fix_hold [get_clocks *]
compile -incremental -only_hold_time
}
#检查设计和时序
check_design > ${reportsDir}/${TOP_MODULE}.check_design.txt
check_timing > ${reportsDir}/${TOP_MODULE}.check_timing.txt
#****************************************************
# Output Reports
#****************************************************
report_design -nosplit > ${reportsDir}/${TOP_MODULE}.design.txt
report_port -nosplit > ${reportsDir}/${TOP_MODULE}.port.txt
report_net -nosplit > ${reportsDir}/${TOP_MODULE}.net.txt
report_timing_requirements -nosplit > ${reportsDir}/${TOP_MODULE}.timing_requirements.txt
report_constraint -nosplit -all_violators > ${reportsDir}/${TOP_MODULE}.constraint.txt
report_timing -nosplit > ${reportsDir}/${TOP_MODULE}.timing.txt
report_area -nosplit > ${reportsDir}/${TOP_MODULE}.area.txt
report_power -nosplit > ${reportsDir}/${TOP_MODULE}.power.txt
#****************************************************
# Change Naming Rule
#****************************************************
remove_unconnected_ports -blast_buses [find -hierarchy cell {"*"}]
set bus_inference_style {%s[%d]}
set bus_naming_style {%s[%d]}
set hdlout_internal_busses true
change_names -hierarchy -rule verilog
define_name_rules name_rule -allowed {a-z A-Z 0-9 _} -max_length 255 -type cell
define_name_rules name_rule -allowed {a-z A-Z 0-9 _[]} -max_length 255 -type net
define_name_rules name_rule -map {{"\\*cell\\*" "cell"}}
define_name_rules name_rule -case_insensitive -remove_internal_net_bus -equal_ports_nets
change_names -hierarchy -rules name_rule
#****************************************************
# Output Results
#****************************************************
write -format verilog -hierarchy -output ${netlistDir}/${TOP_MODULE}.vg
write -format ddc -hierarchy -output ${netlistDir}/${TOP_MODULE}.ddc
write_sdf ${netlistDir}/${TOP_MODULE}_post_dc.sdf
write_sdc -nosplit ${netlistDir}/${TOP_MODULE}.sdc
date
#****************************************************
# Finish and Quit
#****************************************************
if {$exit_switch == "true"} {
exit
}