#script for Design Compiler DC综合编译脚本
#language:TCL 语言说明
#Usage: 使用说明

1)make sure the lib in the current directory 确保设计库在正确的文件夹下

2) if you have the file .synopsys_dc.setup, 用来设置是否定义过dc的启动文件,

set synopsys_dc_setup_file 1, 如果定义过了就设置变量为1

if not, set synopsys_dc_setup_file 0 没有的话设置变量为0,

3) change Step 3 : Variables to what you want 第三个步骤主要是设置一些变量,不同项目里面设置这里基本就可以了

Especially : top module name, clock name, 例如设置一些顶层名字,时钟名字,复位名字,文件名和周期等等的变量

reset name, all files name, and period

4) typing dc_shell-t -f run_72.tcl | tee -i run.log dc综合的启动命令,使用脚本启动,-t表示脚本启动,|是管道符,

#前面一条的输出会成为后面的输入,tee命令将前面命令的标准输出保存到文件.log中,以便以后查看,
#意思是运行完dc_shell -t -f命令后会在终端出现一堆的信息,这些信息被写入.log文件中

#整个脚本分为8个步骤

set synopsys_dc_setup_file 0 #首先定义启动文件变量为0,表示还没有设置过启动文件,需要设置,如果设置为1,下面的if语句就不会执行,表示设置好了
#-----------------------------------------------------

Step 1 : 步骤一:设置一下启动文件,就是一些工艺库和搜索路径

Setting Up path and library:

If you have edited the file .synopsys_dc.setup, then you can skip over this step

#-----------------------------------------------------
if { $synopsys_dc_setup_file == 0} {
set search_path [list /home/chanshi/dc/library/smic /home/chanshi/dc/rfid/source /home/chanshi/dc/script] 设置搜索路径列表
set target_library {typical.db} 设置目标库,也就是工艺库
#set target_library {CSM35OS142_typ.db};

if you want use typical library,change to typical.db

#set link_library [list {} ram_interp_typical_syn.db ram_458_typical_syn.db typical.db]
set link_library [list {
} $target_library] 设置链接库列表,一般和目标库一样,可以连接已经综合的一些单元到设计中
}
#set symbol_library {csm18ic.sdb csm18io.sdb} 设置符号库
#set synthetic_library {dw_foundation.sldb}; 设置综合库,主要是一些可以综合的ip,一般是没有的,除非有特殊要求,才会加这个库

Design Ware

set command_log_file “command.log” 定义命令日志文件

#-----------------------------------------------------

Step 2 :

Compile Swithes

#set verilogout_no_tri true ;

if inout used, tri net will be used

#通过将三态(tri)逻辑声明成线网(wire)来确保网表中不会出现三态逻辑,因为一些布线工具很难读取包含tri、tran源语、assign语句的网表,对于“inout”类型的port,DC产生tri wire 语句和tran 源语,对于tri,还会产生assign语句
set test_default_scan_style multiplexed_flip_flop
#设置扫描链的类型,还可以通过set_scan_configuration -style来设置
set link_force_case case_insensitive
#设置link命令是否区分大小写,默认是check_reference,就是根据产生reference的模块格式来判断是否大小写敏感,如果是vhdl格式就是不敏感,如果是verilog就敏感
define_name_rules VLSI_NET -allowed “a-zA-Z0-9_” -first_restricted “0-9_” -type net -max_length 256 设置命名规则,
define_name_rules VLSI_CELL -allowed “a-zA-Z0-9_” -first_restricted “0-9_” -type cell -max_length 256
define_name_rules VLSI_PORT -allowed “a-zA-Z0-9_” -first_restricted “0-9_” -type port -max_length 256
define_name_rules TAN_RULE -allowed “a-zA-Z0-9_” -first_restricted “0-9_[]” -max_length 256 -map {{{“cell”, “mycell”}, {"*-return", “myreturn”}}};
set hdlin_check_no_latch “true”
#设置如果推断出锁存器,是否报warning,默认是false,即不报。
set hdlin_merge_nested_conditional_statements “true”
#顾名思义,是否把嵌套的if融合,默认值是false,就是对于嵌套的条件语句(if或case语句)中的每一个if和case都推断出一个选择器,这种做法有利于把某些迟到的条件判断信号(late arriving signals)安排到离输出最近的选择器上(进而有利于减小延迟),如果设成true,就会把这些选择器融合成一个大的选择器,这样所有的选择信号到输出的距离都是相同的

