综合是前端模块设计中的重要步骤之一,综合的过程是将行为描述的电路、RTL 级的电路转换到门级的过程;Design Compiler 是 Synopsys 公司用于做电路综合的核心工具,它可以方便地将 HDL 语言描述的电路转换到基于工艺库的门级网表。本章将初步介绍综合的原理以及使用 Design Compiler 做电路综合的全过程。
通过前面完成了对万年历的功能仿真和代码覆盖率仿真,现在开始进行综合,综合工具Design Compiler运行于CentOS系统中,通过在终端输入dc_shell -gui进入DC软件的图形化界面。
设置库文件
-
工艺库(target_library)
工艺库是综合后电路网表要最终映射到的库,读入的 HDL 代码首先由 synopsys 自带的 GTECH 库转换成 Design Compiler 内部交换的格式,然后经过映射到工艺库和优化生成门级网表。工艺库是由 Foundary 提供的,一般是.db 的格式。
-
链接库(link_library)
link_library 设置模块或者单元电路的引用,对于所有 DC 可能用到的库,我们都需要在 link_library 中指定,其中也包括要用到的 IP。
值得注意的一点是:在 link_library 的设置中必须包含’*’, 表示 DC 在引用实例化模块或者单元电路时首先搜索已经调进 DC memory 的模块和单元电路,如果在 link library中不包含’*’,DC 就不会使用 DC memory 中已有的模块,因此,会出现无法匹配的模块或单元电路的警告信息(unresolved design reference)。
-
符号库 (symbol_library)
symbol_library 是定义了单元电路显示的 Schematic 的库。用户如果想启动design_analyzer 或 design_vision 来查看、分析电路时需要设置 symbol_library。符号库的后缀是.sdb,加入没有设置,DC 会用默认的符号库取代。
-
综合库(synthetic_library
在初始化 DC 的时候,不需要设置标准的 DesignWare 库 standard.sldb 用于实现Verilog 描述的运算符,对于扩展的 DesignWare,需要在 synthetic_library 中设置,同时需要在 link_library中设置相应的库以使得在链接的时候 DC 可以搜索到相应运算符的实现。
在打开的DC图形化界面中可以轻易的通过鼠标点击进行各种设置,但是考虑到方便快捷,本文一律使用在命令窗口键入命令来进行相关操作。设置库的命令为:
set search_path /home/eda/eda/synopsys/dc/dc_2012/libraries/syn
set target_library { class.db }
set link_library { * class.db }
set symbol_library { class.sdb }
读入文件
read_file -format verilog {/home/eda/Desktop/calendar.v} (注:这是待打开⽂件的路径)。在读入Verilog文件后可以查看该电路的symbol图并设置约束条件。
上图是一个 Verilog 描述的设计实例,里面包含了我们所要讨论的几种设计对象。这些对象也是今后 DC 命令的操作对象。Verilog 描述的各个模块可以称之为设计(Design),里面包含时钟(Clock),输入输出称为端口(Port),模块中的互连线是线网(Net),内部引用的元件称为引用(Reference),引用的实例称为单元(Cell),引用单元的内部端口是管脚(Pin)。
设置约束
时钟约束
在电路综合的过程中,所有时序电路以及组合电路的优化都是以时钟为基准来计算路径延迟的,因此,一般都要在综合的时候指定时钟,作为估计路径延迟的基准。定义时钟的时候我们必须定义它的时钟源(Clock source),时钟源可以是端口也可以是管脚;另外还必须定义时钟的周期。
设置时钟周期Period为10,Rising为0,Falling为5,即形成占空比为1:1的时钟波形,相应命令为create_clock -name "clock" -period 10 -waveform { 0 5 } { clk }
复位信号约束
为了使电路能够按设计预想的进行综合,需要将复位信号单独进行约束,指令如下:set_dont_touch_network { rst }
输入输出信号延迟约束
在综合阶段,对源代码进一步的进行优化,将月、年进位信号不设置为输出端口,以优化电路结构。
输入/输出端口及其驱动属性属于工作环境属性的约束,根据经验,输入输出信号延迟约束是时钟周期的60%,本例中设置了时钟周期为10ns,10*0.6=6ns,相应指令如下:
set_input_delay 6 -clock clock {time_set year_set mon_set week_set day_set}
set_output_delay 6 -clock clock {year mon week day}
面积约束
如果不设置面积的约束,Design Compiler将做最小限度的面积优化。设置了面积的约束后,DC将在达到面积约束目标时退出的面积优化。如果设置面积的约束为“0" , DC将为面积做优化直到再继续优化也不能有大的效果。这时,DC将中止优化。注意,对于很大(如百万门电路)的设计,如将面积的约束设置为“0" , DC可能要花很长的时间为设计做面积优化。综合时,运行的时间很长。
当设计不是很大的时候,为了让DC做最大的面积优化约束,我们就可以使用下面的命令进行面积约束:set_max_area 0
设计规则约束(DRC:design_rule_constraint)
参考自Tcl与Design Compiler (七)——环境、设计规则和面积约束 - IC_learner - 博客园
DC在做综合时,把设计规则的优先级设置为最高。主要是设置最大转换时间、最大扇出及最大负载电容要求,可以设置在输入端口、输出端口以及当前设计。
- set_max_transition
连线的转换时间是其驱动引脚的逻辑电平变化的时间,包括 rising time 和 falling ,从 10% 的 VDD 变化到 90% 的 VDD 所需的时间。 设定 最大的转换时间 set_max_transtion ,这个值一般设为周期的 10% 。
- set_max_fanout
连线的最大扇出负载指的是它所驱动的所有输入引脚的扇出负载的总和。 扇出负载不同于负载,它是个无量纲的数值。
- set_max_capacitance
输出管脚可以驱动的最大电容值。这里只设置前两项
set_max_fanout 4 calender
set_max_transition 2 calender
综合优化、查看综合报告、分析电路性能
综合优化:compile -exact_map
在Log框中出现Optimization Complete字样表明优化完成。
查看面积报告:report_area
约束报告:report_constraint -all_violators
因为我们设置的最⼤⾯积约束是0,⽽实际综合出的电路⾯积是302。该项violator是合理的。由于rst是复位信号其扇出⾮常⾼,同时由于我们之前对rst信号设置了don’t_touch,DC在综合的过程中没有对该信号进行优化,所以在DRC的时候会违反我们设定的max_fanout(最⼤扇出)。如果还存在其它violators,说明前⾯的约束设置不合理或电路设计不合理,需要对其修改,最终要求除max_areaviolator外没有其它violators。
时序报告:report_timing
时序仿真出现问题,应继续调整代码或约束,待调整完成后再修改本章内容
现在DC综合的⼯作已基本结束,我们需要保存综合后产⽣的⼏个⽂件,如电路⽹表和延迟⽂件等,以备后续⼯作所需。
write -hierarchy -format ddc -output /home/eda/Desktop/calender.ddc
write -hierarchy -format verilog -output /home/eda/Desktop/calendar_netlist.v
write_sdf -version 2.1 /home/eda/Desktop/calender.sdf
DC会自动在Verilog文件目录下生成一个command.log日志文件,拉到这个日志文件最下面记录了打开DC后的每一步操作,可以将其中的指令信息保存下来作为脚本文件,在后续的仿真调试中可以直接在tcl模式下执行脚本文件。
脚本代码如下 .代表本级目录 ..代表上级目录:
#*********read design*************
read_file -format verilog {/home/eda/Desktop/calendar.v}
#*************Insert constrain**********
# Create clock object
creat_clock -name "clock" -period 10 -waveform {0 10} {clk}
# Set constraints on reset ports
set_dont_touch_network { rst }
# Set constraints on input ports
set_input_delay 6 -clock clock {time_set year_set mon_set week_set day_set}
# Set constraints on output ports
set_output_delay 6 -clock clock {year mon week day}
# Set constraints on area
set_max_area 0
# Set constraints on design rule(DRC)
set_max_fanout 4 calendar
set_max_transition 2 calendar
#*************Compile*********************
compile -exact_map
#****************report******************
report_area > ./report/ calendar_area
report_constrain -all_violators > ./report/calendar_violators
report_timing > ./report/calendar_timing
#*****************write*******************
write -hierarchy -format ddc -output ./calender.ddc
write -hierarchy -format verilog -output ./calendar_netlist.v
#Standard Delay Format (SDF)
write_sdf ./report/calendar.sdf
#Synopsys Design Constraints (SDC)
write_sdc ./report/calendar.sdc
#*****************EXIT*******************
exit
相关文章: