Loading

数字asic流程实验(四) DC综合

数字asic流程实验(四) DC综合

1.Design Compiler 简介

Design Compiler(以下简称DC)是Synopsys公司用于做电路综合的核心工具,可以将HDL描述的电路转换为基于工艺的门级网表。

逻辑综合分为三个阶段:

  • 转译(Translation):把电路转换为EDA内部数据库,这个数据库跟工艺是独立无关的;    
  • 优化(Optimozation):根据工作频率、面积、功耗来对电路优化,来推断出满足设计指标要求的门级网表; 
  • 映射(Mapping):将门级网表映射到代工厂给定的工艺的元件库上,最终形成该工艺对应的门级网表。  

如下图所示,将Verilog编写的电路,代工厂提供的元件库,以及设计约束输入综合软件中,便会输出可用于布局布线的基于工艺的门级网表。

image-20210726153233526

为何要通过综合步骤生成工艺所对应的门极网表?这是因为不管多么复杂的数字电路,其最终实现时都要使用MOS管搭建一个个的门电路实现其逻辑功能,而实际的MOS工艺存在各种寄生参数,进而对电路的性能造成一定的影响,代工厂会提供各个基本单元具体的工艺参数,根据这些工艺参数对门极网表进一步做仿真,从而能够更好的模拟芯片实际流片后的工作情况。

2.TCL脚本编写

DC可以使用GUI界面,也可以使用TCL(Tool Command Language)脚本工作。通过将指令语句保存在TCL脚本中,使用dc_shell调用执行就能够高效的完成综合。

DC综合实验的TCL脚本的目标包括:

  1. 指定工艺库
  2. 读入设计
  3. 规定设计环境,设计约束
  4. 执行综合
  5. 输出网表、时序描述等文件

TCL文件的编写流程及每个步骤主要使用的命令如下图所示:

image-20210726160602291

重点针对定义设计环境(Define design environment)和设置设计约束(Set design constraints)两个步骤进行一些补充说明。

DC定义设计环境时所使用的模型如下图所示,该步骤主要需要设置驱动(drive)和负载(load)相关的参数,使用set_drive命令设置输入端口的驱动电阻,使用set_load命令设置输出端口的负载电容,使用set_driving_cell设置驱动使用的基本单元,使用set_fanout_load设置预期扇出负载值,使用set_wire_load_model设置线负载模型(线负载模型一般来自工艺库内部),这些设置值都要根据单元的实际设计需求进行确定。

image-20210726163715307

下图展示了一个通过TCL定义设计环境的例子:

image-20210726171816803

设置设计约束时首先要通过create_clock指令创建时钟,需要注意的是create_clock中,-period xx用于指明时钟周期,还需要用-waveform {xx xx}来指明时钟信号为正的时间段。如下图所示,一个周期为40ns,0-15ns为正的时钟信号,使用create_clock信号进行描述时,应写为

create_clock -period 40 -waveform {0 15} clk

image-20210726221531364

设置设计约束除了需要声明时钟信号的延迟、翻转时间等,还需要通过set_input_delay指令和set_output_delay指定声明输入延迟和输出延迟,输入延迟指信号从时钟边缘通过外部逻辑到输入端口的时间,即输入信号是在时钟沿后多长时间到达模块的端口上的 。输出延迟指信号从时钟边缘到引脚有效输出的时间,即输出信号在后级模块中需要在时钟沿之前提前多长时间准备好。DC在综合时会根据这些约束规划门极电路,从而确保所有的信号能够被正确的采样,从而保证芯片工作正常。

下图所示为一个通过TCL规定输入延迟和输出延迟的例子:

image-20210726171935652

本次实验的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

image-20210726172327779

2.在terminal中输入

vim dc_script.tcl

打开TCL脚本,检查脚本内容是否有误,如果有误则敲i健进入编辑模式修改,修改完毕后敲ESC退出编辑模式,敲:后输入wq,敲Enter,退出vim

image-20210726173226896

image-20210726173511094

image-20210726173537904

3.在terminal中依次输入

ic
dc_shell -f dc_script.tcl

执行TCL脚本

image-20210726172506817

4.等待脚本执行结束,每一步执行后,如果没有出错,terminal中会打印1,否则会打印0并显示报错信息。如果出现报错,则根据信息返回修改dc_script.tcl,直到没有任何报错信息

image-20210726172948605

5.检查outputs文件下是否正常生成网表文件(.v)、时序描述文件(.sdf)等,reports文件夹下是否正常生成各项报告

image-20210726174257217

6.至此DC综合步骤已经结束,可以在dc_shell中输入

start_gui

运行GUI界面,在Logical Hierarchy窗口中选中cic_filter,点击Schematic---->New Schematic View,右侧窗口中显示cic_filter的图标,双击图标后显示DC综合后以逻辑门搭建出的cic_filter的结构

image-20210726175203637

image-20210726175355325

image-20210726175726292

image-20210726175705401

4.参考资料

《Automated Synthesis from HDL models》

《DesignCompilerUserGuide_VersionF-2011.09-SP2December2011》

https://zhuanlan.zhihu.com/p/129059203

https://www.jianshu.com/p/a891ef3fe71e

https://blog.csdn.net/zyn1347806/article/details/108649518

posted @ 2021-07-26 22:51  sasasatori  阅读(5135)  评论(2编辑  收藏  举报