#-----------------------------------------------------

Step 3 :步骤三主要定义一些变量,以便后面的命令调用

Define Variables

#-----------------------------------------------------
set active_design “whole_modules”; 定义顶层名

Top module name

source files.tcl; 执行files.tcl文件

All RTL source_files (verilog)

set clock_name “clk”; 定义时钟名

Name of clock

set reset_name “reset”;定义复位名

Name of reset

set clk_period 70.0 定义时钟周期
#定义时钟周期,注意带小数点,这样计算出的值都带小数点,不然小于1的数都显示为0

Desired Clock Period = 1000/Frequence

set clk_uncertainty_setup [expr $clk_period/200]; 定义时钟抖动
#定义时钟不确定性,这里只定义了相对于建立时间的不确定性,就是时钟上升沿有可能提前 clk_uncertainty_setup(时钟偏差和时钟抖动之和)到来,dc要提前clk_uncertainty_setup检查建立时间是否满足

Uncertainty of clock

set clk_latency [expr $clk_period/10]; 定义时钟延时
#定义时钟延迟,是时钟信号从其实际时钟原点到设计中时钟定义点的传输时间

Network Latency of clock

#考虑reg1+combo1--------combo2_input+reg2+combo2_output-----------combo3+reg3的模型来解释input_delay和output_delay,中间的combo2_input+reg2+combo2_output是要综合的模块
set input_delay [expr $clk_period/4]; 定义外部输入延迟,可以假定外部是一个D触发器和一个组合逻辑组成,那么输入延迟就包括触发器的延时加组合逻辑的延时
#定义一个外部输入(组合逻辑combo1)用了多少时间(即从时钟上升沿到输入数据到来经历的延迟),dc计算还有多少时间留给内部组合逻辑combo2_input,例如时钟周期为10ns,input_delay是4ns,则还有(6-tsu)留给内部组合逻辑combo2_input

Input Delay of all input ports except clock

set output_delay [expr $clk_period/4];定义外部输出延迟,
#定义一个外部输出(组合逻辑combo3)用了多少时间(即外部组合逻辑的延迟),dc计算有多少时间留给内部组合逻辑combo2_output,例如时钟周期为10ns,output_delay为4ns,则还有(6-Tclk2Q)留给内部组合逻辑combo2_output

Output Delay of all output ports

set area_desired 0;
#定义面积的期望值,用于set_max_area
set wire_load_model “smic18_wl20”;
#为了精确地计算设置线载模型(DC支持三种模式:

以此来决定如何选择用于跨层次边界的网线的线载模型),用于计算时序路径的延迟,用于set_wire_load_model

Model of the intra net

set output_load “typical/NAND2BX1/AN” ;
#为了精确地计算输出电路的时间,需要设置端口负载(输出或输入的外部电容负载),就是为所有输出端口指定一个负载,综合时dc就会认为这里有一个这样的负载(并不是说综合时在这里强制添加一个电容),dc综合时就会选择满足这个负载的器件,例如假设已经知道某输出端口要驱动的是一个反相器,那么把输出负载设置成这个反相器的输入负载即可,当然可以设置成很大,这样dc就会用驱动能力很大的器件,来满足所有单元被驱动。这个指令的作用是在布图前综合过程中设置模块输出端口的容性负载和往连线上反标注布图后提取的电容信息,这里选取某一器件的某一引脚的负载作为output load,也就是dc认为所有输出端口要达到能驱动这个引脚

model of the output_load

