阿憨(ahan) Verification Specialist Email:ahan.mail@gmail.com

数字电路(fpga/asic)设计入门6

上一篇 / 下一篇  2005-12-31 21:49:49 / 天气: 晴朗 / 心情: 高兴 / 个人分类:IC设计与验证

        综合工具DICDER -- 博客专栏U-b8q-~cEo
          第一节: 什么是综合呢?synthesis,台湾翻译为-合成,其作用就是将硬件描述语言的RTL级代码转变为门级网表。当然,现在综合技术已经很成熟了,还有推出的行为(behavioral)综合和物理(physical)综合。我们这里讨论的是逻辑(logic)综合。DICDER -- 博客专栏g&vo1XyI
          综合技术是提高设计产能的一个很重要的技术,没有综合技术的发展,我们就不可能用HDL实现电路的设计,因为HDL开始是用来供电路仿真建模使用的,到了后来才把其中一部分子集作为可综合的语言,也就是我们使用的RTL CODE。很多人入门都用HDL做设计,就以为HDL就只是用来做设计的,没有看到HDL最初始的一面,所以在验证的时候,就无法用好HDL另外一部分强大的功能。有时间还是可以看看Writing Testbench这本书,增强对HDL语言在验证方面作用的了解,也是提高对HDL认识很好的补充。DICDER -- 博客专栏E!~3gV-s1A(C$W
          我们以DesignCompiler为例子讲解综合的过程。
2AV1W*R;PY;^g+I?0          首先,综合就要必须要用综合库,这个你可以向厂家要,综合库可以通过.lib这个库文件转变成.db综合库,这个过程可以在DesignCompiler里面用实现,综合库里面有什么内容呢?.db 是无法阅读的,.lib是可以阅读的,里面有库的基本参数的单位,库运行的条件,各种参数,最重要的是两个部分,一个是WLM-Wire Load Model,一个Gate的定义(输入输出,功能,时序参数,面积等等);这只是StandarCell的库,另外还有其他库,如RAM,DSP的综合库,都以.db的形式存在。DICDER -- 博客专栏T,mf5B:K;TM w
          综合需要三种输入,一个是代码,一个是综合库,一个是综合脚本script。综合脚本主要包括了一下内容,对综合工具环境的配置,对综合对象外部环境的设置(operation condiction),对WLD的设置,对综合对象的时序的约束,综合策略,综合优化,综合报告和输出。下面给入门的人一个现成的script例子。(tcl script)
/M!T:t1y][)i0####### Set Directary #########
g0wycCp'U0set LIB typical
m2e;l"lVo.gW(Q0set SYNDIR $HOMEDICDER -- 博客专栏%| nE+W(zh^2n3d?
set SRCDIR $HOME/src
&m5m3]!Y*d1[F}0set SCRDIR $HOME/scriptDICDER -- 博客专栏7by*D?xXc
set RPTDIR $HOME/rptDICDER -- 博客专栏5|@JKs;na8Y
set SYNDB   $HOME/db
Aj%pc+?&]Y5Ql'Np|0set SYNOPSYS "/cad/synopsys/"
!qI(q`7Q(J0t0######Enviroment############
.sQx/VeJxQ0define_design_lib WORK -path $SYNDIR/WORKDICDER -- 博客专栏V[6n-}3N!j2p;D
set bus_naming_style %s_%dDICDER -- 博客专栏1j;pN,?[4zw
set verilogout_single_bit "false"
V1DC'g `;c0set hdlin_enable_vpp "true"DICDER -- 博客专栏)W5XV5QfAV~"I
set hdlin_enable_vpp "true"
#[{sPXbu P0set verilogout_no_tri "true"DICDER -- 博客专栏PR)j:Sn5~+q ])e
set write_name_nets_same_as_ports "true"DICDER -- 博客专栏m\_Qsh9~6O@)jf/V
set compile_preserve_sync_resets "true"
z;X,A(yAP0set_ultra_optimization true
!kx}F&R0set verilogout_equation falseDICDER -- 博客专栏rt!s2ulqaE
set verilogout_no_tri trueDICDER -- 博客专栏e*v.{0s`
set sdc_write_unambiguous_names falseDICDER -- 博客专栏,qtJ {F*U
######Libary#################DICDER -- 博客专栏v2S0{$Iv!D`"][
set synopsys_path "$SYNOPSYS/libraries/syn \\DICDER -- 博客专栏BQ^PO N
            $SYNOPSYS/dw/sim_ver"DICDER -- 博客专栏^:]Q4[u4L C;M
set standarcell_path "*"
?#w*V8TKE%Vf+h0set search_path "$search_path \\
OCbJ.KV-m e)[5l7b0          $synopsys_path \\
MxGV2NlCt0          $standarcell_path"DICDER -- 博客专栏/J$dag i q
set target_library "typical.db"DICDER -- 博客专栏A5VU P8s@Bt1`
set symbol_library "*"DICDER -- 博客专栏 Bp'o q+^1u
set synthetic_library "dw_foundation.sldb"
#uRT0?b5ka0set link_library "* $target_library dw_foundation.sldb"DICDER -- 博客专栏zrL[!\S*M7l
######Read Design#############
&F4X c I.M?0analyze -format verilog -lib WORK [list *] > $RPTDIR/analyze.rptDICDER -- 博客专栏.e dIp;?`}` i

0KE#g2z~0elaborate designtop -lib WORK -gate_clock > $RPTDIR/elaborate.rpt
mE f;w vN0DICDER -- 博客专栏D#K{J1^&p-N
write -format db -hier -modified -output $SYNDB/$TOPMODULE.rtl.dbDICDER -- 博客专栏b@rH,z6\#P T@8B

"F,G+U0Mm%Y \mr0current_design $TOPMODULEDICDER -- 博客专栏I9VI/c2v'r,}$P
#######Set INTERFACE ENV#########DICDER -- 博客专栏,j'@,^4{{#b'U\I^
set_drive 10 [all_inputs]
_6B|~w5Y3d? \,c0set_fanout_load 10 [all_outputs]
`spP)_^3e2G0######Timing Exceptions#######DICDER -- 博客专栏:@ t$A(fgAQow
set_false_path -from rst_DICDER -- 博客专栏:n6GA5hD^

