数字asic流程实验(四) DC综合
1.Design Compiler 简介
Design Compiler(以下简称DC)是Synopsys公司用于做电路综合的核心工具,可以将HDL描述的电路转换为基于工艺的门级网表。
逻辑综合分为三个阶段:
- 转译(Translation):把电路转换为EDA内部数据库,这个数据库跟工艺是独立无关的;
- 优化(Optimozation):根据工作频率、面积、功耗来对电路优化,来推断出满足设计指标要求的门级网表;
- 映射(Mapping):将门级网表映射到代工厂给定的工艺的元件库上,最终形成该工艺对应的门级网表。
如下图所示,将Verilog编写的电路,代工厂提供的元件库,以及设计约束输入综合软件中,便会输出可用于布局布线的基于工艺的门级网表。
为何要通过综合步骤生成工艺所对应的门极网表?这是因为不管多么复杂的数字电路,其最终实现时都要使用MOS管搭建一个个的门电路实现其逻辑功能,而实际的MOS工艺存在各种寄生参数,进而对电路的性能造成一定的影响,代工厂会提供各个基本单元具体的工艺参数,根据这些工艺参数对门极网表进一步做仿真,从而能够更好的模拟芯片实际流片后的工作情况。
2.TCL脚本编写
DC可以使用GUI界面,也可以使用TCL(Tool Command Language)脚本工作。通过将指令语句保存在TCL脚本中,使用dc_shell调用执行就能够高效的完成综合。
DC综合实验的TCL脚本的目标包括:
- 指定工艺库
- 读入设计
- 规定设计环境,设计约束
- 执行综合
- 输出网表、时序描述等文件
TCL文件的编写流程及每个步骤主要使用的命令如下图所示:
重点针对定义设计环境(Define design environment)和设置设计约束(Set design constraints)两个步骤进行一些补充说明。
DC定义设计环境时所使用的模型如下图所示,该步骤主要需要设置驱动(drive)和负载(load)相关的参数,使用set_drive命令设置输入端口的驱动电阻,使用set_load命令设置输出端口的负载电容,使用set_driving_cell设置驱动使用的基本单元,使用set_fanout_load设置预期扇出负载值,使用set_wire_load_model设置线负载模型(线负载模型一般来自工艺库内部),这些设置值都要根据单元的实际设计需求进行确定。
下图展示了一个通过TCL定义设计环境的例子:
设置设计约束时首先要通过create_clock指令创建时钟,需要注意的是create_clock中,-period xx用于指明时钟周期,还需要用-waveform {xx xx}来指明时钟信号为正的时间段。如下图所示,一个周期为40ns,0-15ns为正的时钟信号,使用create_clock信号进行描述时,应写为
create_clock -period 40 -waveform {0 15} clk
设置设计约束除了需要声明时钟信号的延迟、翻转时间等,还需要通过set_input_delay指令和set_output_delay指定声明输入延迟和输出延迟,输入延迟指信号从时钟边缘通过外部逻辑到输入端口的时间,即输入信号是在时钟沿后多长时间到达模块的端口上的 。输出延迟指信号从时钟边缘到引脚有效输出的时间,即输出信号在后级模块中需要在时钟沿之前提前多长时间准备好。DC在综合时会根据这些约束规划门极电路,从而确保所有的信号能够被正确的采样,从而保证芯片工作正常。
下图所示为一个通过TCL规定输入延迟和输出延迟的例子:
本次实验的TCL脚本内容如下
set search_path "../lib/logic ../src" #设置搜索路径
set target_library " slow.db " #设置标准元件库
set link_library "* $target_library "
set symbol_library " smic18.sdb " #设置标准元件图标库
set access_internal_pins true
set report_path "./reports" #设置reports文件夹
set output_path "./outputs" #设置outputs文件夹
read_file -format verilog cic_filter.v #读取verilog设计文件
read_file -format verilog divider64.v
current_design cic_filter #指明主程序
link #工艺库链接
uniquify
set design_name [get_object_name [current_design]]
set_wire_load_model -name "smic18_wl10" #设置线负载模型
set_wire_load_mode top
create_clock -period 156 -waveform {0 78} [get_ports clk] -name clk #设置时钟,周期156ns,脉宽0-78ns
create_generated_clock [get_pins div/clk_div] -source [get_ports clk] -divide_by 64 -name clk_div #分频64后的时钟
set_clock_latency 2.5 clk #延迟时间2.5ns
set_clock_transition 0.3 clk #翻转时间0.3ns
set_clock_uncertainty 1.5 -setup clk #建立时间1.5ns
set_clock_uncertainty 0.3 -hold clk #保持时间0.3ns
set_drive 0 [list clk rst_n] #设置输入驱动强度为0
set_driving_cell -lib_cell NAND2X1 in #设置驱动单元
set_input_delay 35 -clock [get_clocks clk] {in rst_n} #设置输入延时35ns
set_output_delay 35 -clock [get_clocks clk_div] [get_ports out] #设置输出延时35ns
set_load 2 [all_outputs] #设置输出负载为2pF
set_max_area 0
check_design > $report_path/check_design_before_compile.rpt
check_timing > $report_path/check_timing_before_compile.rpt
compile
compile -incremental_mapping -map_effort high
write_sdf -version 2.1 $output_path/${design_name}_post_dc.sdf #时序描述
write -f ddc -hier -output $output_path/${design_name}_post_dc.ddc
write -f verilog -hier -output $output_path/${design_name}_post_dc.v #网表
write_sdc $output_path/${design_name}_post_dc.sdc #约束
report_constraint -all_violators -verbose > $report_path/constraint.rpt
report_qor > $report_path/qor.rpt
report_power > $report_path/power.rpt
report_area > $report_path/area.rpt
report_cell > $report_path/cell.rpt
report_clock > $report_path/clk.rpt
report_hierarchy > $report_path/hierarchy.rpt
report_design > $report_path/design.rpt
report_reference > $report_path/reference.rpt
report_timing > $report_path/timing.rpt
check_design > $report_path/check_design_post_compile.rpt
check_timing > $report_path/check_timing_post_compile.rpt
#start_gui
3.运行综合
1.打开虚拟机,至/home/crazy/Desktop/experiment/dc 文件夹下,右键Open in Terminal
2.在terminal中输入
vim dc_script.tcl
打开TCL脚本,检查脚本内容是否有误,如果有误则敲i健进入编辑模式修改,修改完毕后敲ESC退出编辑模式,敲:后输入wq,敲Enter,退出vim
3.在terminal中依次输入
ic
dc_shell -f dc_script.tcl
执行TCL脚本
4.等待脚本执行结束,每一步执行后,如果没有出错,terminal中会打印1,否则会打印0并显示报错信息。如果出现报错,则根据信息返回修改dc_script.tcl,直到没有任何报错信息
5.检查outputs文件下是否正常生成网表文件(.v)、时序描述文件(.sdf)等,reports文件夹下是否正常生成各项报告
6.至此DC综合步骤已经结束,可以在dc_shell中输入
start_gui
运行GUI界面,在Logical Hierarchy窗口中选中cic_filter,点击Schematic---->New Schematic View,右侧窗口中显示cic_filter的图标,双击图标后显示DC综合后以逻辑门搭建出的cic_filter的结构
4.参考资料
《Automated Synthesis from HDL models》
《DesignCompilerUserGuide_VersionF-2011.09-SP2December2011》
https://zhuanlan.zhihu.com/p/129059203