set synthesis_reports {/home/chanshi/dc/report};
#指定综合报告的输出目录
#name of report directory
sh mkdir synthesisreports;settimingreport"synthesis_reports; set timing_report "synthesisr​eports;settimingr​eport"synthesis_reports/activedesign_timing.rpt"settimingmax20report"active_design\_timing.rpt" set timing_max20_report "actived​esign_timing.rpt"settimingm​ax20r​eport"synthesis_reports/activedesign_timingmax20.rpt"setareareport"active_design\_timing_max20.rpt" set area_report "actived​esign_timingm​ax20.rpt"setarear​eport"synthesis_reports/activedesign_area.rpt"setreferencesreport"active_design\_area.rpt" set references_report "actived​esign_area.rpt"setreferencesr​eport"synthesis_reports/activedesign_references.rpt"setcellreport"active_design\_references.rpt" set cell_report "actived​esign_references.rpt"setcellr​eport"synthesis_reports/activedesign_cell.rpt"setconstraintreport"active_design\_cell.rpt" set constraint_report "actived​esign_cell.rpt"setconstraintr​eport"synthesis_reports/activedesign_constraint.rpt"setpowerreport"active_design\_constraint.rpt" set power_report "actived​esign_constraint.rpt"setpowerr​eport"synthesis_reports/activedesign_power.rpt"setchecksyntaxreport"active_design\_power.rpt" set check_syntax_report "actived​esign_power.rpt"setchecks​yntaxr​eport"synthesis_reports/$active_design_check_design.rpt"
set synthesis_netlist {/home/chanshi/dc/result};
#指定网表和sdf/sdc/db文件输出目录,本dc不支持生成db文件
#name of outfile directory
sh mkdir KaTeX parse error: Expected 'EOF', got '#' at position 20: …hesis_netlist; #̲创建目录 set out_ne…synthesis_netlist/activedesign.v";setoutdb"active_design.v"; set out_db "actived​esign.v";setoutd​b"synthesis_netlist/activedesign.db";setoutsdf"active_design.db"; set out_sdf "actived​esign.db";setouts​df"synthesis_netlist/activedesign.sdf";setoutsdc"active_design.sdf"; set out_sdc "actived​esign.sdf";setouts​dc"synthesis_netlist/$active_design.sdc";

#-----------------------------------------------------

Step 4 : 读取文件到DC

Read design to DC Memory

#-----------------------------------------------------
foreach active_files $files {read_verilog KaTeX parse error: Expected 'EOF', got '}' at position 13: active_files}̲ read_verilog可以…files是一个文件列表,把列表里的每一个文件轮流赋值给active_files,然后对active_files执行read_verilog函数,就相当于轮流对每一个文件执行read_verilog函数
#exit
current_design $active_design 设置顶层
#设置当前设计
link
#把当前设计中实例化引用的单元链接到当前设计(即读取link_library指定的库到当前设计)
uniquify
#为每一个例化单元起一个单独的名字(是对于某个模块多次引用的情况)
#check_design > $check_syntax_report
#if {[check_design] == 0} {

echo “Check Design Error!”;

exit;

}

#-----------------------------------------------------

Step 5 :

Constraint 设置约束

