综合概述
      综合技术的研究可以追溯到20世纪60年代,IBM公司T.J.Watson研究中心开发ALERT系统,将寄存器传输级算法描述转化成逻辑级的结构实现;20世纪70年代,综合技术发展迅速,但主要致力于较低层次的逻辑综合和版图综合;20世纪80年代中期,专用集成电路的广泛应用,要求芯片设计大规模、高性能、短周期,大大推动了从算法级设计描速向寄存器传输级设计描述转换的高层次综合技术。
      1.逻辑综合概念
      逻辑综合负责将寄存器传输级的结构描述转化为逻辑层的结构描述,以及将逻辑层的结构描述转化为电路的结构描述。在数字IC设计领域常用的EDA综合工具中,最权威的要算Synopsys公司提供的综合工具。Synopsys公司提供的Design Compiler(DC)是业界流行的、功能强大的逻辑综合工具。用户只需要输入设计规格的HDL描述和时间约束,就可能得到较为优化的门级综合网表。此外,DC还集成了功能强大的静态时序分析引擎,并支持与后端布局布线工具交互工作。     
      2.逻辑综合的流程
      从某种意义而言,综合就是将设计的HDL描速转化为门级网表的过程。Synopsys公司提供的综合工具DC把综合分为三个步骤进行:synthesis=translation+mapping+optimization。Translation是指把设计的HDL描述转化为GTECH库元件组成的逻辑电路;GTECH库是Synopsys公司提供的通用的、独立于工艺的元件库。Mapping是指将GTECH库元件映射到某一特定的半导体工艺库上,此时的电路网表包含了相关的工艺参数。Optimization是根据设计者设定的时延、面积、线负载模型等综合约束条件对电路网表进一步优化的过程。从综合工具的使用流程来看,综合包括综合环境的设置,综合约束,综合优化,综合与后端流程等。
      综合约束用来设定电路综合的目标,它包括设计环境约束、时间约束和面积约束。
      设计环境约束: 指的是用来描述设计在工作时的温度、电压、驱动、负载等外部条件的一系列属性。基本的环境设置内容包括工作条件、负载模型、系统接口驱动或扇出能力等设置。这些属性约束在电路综合时是必须的,如果用户没有进行显示的说明,则DC在综合的时候会采用默认值。
      时间约束内容: 包括定义时钟、定义时钟网络的时间约束和时序路径时间约束设定,以及非同步设计的时间约束等。了解延迟的计算是定义恰如其分的时间约束的关键。Synopsys公司支持几种延迟模型:一是CMOS通用的延迟模型,二是CMOS分段的线性延迟模型,三是非线性的查表延迟模型。深亚微米的设计,前两种模型并不常用,非线性的延迟模型以输入的迁越时间和输出电容负载为参变量计算延迟的时间值,其结果以表格的形式列出供DC查找。
      面积约束: 和时间约束之间是一对矛盾且需要折中的关系,DC综合默认为时间约束比面积约束拥有更高的优先级。DC优化时默认不进行面积优化,如果你关注于芯片的面积,可以使用set_max_area命令设定面积的约束,使得DC完成时序约束之后继续进行面积优化。
       在设定综合约束之后,一般并不马上进行综合优化。因为对于一个较大的设计来说,综合一次时间很长。因此,综合前确认综合约束命令是否正确添加到设计中时很有必要的,可以减少由于综合约束不正确重新综合优化的风险,减少综合反复的时间。检查综合约束设置的命令有report_design, report_port –verbose, report_clock [-skew], report_constraints, report_timimg_requirement等。
       许多版图工具只接受Verilog或EDIF格式的综合网表作为输入。在综合后提供Verilog格式的网表送给后端的版图工具,IC工程师还必须对综合的网表做好一下处理:
1.彻底解决多次例化同一子模块的问题
2.修正设计中部分连线的命名以简化综合网表
3.删除整个设计中悬空的端口
4.确保每个实例化单元的引脚都是可见的
5.避免网表中存在assign语句、传输门和三态连线的定义
6.避免网表中存在不必要的门控时钟或门控复位信号
7.避免网表中引用的实例化名不存在对应的实现逻辑
在综合之后,我们还得对综合后的网表进行门级仿真,在门级仿真上Synopsys公司提供的VCS仿真工具在服务器上运行的速度是比较快的。门级仿真过程中还有一步就是带时序反标的时序仿真,通过DC或者PT写出SDF文件,在网表中将逻辑延迟和线延迟反标入电路中,模拟更加真实的情况。

