IC设计有关.docx
《IC设计有关.docx》由会员分享,可在线阅读,更多相关《IC设计有关.docx(12页珍藏版)》请在冰豆网上搜索。
![IC设计有关.docx](https://file1.bdocx.com/fileroot1/2023-1/1/f753722e-67a2-48ff-b314-f591b2f982e0/f753722e-67a2-48ff-b314-f591b2f982e01.gif)
IC设计有关
首先要知道自己在干什么?
数字电路(fpga/asic)设计就是逻辑电路的实现,这样子说太窄了,因为asic还有不少是模拟的,呵呵。
我们这里只讨论数字电路设计。
实际上就是如何把我们从课堂上学到的逻辑电路使用原理图(很少有人用这个拉),或者硬件描述语言(Verilog/VHDL)来实现,或许你觉得这太简单了,其实再复杂的设计也就是用逻辑门电路搭起来的。
你学习逻辑电路的时候或许会为卡拉图,触发器状态推倒公式而感到迷惑,但是其实有一点可以放心的是,实际设计中只要求你懂得接口时序和功能就可以了,用不着那么复杂得推倒公式,只要你能够用语言把逻辑关系表述清楚就可以了,具体这个逻辑关系采用什么门电路搭的,可以不关心,综合工具(synthesistool)可以帮你处理。
当然你要知道基本门电路的功能,比如D触发器,与门,非门,或门等的功能(不说多的,两输入的还是比较简单的)。
---一句话,采用verilog或者VHDL描述设计对象的逻辑功能,这就是数字电路设计的任务!
--------------------------------------------------------------------------------
sm4P5G0xc
O?
z0说到这里入门必须要两个基本功:
逻辑电路基础,硬件描述语言。
有了这两个基本功,就算你其他都不会也能找到工作,呵呵,或许你会说,现在面试要问fpga,要问时序分析,有那么简单么?
其实这些东西在你有了这两个基本功之后,其他的都可以慢慢学习。
注意硬件描述语言和逻辑电路的学习可以同步学习,而且要牢记,学习硬件描述语言进步取决于你对电路的理解和你对仿真器的使用。
为什么这样子说呢?
因为硬件描述语言RTL(寄存器传输级)主要是用来给综合工具综合成电路的,所以要满足特定的codingstyle,这些codingstyle将对应这特定的逻辑,比如时序电路应该怎么写,组合电路怎么写,这是有一定约束的,为此若你对逻辑电路比较熟悉,你就知道自己写代码大体综合后会采用什么门电路来组成;另外,写代码就要仿真,这是不可以避免的---不仿真,你怎么知道自己写的代码符合设计的要求呢?
能够熟练使用仿真器,你就有了调试代码的基本能力,否则,写再多的代码也没有用。
这也是今天我感到兴奋的一个因素,目前正在使用vera验证语言,采用类C++的风格,对于习惯verilog的我开始还不习惯高级语言的调试环境,定位一个问题得花上一天;但是一旦你能够熟练使用编译仿真工具之后,你就会发现其实自己的很多想法可以很快的写成代码,并通过调试来提高自己对语言的理解。
----学习的进步在于,把自己的想法用语言来实现,并调试验证是否正确。
学习fpga应该从xilinx和altera器件的入手,这是当今世界最大的两家可编程器件供应商,当然学习fpga应该你具备一定的Verilog的基础。
我们就用xilinx作为例子来讲解吧。
fpga的开发流程,首先是综合,布局布线,生成bit文件,最后下载。
综合,可以用synplify,也可以用synopsys的fpgacompiler,当然也可以用ISE自带的综合工具,Mentor也提供fpga开发的工具。
作为入门,synplify是一个很好的选择,第一,可以熟悉电路结构,第二,作为入门你可以在synplify的综合流程中检查自己代码的质量。
以前没有用LEDA做代码QA的时候,我是经常用synplify作为QA的工具的,当然你得对synplify的综合策略和综合报告比较熟悉才行。
综合完毕之后生成EDIF文件。
作为xilinx,第三方的综合工具可以提供EDIF或者NCF文件,自带的XST综合工具输出的是NGC,与此同时,我们可能还会用到xilinx的core,core文件主要以edn形式存在;有了这些文件我们就进入implementation阶段,这个阶段分translate,Map,PAR三大部分,translate是把综合得到网表和core的网表文件转化为NGD文件,作为Map的输入,Map是把网表文件映射到Xilinx中的基本元件中,如slice,blockram等等,最后PAR也就是placeandroute,最后就可以生成bit文件了。
推荐的书籍《FPGA/CPLD设计工具——XilinxISE5.x使用详解》,该书对整个设计流程有详细的描述,还介绍了很多高级技巧,不过对于asic设计人员,除非要做FPGA验证,否则没有必要看这些东西,因为学习FPGA就是一个完整的ASIC设计流程,不像做ASIC那样设计人员还分前端后端,做FPGA涉及的将会是很多因素,包括内部结构和板级的调试等等。
学习fpga除了学习开发流程之外,另外一方面是学习其内部结构。
xilinx的fpga的结构介绍如下:
基本单元是LUT,由LUT组成SLICE,由SLICE组成CLB,具体多少个LUT组成SLICE,多少个SLICE组成CLB由不同的器件类型决定,可以参考datasheet。
此外,就是BlockRam,DLL或者是DCM,还有DSP等。
现在流行SOC,不少高端器件还嵌入了微处理器,有软核有硬核。
学习硬件结构最好的入门书籍是孟宪元先生的书,虽然时间有点久了,不过从我看的书来看,只有他才是分析得最为彻底的。
现在介绍这方面的书籍也多了,不过,有点要提醒的,用什么器件看什么器件的datasheet,没有必要把这个东西当教科书学,查一查就可以了。
学习fpga有机会买个板子自己写点程序跑一跑,应该是一件挺不错的事情。
现在很多宽带通信应用的fpga设计有Serdes接口,DDR接口之类的,不是特殊要求,自己玩,估计也用不上那么复杂的,写几个状态机或者是UART就可以。
上回我们讨论了学习逻辑电路和硬件描述语言的方法。
如何买书,如何看书。
这回我们讨论fpga和asic设计有什么区别。
fpga现场可编程器件,PLD方面的东西,通过verilog编译成配置文件,加载到fpga中实现特定的功能。
其实fpga本身就是一个芯片,只是你可以通过编程的方式修改内部逻辑连接和配置实现自己想要的功能。
asic专用集成芯片,是针对特定应用设计的芯片。
实现asic,就如从一张白纸开始,你得有代码,之后综合,之后布局,布线,得到GDSII后去流片。
fpga器件也是通过这个流程过来的,不过他应该算一个通用器件,就如cpu,可以在很多情况下应用,不像mp3芯片,它就只能播放mp3,所以只能称为专用芯片。
不论通用还是专用,都有差不多的流程,注意上面说的是半定制的数字集成芯片的流程。
作为模拟,还有一些特殊的全定制芯片,一般都是从版图开始的。
速度:
相同的工艺和设计,在fpga上的速度应该比asic跑得慢。
为什么呢?
因为fpga内部是基于通用的结构,也就是LUT(lookuptable),它可以实现加法器,组合逻辑等等,而asic,一般你加法器就是加法器,而比较器就是比较器,fpga结构上的通用性必然导致冗余;另外,作为fpga基本单元是LUT(LUT组成SLICE,SLICE组成CLB--这是xilinx的结构),为此大的设计假如一个LUT实现不了,就得用两个LUT,一个SLICE实现不了就要用CLB,不同结构处于特定的位置,信号之间的互联,导致的wiredelay是不可忽略的一部分。
而对于asic来说没有结构上的限制,而且对于特定的实际可以在空间上靠得很近,相对之下wiredelay和celldelay都应该比fpga小。
当然LUT中也有DFF,作为高速的设计一般都会在一个简单的组合逻辑操作之后打一拍,再做下一步的处理。
DICDER--博客专栏yl
--------------------------------------------------------------------------------
YZ1d
--------------------------------------------------------------------------------
D5v-b4h
面积:
从上面上看,fpga相对于asic来说还是大很多的。
要是你知道自己的手机基带芯片是一个fpga做的,你肯定会气死。
n大一个fpga,想让你放到口袋里面估计还是有困难。
功耗:
也是明显的东西,fpga功耗比asic要大。
以上都是基于相同制造工艺和设计的条件下比较的。
从另外一个侧面看,也就是开发速度和流程上看,fpga开发简单,asic开发流程长风险大。
fpga除了代码之外,从综合到布局布线生成配置文件都是通过软件自动产生的,当然可以有一定的约束。
但是,你要知道,你只是在一个房子里面画画,这个房子就是现成的fpga。
画得不满意,你搽掉,再画一个。
不会对房子有多大影响-只要你不把fpga烧掉。
asic设计,你不仅要关心代码,而且你要关心时序,关心设计符合DFT的要求,关心layout,关心SI。
。
。
。
。
。
就相当于你什么都没有,现在房子要由你来盖,盖多大(floorplan),要如何盖,电源线如何走,水管如何设计,门开在那个方向等等的东西。
一旦房子盖好了,你觉得不满意?
你就得拆掉,某一个缺陷都影响这个房子。
你想画画,可以,你得画得好,画不好就不能改了。
因为asic不是可编程的fpga,内部结构一旦流片后就确定下来了。
bugs是asic中致命的东西!
_对于费用来说,fpga贵在单片,开发工具和风险基本不存在。
对于asic贵在流片的费用和开发工具,NRE费用随着工艺的提高变相当贵,除非你的芯片一次成功可以量产,否则单片费用将其贵无比!
你想想留一次片50W,给你拿回来100颗样片,都是bugs。
一片多少钱啊?
?
!
!
DICDER--博客专栏_gm?
_`iJ
]
开发周期,fpga6个月,asic一年。
若是一个设计人员说自己一年之内tapout了4-5个片子,估计他也只是做做综合或者后端。
从设计到验证结束是一段漫长的时间,一旦验证初步完成,RTL2GDSII的过程是很快的。
asic设计入门(前端)
asic设计前后端是如何分的呢?
asic设计的前后端就如FPGA设计的Implementation之前之后(Xilinx)的区分,前端负责综合网表之前的所有事情,而后端负责Netlist到GDSII的过程。
注意这也不是绝对的,现在前端也可以用PhysicalCompiler做一些后端做的事情(物理综合),随殴ひ盏姆⒄梗昂蠖说姆纸庀咴嚼丛侥:
恕5比籄SIC的前端还考虑到很多关于Power,DFT等等方面因素;后端呢,在这里粗略介绍一下,Floorplan,版图规划,主要指Macro的放置还有PGring等的规划;Place-布局,主要指standardcell的放置;Route,布线;其中还涉及到DFT,DRC,LVS还有STA。
这些东西了解一下就可以了。
ASIC前端设计入门,这个流程幸好没有忘记。
不像FPGA那样(和器件关系太多),数字前端都应该是一样的。
1系统规划需求分析----制定Specification
2模块划分-----根据Secification,开始划分模块,具体到接口时序和功能,最后书写详细设计文档。
3模块编码输入----注意符合CodingStyle
4模块级仿真验证---行覆盖率应该达到99%(default语句是覆盖不到的)
5系统集成和系统仿真验证----验证平台应该在Specification确定之后和代码编写并行进行。
6综合----得到网表
7STA-----验证时序
8形式验证--验证网表和RTL的等效性
若是Netlist2GDSII的话这些就应该可以了,象DFT之类的估计后端人员都可以帮助你实现。
看起来挺简单的,其实花时间最多的还是在前面,也就是综合之前的步骤是最费时间的,包括制定Specification,模块级的详细设计方案还有验证,一旦得到一个godenRTL,从RTL到GDSII是很快的。
所谓garbageingarbageout,到了综合之后的步骤基本上不是对功能的修改,而是按照特定功能的实现,所以一个好的RTL是非常重要的。
在系统规划方面,复位,时钟方案是最重要的因素,其次是DFT;在模块编码的时候就是要注意这些要求了,比如不要内部私自生成时钟和复位信号,防止出现不必要的latch等等。
模块级验证应该是系统验证关键部分,原来我们做TDSCDMA手机终端芯片的时候,Viterbi验证的是好几个步骤组成的,在模块级就验证做得非常完善,后来系统验证,FPGA验证到最后tapout回来都没有问题。
当然大家都关心综合如何处理,STA如何处理,形式验证如何实现,因为这几个步骤不是所有人都可以接触的,毕竟这些工具都价格不菲;一个公司可以随便找几个人一起开发FPGA,但是说要随便找几个人做ASIC,估计Tool的费用就要砸掉好几百W--这里指的是商用软件,假如你说其实D版的也可以用,^_^那就算你用了,流片的费用也不少啊。
下面我就一部分一部分给大家介绍asic前端设计的各个部分。
在没有介绍综合之后的流程之前,我先介绍一下从系统规划到综合前的流程,前面FPGA和这里的ASIC在这方面介绍的都不多,在这里补过,希望对大家有帮助。
系统规划当然是系统人员制定的,假如你想知道如何制定,大体上是系统功能,性能,系统接口,系统的时钟方案,复位方案,DFT方案;系统采用了多少Memory,是否使用DSP,MCU,架构如何,最后diesize和power大约多大等等;作为一名设计人员多数你会分到一个模块的设计,一般情况下在系统方案制定好之后就是模块划分了,很多情况下是根据功能来划分;模块划分之后,设计人员会不断讨论实现方案和关键问题的解决方法,开始是模块之间的接口,接着是模块内部的实现方案和时序,经过详细的讨论之后,这些都要写成详细设计方案。
三年前自己的第一个设计是画了几个图就做设计的,小小的一个东西,没有文档,看草图,做了一个月;在积累了经验之后,改变了开发流程,也是大公司采用的方法,先写详细设计方案,再写代码;你会发现可能详细方案花了1个月,代码半个月就可以写完了。
因为思路理清楚了,写代码当然简单了,千万不要一边写代码,一遍写设计方案,到了最后,问题一个都没有解决,代码改来改去,还是不能用。
再之就是调试,现在很多公司都在服务器上写代码,网络连接速度很慢,更加不用说调试了。
我原来的习惯,也是现在的习惯就是在本机做设计,第一书写快,第二仿真快,对于模块设计应该是设计完一个模块就调试一个模块,而不是等系统集成的时候再测试模块。
所以仿真调试的速度很重要,而在服务器上用VCS调试小模块,还不如在本机上用Modelsim快。
刚入新公司,做模拟设计,人家一个月要完成的设计,我用了两个星期,道理很简单,我有一个代码书写和调试的平台,十分钟内就可以把一个代码调试n次。
当然这个环境也不是大家都有,都会用,这也是我三年积累下来的东西^_^
综合工具
第一节:
什么是综合呢?
synthesis,台湾翻译为-合成,其作用就是将硬件描述语言的RTL级代码转变为门级网表。
当然,现在综合技术已经很成熟了,还有推出的行为(behavioral)综合和物理(physical)综合。
我们这里讨论的是逻辑(logic)综合。
综合技术是提高设计产能的一个很重要的技术,没有综合技术的发展,我们就不可能用HDL实现电路的设计,因为HDL开始是用来供电路仿真建模使用的,到了后来才把其中一部分子集作为可综合的语言,也就是我们使用的RTLCODE。
很多人入门都用HDL做设计,就以为HDL就只是用来做设计的,没有看到HDL最初始的一面,所以在验证的时候,就无法用好HDL另外一部分强大的功能。
有时间还是可以看看WritingTestbench这本书,增强对HDL语言在验证方面作用的了解,也是提高对HDL认识很好的补充。
我们以DesignCompiler为例子讲解综合的过程。
首先,综合就要必须要用综合库,这个你可以向厂家要,综合库可以通过.lib这个库文件转变成.db综合库,这个过程可以在DesignCompiler里面用实现,综合库里面有什么内容呢?
.db是无法阅读的,.lib是可以阅读的,里面有库的基本参数的单位,库运行的条件,各种参数,最重要的是两个部分,一个是WLM-WireLoadModel,一个Gate的定义(输入输出,功能,时序参数,面积等等);这只是StandarCell的库,另外还有其他库,如RAM,DSP的综合库,都以.db的形式存在。
综合需要三种输入,一个是代码,一个是综合库,一个是综合脚本script。
综合脚本主要包括了一下内容,对综合工具环境的配置,对综合对象外部环境的设置(operationcondiction),对WLD的设置,对综合对象的时序的约束,综合策略,综合优化,综合报告和输出。
下面给入门的人一个现成的script例子。
(tclscript)
#######SetDirectary#########
setLIBtypical
setSYNDIR$HOME
setSRCDIR$HOME/src
setSCRDIR$HOME/script
setRPTDIR$HOME/rpt
setSYNDB$HOME/db
setSYNOPSYS"/cad/synopsys/"
######Enviroment############
define_design_libWORK-path$SYNDIR/WORK
setbus_naming_style.%s_%d
setverilogout_single_bit"false"
sethdlin_enable_vpp"true"
sethdlin_enable_vpp"true"
setverilogout_no_tri"true"
setwrite_name_nets_same_as_ports"true"
setcompile_preserve_sync_resets"true"
setultra_optimizationtrue
setverilogout_equationfalseN
setverilogout_no_tritrue
setsdc_write_unambiguous_namesfalse
######Libary#################
setsynopsys_path"$SYNOPSYS/libraries/syn\\
$SYNOPSYS/dw/sim_ver"
setstandarcell_path"*"
setsearch_path"$search_path\\
$synopsys_path\\
$standarcell_path"s
settarget_library"typical.db"
setsymbol_library"*"
setsynthetic_library"dw_foundation.sldb"
setlink_library"*$target_librarydw_foundation.sldb"
######ReadDesign#############
analyze-formatverilog-libWORK[list*]>$RPTDIR/analyze.rpt
elaboratedesigntop-libWORK-gate_clock>$RPTDIR/elaborate.rpt
write-formatdb-hier-modified-output$SYNDB/$TOPMODULE.rtl.db
current_design$TOPMODULE
#######SetINTERFACEENV#########
set_drive10[all_inputs]
set_fanout_load10[all_outputs]
######TimingExceptions#######
set_false_path-fromrst_
uniquify
link
########SetClock#############
create_clock-nameCLK-p$PERIOD[get_portsclk]-waveform.{0,5}
set_clock_uncertainty0.3CLK
set_input_delay3-clockCLK[all_inputs]
set_output_delay3-clockCLK[all_outputs]
set_dont_touchclk
#######CompileOption############
compile-map_effortmedium>$RPTDIR/compile.rpt
#######Report####################
report_timing>$RPTDIR/report_timing.rpt
report_area>$RPTDIR/area.rpt
#######Result####################
write-formatdb-hier-o$SYNDB/*.db
write-formatverilog-hier-o$SYNDB/*.v
write_sdf-version2.1$SRCDIR/../netlist/*.sdf
write_constraints-cover_design-formatsdf-v2.1-output*.syn.sdf
write_script-hier-out$SCRDIR/*.sdc
这是一个非常完善的script结构(仅供参考,这只是一个架构,具体语法可能还需补充和修正,不可随便使用在研发上,面得你花很多时间去调试脚本),使用于RTL2Netlist的综合,当然PAR之后的综合肯定不是这样子写的,其中原因建议大家看看<>。
今后有空我再把script各个部分做详细见解,今天就写到这里。
哎,写了那么多了,就是没有人捧场啊!
^_^
########################################################################################################################
第二节,综合概述
综合技术的研究可以追溯到20世纪60年代,IBM公司T.J.Watson研究中心开发ALERT系统,将寄存器传输级算法描述转化成逻辑级的结构实现;20世纪70年代,综合技术发展迅速,但主要致力于较低层次的逻辑综合和版图综合;20世纪80年代中期,专用集成电路的广泛应用,要求芯片设计大规模、高性能、短周期,大大推动了从算法级设计描速向寄存器传输级设计描述转换的高层次综合技术。
逻辑综合概念
逻辑综合负责将寄存器传输级的结构描述转化为逻辑层的结构描述,以及将逻辑层的结构描述转化为电路的结构描述。
在数字IC设计领域常用的EDA综合工具中,最权威的要算Synopsys公司提供的综合工具。
Synopsys公司提供的DesignCompiler(DC)是业界流行的、功能强大的逻辑综合工具。
用户只需要输入设计规格的HDL描述和时间约束,就可能得到较为优化的门级综合网表。
此外,DC