#-----------------------------------------------------
#-----Net load------
set_wire_load_model -name $wire_load_model
#设置线载模型
set_wire_load_mode top
#设置线载模式(top:所有层次中所有连线将继承和顶层模块同样的线载模型,因为顶层电路规模最大,所以连线延迟最大,线载模型最悲观;enclosed:选择连线所在的子模块的线载模型,子模块电路规模较顶层要小,连线延迟较短;segmented:不常用,用于跨层次边界的连线)
#-----clock------
create_clock -name $clock_name -period [expr $clk_period] [get_ports $clock_name]
#设置时钟
set_clock_uncertainty -setup $clk_uncertainty_setup [get_clocks $clock_name]
#设置时钟不确定性
set_clock_latency $clk_latency [get_clocks $clock_name]
#设置时钟延迟
set_dont_touch_network [get_clocks $clock_name]
#在优化过程中对时钟网络不进行改变和替换,原因:由于时钟端口的负载很大,DC 会使用 Buffer 来增加其驱动能力。但一般设计者都使用布局布线工具来完成此项工作,所以有必要指示 DC 不要对时钟网络进行修改,可以选中上图中“Don’t touch network”进行设置。
set_dont_touch_network [get_ports $reset_name]
#在优化过程中对复位信号不进行改变和替换
set_ideal_network [get_ports $reset_name]
#对reset设置成理想线网,因为reset的fanout太大,一般布图前都设置成理想线网,具体原因有待研究#-----drive------
#set_driving_cell -lib_cell xr02d2 -pin A1 -library CSM35OS142_typ [all_inputs]
set_driving_cell -lib_cell NAND2BX1 -pin Y [all_inputs]
#为所有输入端口(除去时钟和复位)设置驱动模型,从而指定了驱动强度和转换时间
set_drive 0 [get_ports $clock_name]
#将时钟驱动能力设为无穷大,即将其阻抗设为 0
set_drive 0 [get_ports $reset_name]
#同上
#-----input/output delay------
set allin_except_CLK [remove_from_collection [all_inputs] [get_ports clk]]
set_input_delay [expr $input_delay] -clock $clock_name $allin_except_CLK
#设置输入延时除了时钟端口
set_output_delay [expr $output_delay] -clock $clock_name [all_outputs]
#设置输出延时
#-----Output load------
set_load [load_of $output_load] [all_outputs]
#设置所有输出端口的负载
#----- Area ------
#set_max_area $area_desired
#----- insert buffer replace assign ------
set_fix_multiple_port_nets -all -buffer_constants
#如果一个线网连接着多个端口,则在网表中会出现assign语句,这是一种错误,为避免这种错误,要消除多端口连线,可以通过插入buffer来消除(具体见《专用集成电路设计实用教程》p146)

#-----------------------------------------------------

Step 6 : 优化命令

Compile

Also can use compile_ultra

#-----------------------------------------------------
compile -map_effort medium -boundary_optimization //中等级的优化,边界优化
#compile -map_effort medium
#-boundary_optimization -area_effort high
#compile -incremental_mapping //二次增量优化,针对门级

#-----------------------------------------------------

Step 7 :报告输出设置

Reports (Timing, Area …)

#-----------------------------------------------------
remove_unconnected_ports [get_cells -hier {*}]
change_names -hierarchy -rules TAN_RULE
report_timing -delay max -max_paths 1 > $timing_report 将最大延时写入时序报告中
report_timing -delay max -path end -max_path 80 > $timing_max20_report
report_area > $area_report
report_reference > $references_report
report_cell [get_cells -hier *] > $cell_report
report_constraint -all_violators -verbose > $constraint_report
report_power -analysis_effort high -verbose > $power_report
check_design > $check_syntax_report

#-----------------------------------------------------

Step 8 :文件输出设置

Write Files (netlist out)

#-----------------------------------------------------
change_names -rule verilog –hier
write -format verilog -hierarchy -output $out_netlist 输出网表文件
write -format db -hierarchy -output $out_db 输出db文件
write_sdf $out_sdf 输出sdf文件
write_sdc $out_sdc 输出sdc文件
exit
#----------------------end-------------------

List item