下面将讲述如何write synthesis script
      什么是综合呢?synthesis,台湾翻译为合成,其作用就是将硬件描述语言的RTL级代码转变为门级网表。当然,现在综合技术已经很成熟了,还有推出的行为(behavioral)综合和物理(physical)综合。我们这里讨论的是逻辑(logic)综合。
       综合技术是提高设计产能的一个很重要的技术,没有综合技术的发展,我们就不可能用HDL实现电路的设计,因为HDL开始是用来供电路仿真建模使用的,到了后来才把其中一部分子集作为可综合的语言,也就是我们使用的RTL CODE。很多人入门都用HDL做设计,就以为HDL就只是用来做设计的,没有看到HDL最初始的一面,所以在验证的时候,就无法用好HDL另外一部分强大的功能。有时间还是可以看看Writing Testbench这本书,增强对HDL语言在验证方面作用的了解,也是提高对HDL认识很好的补充。
       我们以DesignCompiler为例子讲解综合的过程。
       首先,综合就要必须要用综合库,这个你可以向厂家要,综合库可以通过.lib这个库文件转变成.db综合库,这个基本过程可以Design Compiler里面实现,综合库里面有什么内容呢? .db 是无法阅读的,.lib是可以阅读的,里面有库的基本参数的单位,库运行的条件,各种参数,最重要的是两个部分,一个是WLM,即Wire Load Model,一个Gate的定义(输入输出,功能,时序参数,面积等等);这只是StandarCell的库,另外还有其他库,如RAM,DSP的综合库,都以.db的形式存在。
       综合需要三种输入,一个是代码,一个是综合库,一个是综合脚本Script。综合脚本主要包括了一下内容,对综合工具环境的配置,对综合对象外部环境的设置(operation condiction),对WLD的设置,对综合对象的时序的约束,综合策略,综合优化,综合报告和输出。下面给入门的人一个现成的Script例子(tcl script)
####### Set Directary #########
set LIB typical
set SYNDIR $HOME
set SRCDIR $HOME/src
set SCRDIR $HOME/script
set RPTDIR $HOME/rpt
set SYNDB   $HOME/db
set SYNOPSYS "/cad/synopsys/"
###### Enviroment ############
define_design_lib WORK -path $SYNDIR/WORK
set bus_naming_style %s_%d
set verilogout_single_bit "false"
set hdlin_enable_vpp "true"
set hdlin_enable_vpp "true"
set verilogout_no_tri "true"
set write_name_nets_same_as_ports "true"
set compile_preserve_sync_resets "true"
set_ultra_optimization true
set verilogout_equation false
set verilogout_no_tri true
set sdc_write_unambiguous_names false
###### Libary #################
set synopsys_path "$SYNOPSYS/libraries/syn\
           $SYNOPSYS/dw/sim_ver"
set standarcell_path "*"
set search_path "$search_path\
          $synopsys_path\
          $standarcell_path"
set target_library "typical.db"
set symbol_library "*"
set synthetic_library "dw_foundation.sldb"
set link_library "* $target_library dw_foundation.sldb"
###### Read Design #############
analyze -format verilog -lib WORK [list *] > $RPTDIR/analyze.rpt
elaborate designtop -lib WORK -gate_clock > $RPTDIR/elaborate.rpt
write -format db -hier -modified -output $SYNDB/$TOPMODULE.rtl.db
current_design $TOPMODULE
####### Set Interface Enviroment #########
set_drive 10 [all_inputs]
set_fanout_load 10 [all_outputs]
###### Timing Exceptions #######
set_false_path -from rst_
uniquify
link
######## Set Clock #############
create_clock -name CLK -p $PERIOD [get_ports clk] -waveform {0, 5}
set_clock_uncertainty 0.3 CLK
set_input_delay 3 -clock CLK [all_inputs]
set_output_delay 3 -clock CLK [all_outputs]
set_dont_touch clk
####### Compile Option ############
compile -map_effort medium > $RPTDIR/compile.rpt
####### Report ####################
report_timing > $RPTDIR/report_timing.rpt
report_area > $RPTDIR/area.rpt
####### Result ####################
write -format db -hier -o $SYNDB/*.db
write -format verilog -hier -o $SYNDB/*.v
write_sdf -version 2.1 $SRCDIR/../netlist/*.sdf
write_constraints -cover_design -format sdf-v2.1 -output *.syn.sdf
write_script -hier -out $SCRDIR/*.sdc

题后话:这是一个非常完善的script结构(仅供参考,这只是一个架构,具体语法可能还需补充和修正,不可随便使用在研发上,面得你花很多时间去调试脚本),使用于RTL2Netlist的综合,当然PAR之后的综合肯定不是这样子写的,其中原因建议大家看看<>。今后有空我再把Script各个部分做详细见解,今天就写到这里。