XC)r LdP6o_0uniquifyDICDER -- 博客专栏i(qYx\6VM9Y
linkDICDER -- 博客专栏p`Orfnoj!y-qI

PGb2X f h8U!{7w0########Set Clock#############DICDER -- 博客专栏l[gWoL B
create_clock -name CLK -p $PERIOD [get_ports clk] -waveform {0, 5}DICDER -- 博客专栏 Q0p FAS(fO\b4tc
set_clock_uncertainty 0.3 CLK
C|"GG,gq bv0set_input_delay 3 -clock CLK [all_inputs]
}o$n)o PI] Q7SR6X0set_output_delay 3 -clock CLK [all_outputs]DICDER -- 博客专栏#f f^w|U,R
set_dont_touch clk
0G#NKie0#######Compile Option############
_+Tt6kis;A0compile -map_effort medium > $RPTDIR/compile.rpt
"IB;S9V]#l8vD0#######Report####################DICDER -- 博客专栏 nj1o6J\"]Z9_
report_timing > $RPTDIR/report_timing.rpt
/fxz*L3l e]6N#t0report_area > $RPTDIR/area.rpt
m`)t X _U9kK%_0#######Result####################DICDER -- 博客专栏:[_*}7z[
write -format db -hier -o $SYNDB/*.dbDICDER -- 博客专栏%`Q Z/A q#Z W
write -format verilog -hier -o $SYNDB/*.v
{V hS/x O [1WoE0write_sdf -version 2.1 $SRCDIR/../netlist/*.sdfDICDER -- 博客专栏q7BR:eU7cZC
write_constraints -cover_design -format sdf-v2.1 -output *.syn.sdf
@(q:i6R1fK|xi Q0write_script -hier -out $SCRDIR/*.sdc
`:I3\9O:{p1r3Z0
fRlF;L#mU*FjR0这是一个非常完善的script结构(仅供参考,这只是一个架构,具体语法可能还需补充和修正,不可随便使用在研发上,面得你花很多时间去调试脚本),使用于RTL2Netlist的综合,当然PAR之后的综合肯定不是这样子写的,其中原因建议大家看看<<advance chip synthesis>>。今后有空我再把script各个部分做详细见解,今天就写到这里。哎,写了那么多了,就是没有人捧场啊!^_^
C]/F0J%@0
j4X0eqc0DICDER -- 博客专栏 p"l:oUe]

zm"n'ode:uS$K0########################################################################################################################
G4|e TD0DICDER -- 博客专栏.T!Ey%R[*e

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

TAG: IC设计与验证

引用 删除 vtexer   /   2007-04-06 23:15:18
写得很仔细。受益匪浅,谢谢。
引用 删除 laoK   /   2007-03-23 14:52:02
我踩,我踩,不错!
引用 删除 justin   /   2007-01-25 15:38:49
介绍得十分详细!可不可以讲解一下关于门控时钟、分频时钟以及多周期时钟的综合方法?谢谢
引用 删除 kaimen   /   2006-12-18 00:02:13
我来捧场拉,受益非浅
引用 删除 langgai   /   2006-10-25 19:21:37
才发现这儿
顶!
maxwell232 引用 删除 maxwell232   /   2006-01-09 16:12:53
写得不错,支持~呵呵!
 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar