文章目录
参考文献
[1]【DC】使用DC进行逻辑综合的基本步骤
[2]Synopsys逻辑综合及DesignCompiler的使用
[3]DC综合——学习笔记
[4]博客园——IC_learner
前言
数字IC前端常用的综合工具是Synopsys的DC(Design Compiler)。虽然大多数情况下是使用脚本进行操作,但是干巴巴的脚本命令对于初学者来说无疑是天书,因此我觉得有必要对DC的图形化操作有一定的了解,这也能增加工程师对脚本命令的理解。在上篇文章《DC综合入门篇——图形化操作》中已经简要介绍了DC图形化界面的使用,本篇文章将介绍如何利用tcl脚本对RTL代码进行综合。(本文中的命令遵从tcl脚本语言语法)
DC的操作步骤
下图给出了DC进行逻辑综合时的基本步骤。这是上篇文章中的图,具体介绍可见《DC综合入门篇——图形化操作》。
实战
下面将通过DC的TCL脚本体验一下综合的流程。
1. 准备工作
在设计目录下新建6个文件夹分别为netlist(保存网表文件)、report(保存报告文件)、rtl(保存RTL代码)、sdc(保存约束文件)、sim(保存仿真环境)、tb(保存测试文件)。并将编写的rtl代码全部放入rtl文件夹。
当然这些文件可以根据自己的喜欢新建和命名。
2. 打开DC
在设计目录下打开终端,输入dc或者dc_shell即可打开DC命令行。可以使用exit命令来退出DC。
dc
# 或者dc_shell
3.Specify libraries——指定库文件
指定库文件使用下列脚本进行操作,只指定Search_path、Link_library、Target_library。下列地址忽略,需要根据自己的库文件进行调整。
#-------------------Specify Libraries------------------
set search_path { . /LM}
set link_library { */LM/tcbn45gsbwpwc.db }
set target_library { /LM/tcbn45gsbwpwc.db }
注意:在 link_library 的设置中必须包含" * “,” * “表示 DC 在引用实例化模块 或者单元电路时首先搜索已经调进DC memory的模块和单元电路,如果在link library 中不包含” * ",DC 就不会使用 DC memory 中已有的模块,因此,会出现无法匹配的模块或单元电路的警告信息(unresolved design reference)。
4.Read design——读取设计文件
DC读入设计文件有两种方式,一是read指令,二是 analyze 和 elaborate 的组合
图源文献[1]
如果读入单个文件可以使用指令。
read_verilog alu.v
如果需要读入多个文件可以使用指定。
# 设置verilog文件所在的目录rtl
set design_path "rtl"
set verilog_files [glob -nocomplain -type f $design_path/*.v]
foreach file $verilog_files {
read_file -format verilog $file
}
当读取完所有要综合的模块之后,需要使用link命令将读取到 DC 存储区的模块或者实例连接起来。同时由于DC默认将最后读入的一个模块作为顶层模块。因此在Link之前还需要利用current_design指令指定顶层模块。
# 设置顶层模块的名字
set top_name alu
current_design $top_name
link
uniquify
注意:对于被多次实例化的同一子设计,由于其例化后的工作环境各不相同,因此,需要用 uniquify 命令为每个实例在内存中创建一份副本,以便区分开每个实例。DC可以根据不同的应用环境进行合适的优化。源自文献[1]。
5.Define design environment——定义设计环境
在流程图中,有以下定义design environment的指令。
举例说明,可以使用以下命令设置负载电容。[all_output]指的是所有输出port。
#-------------------Operating environment--------------
# 所有输出port的输出负载电容设置为10pf
set_load 0.01 [all_output]
6.Set design constraints
DC中的约束有很多种,在流程图中,有以下设置约束的指令。下面以常用的时钟约束和面积约束为例说明。
时钟约束
指令create_clock对clk端口进行时钟约束,周期period为10ns(100MHz),waveform设置占空比。
create_clock -name clk -period 10 -waveform { 0 5 } [get_ports clk]
如果对组合逻辑电路进行时钟约束,使用下列命令会生成虚拟时钟,用于时序分析。
create_clock -name clk -period 10 -waveform {0 5}
注意:由于时钟信号是驱动大负载的。在综合的时候综合工具会对负载进行估 计,从而在该网络上加上一些有足够驱动能力的 buffer 或者反相器,以使得电路的上升时间和下降时间能够满足要求。而前端工具无法知道连线的走向和长度,在估计时钟网络的负载时不准确,而且 floorplan 的结果将会 影响连线的长度,从而影响连线的负载,因此,前端工具不对大负载的网络进行处理,而把这个工作留到后端。所以在综合的时候需要告诉综合工具不对时钟网络进行处理。源自文献[1]。
#为了防止在时钟路径上插入Buffer而恶化时序,所以对时钟网络设置Dont_touch_network属性,即综合的时候不对Clk信号行优化
set dont_touch_network [get_clocks clk]
面积约束
set_max_area指令设置Max area 的值为0,表明让DC 向电路面积为 0 的方向来优化电路。当然,面积为0是达不到的。
set_max_area 0
另外其他约束可根据自己的需求进行设置。
7. Synthesize and optimize the design——综合设计
使用compile或者compile_ultra进行综合。compie_ultra命令包括许多高级的综合优化算法,可以使关键路径的分析和优化在最短时间内完成。但是需要额外的licence。
# 保持默认优化条件进行编译
compile
# 或者compile_ultra
8. Analyze and resolve design problems——查看报告并分析
利用以下命令保持面积、功耗、时序、约束违例和summary报告在report文件夹中。
#-------------------Generate Reports-------------------
report_area > ./report/area_report.txt
report_power > ./report/power_report.txt
report_timing > ./report/timing_report.txt
# all_violators指的是所有没有达到要求的约束
report_constraint -all_violators > ./report/violators.txt
report_qor > ./report/qor_report.txt
9. Save the design database
利用以下命令保存所需文件。
- ddc文件:保留综合结果的ddc文件,可以直接load这个文件,查看综合结果;
- sdc(Synopsys design constraints.)文件:保留了本次设计时序约束信息;
- sdf(Standard Delay Format)文件:标准延时格式,用于静态分析和后仿;
- netlist.v文件:综合后吐出的门级网表。
#-------------------Save Output File-------------------
write_sdc ./sdc/top.sdc
write_sdf -version 2.1 ./sdc/top.sdf
write -f verilog -hier -output ./netlist/netlist.v
write_file -f ddc -hierarchy -output ./sdc/top.ddc
实例
1. 脚本
在设计目录下新建一个run.tcl脚本文件,在tcl文件中写入所需要的命令。如下为举例。
#输出时间和清除原本的设计
sh date
remove_design -designs
#------------------------Define------------------------
set top_name top
#-------------------Specify Libraries------------------
set search_path {./LM}
set link_library { */LM/tcbn45gsbwpwc.db }
set target_library { /LM/tcbn45gsbwpwc.db }
#----------------------Read Designs--------------------
set design_path "rtl"
set verilog_files [glob -nocomplain -type f $design_path/*.v]
foreach file $verilog_files {
read_file -format verilog $file
}
current_design $top_name
# Reset all constraints
reset_design
link
uniquify
#-------------------Operating environment--------------
set_load 0.01 [all_output]
#--------------------Design Constrains-----------------
create_clock -name clk -period 10 -waveform { 0 5 } [get_ports clk]
set_max_area 0
#---------------------Run Compile----------------------
compile
#-------------------Generate Reports-------------------
report_area > ./report/area_report.txt
report_power > ./report/power_report.txt
report_timing > ./report/timing_report.txt
report_constraint -all_violators > ./report/violators.txt
report_qor > ./report/qor_report.txt
#-------------------Save Output File-------------------
write_sdc ./sdc/top.sdc
write_sdf -version 2.1 ./sdc/top.sdf
write -f verilog -hier -output ./netlist/netlist.v
write_file -f ddc -hierarchy -output ./sdc/top.ddc
2. 运行
在目录下打开终端运行以下命令即可。运行的日志保存在run.log中方便查看和Debug。
dc_shell -f run.tcl > run.log
# 或者 source -e -v run.tcl > run.log