DC综合脚本中文详细解释相关推荐

  1. php.ini配置文件中文详细解释

    php.ini配置文件中文详细解释 ;;;;;;;;;;; ; 警告 ; ;;;;;;;;;;; ; 此配置文件是对于新安装的PHP的默认设置. ;  ; 此配置针对开发目的,并且*不是*针对生产环境 ...

  2. ffmpeg参数中文详细解释

    -L license -h 帮助 -fromats 显示可用的格式,编解码的,协议的... -f fmt 强迫采用格式fmt -I filename 输入文件 -y 覆盖输出文件 -t duratio ...

  3. ffmpeg 声音参数_「xxx video」ffmpeg参数中文详细解释 - seo实验室

    xxx video a) 通用选项 -L license -h 帮助 -fromats 显示可用的格式,编解码的,协议的... -f fmt 强迫采用格式fmt -I filename 输入文件 -y ...

  4. DC综合——学习笔记

    DC综合--学习笔记 一.DC综合简介 1.1 什么是综合? 1.2 综合需要的文件 1.3 综合输出的文件 1.4 电路综合的要求 1.4.1 综合脚本的要求 1.4.2 综合结果的要求 二.DC综 ...

  5. 传奇脚本变量、命令名的详细解释

    传奇脚本变量.命令名的详细解释 [变量属性] [000-999] 『属性说明』:该变量有下线.重新启动服务器均不消失的强记录性.保存在hum.db(还是在mir.db记不太清 楚.望高手指正)该变量只 ...

  6. 西门子828D 840Dsl数控程序PLC西门子数控程序中文注释,详细解释介绍

    西门子828D 840Dsl数控程序PLC西门子数控程序中文注释,详细解释介绍. 对于维修人员,或者想学习PLC编程的工程师,初学者. 绝对是不错的选择,因为我也是从不懂过来的,所以再添加注释解释时会 ...

  7. ASSA脚本指令中文详细说明

    ASSA脚本指令中文详细说明 2011-05-08 19:10:29| 分类: 石器脚本 assa |字号 订阅 下载LOFTER我的照片书 | cls '清屏 beep '提示声音 end '结束当 ...

  8. 传奇身上装备升级系列脚本,以及UPGRADEITEMEX 脚本的详细参数解释

    UPGRADEITEMEX 脚本的详细参数解释如下: UPGRADEITEMEX 物品位置(0-12) 属性位置(0-14) 成功机率(0-100) 点数机率(0-255) 是否破碎(0,1) 物品位 ...

  9. DC综合完整脚本以及操作实例

    脚本最终成品..synopsys_dc.setup与syn-script.tcl.前面的文件定义各种库以及各种搜索路径,后者定义综合的约束以及输出结果文件. 启动dc,dc会自动的加载第一个文件,其中 ...

最新文章

  1. 脱离公式谈谈对反向传播算法的理解
  2. Galaxy Release_20.09 发布,新增多个数据上传组件
  3. 9.Spring Security添加记住我功能
  4. Faas 典型场景——应用负载有显著的波峰波谷,典型用例-基于事件的数据处理...
  5. ASP.NET 系统对象 Request(一)
  6. 前端知识点总结——JS高级(持续更新中)
  7. C语言课后习题(57)
  8. Spark源码分析之Executor分析
  9. 【clickhouse】clickhouse查询语句之simple
  10. .NET、C#和ASP.NET三者之间的区别与联系
  11. acm java输入输出_ACM中java如何快速输入输出
  12. 基于FPGA实现uart串口模块——进阶版1
  13. 分享一次在Windows Server2012 R2中安装SQL Server2008
  14. Mac OS X 安装ruby环境
  15. 六石管理学:谈谈工作技能培训
  16. linux系统tcl电视刷机包,【欢视商店】TCL电视RT95系列升级包与刷机包
  17. Chrome浏览器如何实现多开操作?(Mac系统为例)
  18. 鱼雷武器控制系统半实物仿真系统ETest设计与实现
  19. 计算机电脑的时区怎么弄,电脑时区怎么设置,教你win10中国时区UTC设置教程
  20. IT行业都有哪些职位,初学者(0基础,新人)该如何选择,才能够快速进入这个行业?... 1

热门文章

  1. 根据c语言的语法规则,下列( )是用户定义的合法标识符,C语言期末复习题附答案...
  2. DP(动态规划)是什么?
  3. 【NFC】【S32 DS】Warning: Not all breakpoints couldbe written. Continue?
  4. Creo 二次开发-尺寸位置排序算法
  5. 解决input事件监听拼音输入法导致高频事件
  6. Mysql:如果知道一个用户的出身日期,如何统计他的退休年龄是那一年
  7. python语言编写的modbus协议_基于Python的ModbusTCP客户端实现
  8. 关于点云数据的包围盒的方法总结
  9. TJPU-36 大数阶乘
  10. 在游戏运营行业,函数计算如何解决数据采集分析痛点?