首先要知道自己在干什么?數(shù)字電路(fpga/asic)設(shè)計就是邏輯電路的實現(xiàn),這樣子說太窄了,因為asic還有不少是模擬的,呵呵。我們這里只討論數(shù)字電路設(shè)計。實際上就是如何把我們從課堂上學(xué)到的邏輯電路使用原理圖(很少有人用這個拉),或者硬件描述語言(Verilog/VHDL)來實現(xiàn),或許你覺得這太簡單了,其實再復(fù)雜的設(shè)計也就是用邏輯門電路搭起來的。你學(xué)習(xí)邏輯電路的時候或許會為卡拉圖,觸發(fā)器狀態(tài)推倒公式而感到迷惑,但是其實有一點可以放心的是,實際設(shè)計中只要求你懂得接口時序和功能就可以了,用不著那么復(fù)雜得推倒公式,只要你能夠用語言把邏輯關(guān)系表述清楚就可以了,具體這個邏輯關(guān)系采用什么門電路搭的,可以不關(guān)心,綜合工具(synthesis tool)可以幫你處理。當(dāng)然你要知道基本門電路的功能,比如D觸發(fā)器,與門,非門,或門等的功能(不說多的,兩輸入的還是比較簡單的)。---一句話,采用verilog或者VHDL描述設(shè)計對象的邏輯功能,這就是數(shù)字電路設(shè)計的任務(wù)!
說到這里入門必須要兩個基本功:邏輯電路基礎(chǔ),硬件描述語言。有了這兩個基本功,就算你其他都不會也能找到工作,呵呵,或許你會說,現(xiàn)在面試要問fpga,要問時序分析,有那么簡單么?其實這些東西在你有了這兩個基本功之后,其他的都可以慢慢學(xué)習(xí)。注意硬件描述語言和邏輯電路的學(xué)習(xí)可以同步學(xué)習(xí),而且要牢記,學(xué)習(xí)硬件描述語言進步取決于你對電路的理解和你對仿真器的使用。為什么這樣子說呢?因為硬件描述語言RTL(寄存器傳輸級)主要是用來給綜合工具綜合成電路的,所以要滿足特定的coding style,這些coding style將對應(yīng)這特定的邏輯,比如時序電路應(yīng)該怎么寫,組合電路怎么寫,這是有一定約束的,為此若你對邏輯電路比較熟悉,你就知道自己寫代碼大體綜合后會采用什么門電路來組成;另外,寫代碼就要仿真,這是不可以避免的---不仿真,你怎么知道自己寫的代碼符合設(shè)計的要求呢?能夠熟練使用仿真器,你就有了調(diào)試代碼的基本能力,否則,寫再多的代碼也沒有用。這也是今天我感到興奮的一個因素,目前正在使用vera驗證語言,采用類C++的風(fēng)格,對于習(xí)慣 verilog的我開始還不習(xí)慣高級語言的調(diào)試環(huán)境,定位一個問題得花上一天;但是一旦你能夠熟練使用編譯仿真工具之后,你就會發(fā)現(xiàn)其實自己的很多想法可以很快的寫成代碼,并通過調(diào)試來提高自己對語言的理解。----學(xué)習(xí)的進步在于,把自己的想法用語言來實現(xiàn),并調(diào)試驗證是否正確。
學(xué)習(xí)fpga應(yīng)該從xilinx和altera器件的入手,這是當(dāng)今世界最大的兩家可編程器件供應(yīng)商,當(dāng)然學(xué)習(xí)fpga應(yīng)該你具備一定的Verilog的基礎(chǔ)。我們就用xilinx作為例子來講解吧。
fpga的開發(fā)流程,首先是綜合,布局布線,生成bit文件,最后下載。
綜合,可以用synplify,也可以用synopsys的fpga compiler,當(dāng)然也可以用ISE自帶的綜合工具,Mentor也提供fpga開發(fā)的工具。作為入門,synplify是一個很好的選擇,第一,可以熟悉電路結(jié)構(gòu),第二,作為入門你可以在synplify的綜合流程中檢查自己代碼的質(zhì)量。以前沒有用LEDA做代碼QA的時候,我是經(jīng)常用 synplify作為QA的工具的,當(dāng)然你得對synplify的綜合策略和綜合報告比較熟悉才行。綜合完畢之后生成EDIF文件。
作為xilinx,第三方的綜合工具可以提供EDIF或者NCF文件,自帶的XST綜合工具輸出的是NGC,與此同時,我們可能還會用到xilinx的 core,core文件主要以edn形式存在;有了這些文件我們就進入implementation階段,這個階段分translate,Map,PAR 三大部分,translate是把綜合得到網(wǎng)表和core的網(wǎng)表文件轉(zhuǎn)化為NGD文件,作為Map的輸入,Map是把網(wǎng)表文件映射到Xilinx中的基本元件中,如slice,blockram等等,最后PAR也就是place and route,最后就可以生成bit文件了。推薦的書籍《FPGA/CPLD設(shè)計工具——Xilinx ISE5.x使用詳解》,該書對整個設(shè)計流程有詳細的描述,還介紹了很多高級技巧,不過對于asic設(shè)計人員,除非要做FPGA驗證,否則沒有必要看這些東西,因為學(xué)習(xí)FPGA就是一個完整的ASIC設(shè)計流程,不像做ASIC那樣設(shè)計人員還分前端后端,做FPGA涉及的將會是很多因素,包括內(nèi)部結(jié)構(gòu)和板級的調(diào)試等等。
學(xué)習(xí)fpga除了學(xué)習(xí)開發(fā)流程之外,另外一方面是學(xué)習(xí)其內(nèi)部結(jié)構(gòu)。xilinx的fpga的結(jié)構(gòu)介紹如下:基本單元是LUT,由LUT組成SLICE,由 SLICE組成CLB,具體多少個LUT組成SLICE,多少個SLICE組成CLB由不同的器件類型決定,可以參考datasheet。此外,就是 Block Ram,DLL或者是DCM,還有DSP等。現(xiàn)在流行SOC,不少高端器件還嵌入了微處理器,有軟核有硬核。學(xué)習(xí)硬件結(jié)構(gòu)最好的入門書籍是孟憲元先生的書,雖然時間有點久了,不過從我看的書來看,只有他才是分析得最為徹底的。現(xiàn)在介紹這方面的書籍也多了,不過,有點要提醒的,用什么器件看什么器件的 datasheet,沒有必要把這個東西當(dāng)教科書學(xué),查一查就可以了。
學(xué)習(xí)fpga有機會買個板子自己寫點程序跑一跑,應(yīng)該是一件挺不錯的事情。現(xiàn)在很多寬帶通信應(yīng)用的fpga設(shè)計有Serdes接口,DDR接口之類的,不是特殊要求,自己玩,估計也用不上那么復(fù)雜的,寫幾個狀態(tài)機或者是UART就可以。
上回我們討論了學(xué)習(xí)邏輯電路和硬件描述語言的方法。如何買書,如何看書。這回我們討論fpga和asic設(shè)計有什么區(qū)別。
fpga現(xiàn)場可編程器件,PLD方面的東西,通過verilog編譯成配置文件,加載到fpga中實現(xiàn)特定的功能。其實fpga本身就是一個芯片,只是你可以通過編程的方式修改內(nèi)部邏輯連接和配置實現(xiàn)自己想要的功能。
asic專用集成芯片,是針對特定應(yīng)用設(shè)計的芯片。實現(xiàn)asic,就如從一張白紙開始,你得有代碼,之后綜合,之后布局,布線,得到GDSII后去流片。fpga器件也是通過這個流程過來的,不過他應(yīng)該算一個通用器件,就如cpu,可以在很多情況下應(yīng)用,不像mp3芯片,它就只能播放mp3,所以只能稱為專用芯片。不論通用還是專用,都有差不多的流程,注意上面說的是半定制的數(shù)字集成芯片的流程。作為模擬,還有一些特殊的全定制芯片,一般都是從版圖開始的。
速度:相同的工藝和設(shè)計,在fpga上的速度應(yīng)該比asic跑得慢。為什么呢?因為fpga內(nèi)部是基于通用的結(jié)構(gòu),也就是LUT(look up table),它可以實現(xiàn)加法器,組合邏輯等等,而asic,一般你加法器就是加法器,而比較器就是比較器,fpga結(jié)構(gòu)上的通用性必然導(dǎo)致冗余;另外,作為fpga基本單元是LUT(LUT組成SLICE,SLICE組成CLB--這是xilinx的結(jié)構(gòu)),為此大的設(shè)計假如一個LUT實現(xiàn)不了,就得用兩個LUT,一個SLICE實現(xiàn)不了就要用CLB,不同結(jié)構(gòu)處于特定的位置,信號之間的互聯(lián),導(dǎo)致的wire delay是不可忽略的一部分。而對于asic來說沒有結(jié)構(gòu)上的限制,而且對于特定的實際可以在空間上靠得很近,相對之下wire delay和cell delay都應(yīng)該比fpga小。當(dāng)然LUT中也有DFF,作為高速的設(shè)計一般都會在一個簡單的組合邏輯操作之后打一拍,再做下一步的處理。
面積:從上面上看,fpga相對于asic來說還是大很多的。要是你知道自己的手機基帶芯片是一個fpga做的,你肯定會氣死。n大一個fpga,想讓你放到口袋里面估計還是有困難。
功耗:也是明顯的東西,fpga功耗比asic要大。
以上都是基于相同制造工藝和設(shè)計的條件下比較的。從另外一個側(cè)面看,也就是開發(fā)速度和流程上看,fpga開發(fā)簡單,asic開發(fā)流程長風(fēng)險大。
fpga除了代碼之外,從綜合到布局布線生成配置文件都是通過軟件自動產(chǎn)生的,當(dāng)然可以有一定的約束。但是,你要知道,你只是在一個房子里面畫畫,這個房子就是現(xiàn)成的fpga。畫得不滿意,你搽掉,再畫一個。不會對房子有多大影響-只要你不把fpga燒掉。
asic設(shè)計,你不僅要關(guān)心代碼,而且你要關(guān)心時序,關(guān)心設(shè)計符合DFT的要求,關(guān)心layout,關(guān)心SI。。。。。。就相當(dāng)于你什么都沒有,現(xiàn)在房子要由你來蓋,蓋多大(floorplan),要如何蓋,電源線如何走,水管如何設(shè)計,門開在那個方向等等的東西。一旦房子蓋好了,你覺得不滿意?你就得拆掉,某一個缺陷都影響這個房子。你想畫畫,可以,你得畫得好,畫不好就不能改了。因為asic不是可編程的fpga,內(nèi)部結(jié)構(gòu)一旦流片后就確定下來了。 bugs是asic中致命的東西!
對于費用來說,fpga貴在單片,開發(fā)工具和風(fēng)險基本不存在。對于asic貴在流片的費用和開發(fā)工具,NRE費用隨著工藝的提高變相當(dāng)貴,除非你的芯片一次成功可以量產(chǎn),否則單片費用將其貴無比!你想想留一次片50W,給你拿回來100顆樣片,都是bugs。一片多少錢啊??!!
開發(fā)周期,fpga6個月,asic一年。若是一個設(shè)計人員說自己一年之內(nèi)tapout了4-5個片子,估計他也只是做做綜合或者后端。從設(shè)計到驗證結(jié)束是一段漫長的時間,一旦驗證初步完成,RTL2GDSII的過程是很快的。
asic設(shè)計入門(前端)
asic設(shè)計前后端是如何分的呢?asic設(shè)計的前后端就如FPGA設(shè)計的Implementation之前之后(Xilinx)的區(qū)分,前端負責(zé)綜合網(wǎng)表之前的所有事情,而后端負責(zé)Netlist到GDSII的過程。注意這也不是絕對的,現(xiàn)在前端也可以用Physical Compiler做一些后端做的事情(物理綜合),隨毆ひ盞姆⒄梗昂蠖說姆紙庀咴嚼叢僥:恕5比籄SIC的前端還考慮到很多關(guān)于Power,DFT等等方面因素;后端呢,在這里粗略介紹一下,F(xiàn)loorplan,版圖規(guī)劃,主要指Macro的放置還有PG ring等的規(guī)劃;Place-布局,主要指standard cell的放置;Route,布線;其中還涉及到DFT,DRC,LVS還有STA。這些東西了解一下就可以了。
ASIC前端設(shè)計入門,這個流程幸好沒有忘記。不像FPGA那樣(和器件關(guān)系太多),數(shù)字前端都應(yīng)該是一樣的。
1 系統(tǒng)規(guī)劃需求分析----制定Specification
2 模塊劃分-----根據(jù)Secification,開始劃分模塊,具體到接口時序和功能,最后書寫詳細設(shè)計文檔。
3 模塊編碼輸入----注意符合Coding Style
4 模塊級仿真驗證---行覆蓋率應(yīng)該達到99%(default語句是覆蓋不到的)
5 系統(tǒng)集成和系統(tǒng)仿真驗證----驗證平臺應(yīng)該在Specification確定之后和代碼編寫并行進行。
6 綜合----得到網(wǎng)表
7 STA-----驗證時序
8 形式驗證--驗證網(wǎng)表和RTL的等效性
若是Netlist2GDSII的話這些就應(yīng)該可以了,象DFT之類的估計后端人員都可以幫助你實現(xiàn)。看起來挺簡單的,其實花時間最多的還是在前面,也就是綜合之前的步驟是最費時間的,包括制定Specification,模塊級的詳細設(shè)計方案還有驗證,一旦得到一個goden RTL,從RTL到GDSII是很快的。所謂garbage in garbage out,到了綜合之后的步驟基本上不是對功能的修改,而是按照特定功能的實現(xiàn),所以一個好的RTL是非常重要的。
在系統(tǒng)規(guī)劃方面,復(fù)位,時鐘方案是最重要的因素,其次是DFT;在模塊編碼的時候就是要注意這些要求了,比如不要內(nèi)部私自生成時鐘和復(fù)位信號,防止出現(xiàn)不必要的latch等等。模塊級驗證應(yīng)該是系統(tǒng)驗證關(guān)鍵部分,原來我們做TDSCDMA手機終端芯片的時候,Viterbi驗證的是好幾個步驟組成的,在模塊級就驗證做得非常完善,后來系統(tǒng)驗證,F(xiàn)PGA驗證到最后tapout回來都沒有問題。當(dāng)然大家都關(guān)心綜合如何處理,STA如何處理,形式驗證如何實現(xiàn),因為這幾個步驟不是所有人都可以接觸的,畢竟這些工具都價格不菲;一個公司可以隨便找?guī)讉€人一起開發(fā)FPGA,但是說要隨便找?guī)讉€人做ASIC,估計 Tool的費用就要砸掉好幾百W--這里指的是商用軟件,假如你說其實D版的也可以用,^_^ 那就算你用了,流片的費用也不少啊。
下面我就一部分一部分給大家介紹asic前端設(shè)計的各個部分。
在沒有介紹綜合之后的流程之前,我先介紹一下從系統(tǒng)規(guī)劃到綜合前的流程,前面FPGA和這里的ASIC在這方面介紹的都不多,在這里補過,希望對大家有幫助。 系統(tǒng)規(guī)劃當(dāng)然是系統(tǒng)人員制定的,假如你想知道如何制定,大體上是系統(tǒng)功能,性能,系統(tǒng)接口,系統(tǒng)的時鐘方案,復(fù)位方案,DFT方案;系統(tǒng)采用了多少 Memory,是否使用DSP,MCU,架構(gòu)如何,最后die size和power大約多大等等;作為一名設(shè)計人員多數(shù)你會分到一個模塊的設(shè)計,一般情況下在系統(tǒng)方案制定好之后就是模塊劃分了,很多情況下是根據(jù)功能來劃分;模塊劃分之后,設(shè)計人員會不斷討論實現(xiàn)方案和關(guān)鍵問題的解決方法,開始是模塊之間的接口,接著是模塊內(nèi)部的實現(xiàn)方案和時序,經(jīng)過詳細的討論之后,這些都要寫成詳細設(shè)計方案。三年前自己的第一個設(shè)計是畫了幾個圖就做設(shè)計的,小小的一個東西,沒有文檔,看草圖,做了一個月;在積累了經(jīng)驗之后,改變了開發(fā)流程,也是大公司采用的方法,先寫詳細設(shè)計方案,再寫代碼;你會發(fā)現(xiàn)可能詳細方案花了1個月,代碼半個月就可以寫完了。因為思路理清楚了,寫代碼當(dāng)然簡單了,千萬不要一邊寫代碼,一遍寫設(shè)計方案,到了最后,問題一個都沒有解決,代碼改來改去,還是不能用。
再之就是調(diào)試,現(xiàn)在很多公司都在服務(wù)器上寫代碼,網(wǎng)絡(luò)連接速度很慢,更加不用說調(diào)試了。我原來的習(xí)慣,也是現(xiàn)在的習(xí)慣就是在本機做設(shè)計,第一書寫快,第二仿真快,對于模塊設(shè)計應(yīng)該是設(shè)計完一個模塊就調(diào)試一個模塊,而不是等系統(tǒng)集成的時候再測試模塊。所以仿真調(diào)試的速度很重要,而在服務(wù)器上用VCS調(diào)試小模塊,還不如在本機上用Modelsim快。剛?cè)胄鹿荆瞿M設(shè)計,人家一個月要完成的設(shè)計,我用了兩個星期,道理很簡單,我有一個代碼書寫和調(diào)試的平臺,十分鐘內(nèi)就可以把一個代碼調(diào)試n次。當(dāng)然這個環(huán)境也不是大家都有,都會用,這也是我三年積累下來的東西^_^
綜合工具
第一節(jié): 什么是綜合呢?synthesis,***翻譯為-合成,其作用就是將硬件描述語言的RTL級代碼轉(zhuǎn)變?yōu)殚T級網(wǎng)表。當(dāng)然,現(xiàn)在綜合技術(shù)已經(jīng)很成熟了,還有推出的行為(behavioral)綜合和物理(physical)綜合。我們這里討論的是邏輯(logic)綜合。
綜合技術(shù)是提高設(shè)計產(chǎn)能的一個很重要的技術(shù),沒有綜合技術(shù)的發(fā)展,我們就不可能用HDL實現(xiàn)電路的設(shè)計,因為HDL開始是用來供電路仿真建模使用的,到了后來才把其中一部分子集作為可綜合的語言,也就是我們使用的RTL CODE。很多人入門都用HDL做設(shè)計,就以為HDL就只是用來做設(shè)計的,沒有看到HDL最初始的一面,所以在驗證的時候,就無法用好HDL另外一部分強大的功能。有時間還是可以看看Writing Testbench這本書,增強對HDL語言在驗證方面作用的了解,也是提高對HDL認識很好的補充。
我們以DesignCompiler為例子講解綜合的過程。
首先,綜合就要必須要用綜合庫,這個你可以向廠家要,綜合庫可以通過.lib這個庫文件轉(zhuǎn)變成.db綜合庫,這個過程可以在DesignCompiler 里面用實現(xiàn),綜合庫里面有什么內(nèi)容呢?.db 是無法閱讀的,.lib是可以閱讀的,里面有庫的基本參數(shù)的單位,庫運行的條件,各種參數(shù),最重要的是兩個部分,一個是WLM-Wire Load Model,一個Gate的定義(輸入輸出,功能,時序參數(shù),面積等等);這只是StandarCell的庫,另外還有其他庫,如RAM,DSP的綜合庫,都以.db的形式存在。
綜合需要三種輸入,一個是代碼,一個是綜合庫,一個是綜合腳本script。綜合腳本主要包括了一下內(nèi)容,對綜合工具環(huán)境的配置,對綜合對象外部環(huán)境的設(shè)置(operation condiction),對WLD的設(shè)置,對綜合對象的時序的約束,綜合策略,綜合優(yōu)化,綜合報告和輸出。下面給入門的人一個現(xiàn)成的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 ENV#########
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 結(jié)構(gòu)(僅供參考,這只是一個架構(gòu),具體語法可能還需補充和修正,不可隨便使用在研發(fā)上,面得你花很多時間去調(diào)試腳本),使用于RTL2Netlist的綜合,當(dāng)然PAR之后的綜合肯定不是這樣子寫的,其中原因建議大家看看《《advance chip synthesis》》。今后有空我再把script各個部分做詳細見解,今天就寫到這里。哎,寫了那么多了,就是沒有人捧場啊!^_^
########################################################################################################################
第二節(jié),綜合概述
綜合技術(shù)的研究可以追溯到20世紀(jì)60年代,IBM公司T.J.Watson研究中心開發(fā) ALERT系統(tǒng),將寄存器傳輸級算法描述轉(zhuǎn)化成邏輯級的結(jié)構(gòu)實現(xiàn);20世紀(jì)70年代,綜合技術(shù)發(fā)展迅速,但主要致力于較低層次的邏輯綜合和版圖綜合;20 世紀(jì)80年代中期,專用集成電路的廣泛應(yīng)用,要求芯片設(shè)計大規(guī)模、高性能、短周期,大大推動了從算法級設(shè)計描速向寄存器傳輸級設(shè)計描述轉(zhuǎn)換的高層次綜合技術(shù)。
邏輯綜合概念
邏輯綜合負責(zé)將寄存器傳輸級的結(jié)構(gòu)描述轉(zhuǎn)化為邏輯層的結(jié)構(gòu)描述,以及將邏輯層的結(jié)構(gòu)描述轉(zhuǎn)化為電路的結(jié)構(gòu)描述。在數(shù)字IC設(shè)計領(lǐng)域常用的EDA綜合工具中,最權(quán)威的要算Synopsys公司提供的綜合工具。Synopsys公司提供的Design Compiler(DC)是業(yè)界流行的、功能強大的邏輯綜合工具。用戶只需要輸入設(shè)計規(guī)格的HDL描述和時間約束,就可能得到較為優(yōu)化的門級綜合網(wǎng)表。此外,DC還集成了功能強大的靜態(tài)時序分析引擎,并支持與后端布局布線工具交互工作。
邏輯綜合的流程
從某種意義而言,綜合就是將設(shè)計的HDL描速轉(zhuǎn)化為門級網(wǎng)表的過程。Synopsys公司提供的綜合工具DC把綜合分為三個步驟進行:synthesis=translation+mapping+optimization。 Translation是指把設(shè)計的HDL描述轉(zhuǎn)化為GTECH庫元件組成的邏輯電路;GTECH庫是Synopsys公司提供的通用的、獨立于工藝的元件庫。Mapping是指將GTECH庫元件映射到某一特定的半導(dǎo)體工藝庫上,此時的電路網(wǎng)表包含了相關(guān)的工藝參數(shù)。Optimization是根據(jù)設(shè)計者設(shè)定的時延、面積、線負載模型等綜合約束條件對電路網(wǎng)表進一步優(yōu)化的過程。從綜合工具的使用流程來看,綜合包括綜合環(huán)境的設(shè)置,綜合約束,綜合優(yōu)化,綜合與后端流程等。
綜合約束用來設(shè)定電路綜合的目標(biāo),它包括設(shè)計環(huán)境約束、時間約束和面積約束。
設(shè)計環(huán)境約束指的是用來描述設(shè)計在工作時的溫度、電壓、驅(qū)動、負載等外部條件的一系列屬性。基本的環(huán)境設(shè)置內(nèi)容包括工作條件、負載模型、系統(tǒng)接口驅(qū)動或扇出能力等設(shè)置。這些屬性約束在電路綜合時是必須的,如果用戶沒有進行顯示的說明,則DC在綜合的時候會采用默認值。
時間約束內(nèi)容包括定義時鐘、定義時鐘網(wǎng)絡(luò)的時間約束和時序路徑時間約束設(shè)定,以及非同步設(shè)計的時間約束等。了解延遲的計算是定義恰如其分的時間約束的關(guān)鍵。Synopsys公司支持幾種延遲模型:一是CMOS通用的延遲模型,二是CMOS分段的線性延遲模型,三是非線性的查表延遲模型。深亞微米的設(shè)計,前兩種模型并不常用,非線性的延遲模型以輸入的遷越時間和輸出電容負載為參變量計算延遲的時間值,其結(jié)果以表格的形式列出供DC查找。
面積約束和時間約束之間是一對矛盾且需要折中的關(guān)系,DC綜合默認為時間約束比面積約束擁有更高的優(yōu)先級。DC優(yōu)化時默認不進行面積優(yōu)化,如果你關(guān)注于芯片的面積,可以使用set_max_area命令設(shè)定面積的約束,使得DC完成時序約束之后繼續(xù)進行面積優(yōu)化。
在設(shè)定綜合約束之后,一般并不馬上進行綜合優(yōu)化。因為對于一個較大的設(shè)計來說,綜合一次時間很長。因此,綜合前確認綜合約束命令是否正確添加到設(shè)計中時很有必要的,可以減少由于綜合約束不正確重新綜合優(yōu)化的風(fēng)險,減少綜合反復(fù)的時間。檢查綜合約束設(shè)置的命令有report_design, report_port –verbose, report_clock [-skew], report_constraints, report_timimg_requirement等。
許多版圖工具只接受Verilog或EDIF格式的綜合網(wǎng)表作為輸入。在綜合后提供Verilog格式的網(wǎng)表送給后端的版圖工具,IC工程師還必須對綜合的網(wǎng)表做好一下處理:
1.徹底解決多次例化同一子模塊的問題
2.修正設(shè)計中部分連線的命名以簡化綜合網(wǎng)表
3.刪除整個設(shè)計中懸空的端口
4.確保每個實例化單元的引腳都是可見的
5.避免網(wǎng)表中存在assign語句、傳輸門和三態(tài)連線的定義
6.避免網(wǎng)表中存在不必要的門控時鐘或門控復(fù)位信號
7.避免網(wǎng)表中引用的實例化名不存在對應(yīng)的實現(xiàn)邏輯
在綜合之后,我們還得對綜合后的網(wǎng)表進行門級仿真,在門級仿真上Synopsys公司提供的VCS仿真工具在服務(wù)器上運行的速度是比較快的。門級仿真過程中還有一步就是帶時序反標(biāo)的時序仿真,通過DC或者PT寫出SDF文件,在網(wǎng)表中將邏輯延遲和線延遲反標(biāo)入電路中,模擬更加真實的情況。
功能仿真及驗證
驗證的目的視為了保證設(shè)計實現(xiàn)提供的功能特性是正確的,是與設(shè)計規(guī)范中定義的功能特性保持一致。驗證的目的在于證明設(shè)計沒有錯誤。然而事實上驗證只能證明某些設(shè)計錯誤存在或者不存在,驗證是一個窮舉設(shè)計中可能存在的錯誤的過程。業(yè)界中存在著相當(dāng)度的驗證手段和驗證的策略,其中主要的驗證手段可以粗略地劃分為功能仿真技術(shù)、靜態(tài)時序分析技術(shù)、形式驗證技術(shù)等。
功能仿真與調(diào)試
功能仿真是設(shè)計驗證的主要形式。從仿真的抽象層次來看,包括基于事件(event based)的仿真,基于時鐘周期(cycle based)的仿真,基于事務(wù)交易(tansaction based)的仿真。
基于事件的仿真器把輸入激勵的變化認為是事件的觸發(fā),每一個仿真時間仿真器處理一個事件觸發(fā),根據(jù)事件觸發(fā)的內(nèi)容對整個設(shè)計重新計算直到一個仿真穩(wěn)態(tài)出現(xiàn)為止。
基于事件觸發(fā)的仿真特點是同時覆蓋了設(shè)計的功能和時序模型,仿真結(jié)果精確,它非常容易探測到設(shè)計中的毛刺電路,尤其適用于異步電路的仿真。
基于時鐘周期的仿真在一個時鐘周期那沒有時間的概念,它只在時鐘的上升沿或下降沿進行觸發(fā),每一個時鐘周期的時間對電路計算一次。
基于事務(wù)交易的仿真以數(shù)據(jù)包、圖形、語音等對象作為直接的仿真激勵而不在是添加到設(shè)計引腳的激勵波形。
功能驗證的方法主要有三種:黑盒法、白盒法和灰盒法。
架構(gòu)測試環(huán)境在軟件仿真過程稱作“writing testbenches”。Testbench通常是指這樣的代碼,它對設(shè)計進行恰當(dāng)?shù)呐渲谩a(chǎn)生測試激勵盒有選擇性地觀察地響應(yīng)。Testbench一般用硬件描述語言Verilog HDL或VHDL實現(xiàn),也可以包含C語言或者C++語言產(chǎn)生地激勵數(shù)據(jù)加上PLI,現(xiàn)在業(yè)界還有專門地驗證語言Vera和Specman E。
今后有空再跟大家介紹一下Modelsim和VCS:)
靜態(tài)時序分析
靜態(tài)時序分析簡稱STA(Static Timming Analysis),它提供了一種針對大規(guī)模門級電路進行時序驗證的有效方法。它指需要更具電路網(wǎng)表的拓撲,就可以檢查電路設(shè)計中所有路徑的時序特性,測試電路的覆蓋率理論上可以達到100%,從而保證時序驗證的完備性;同時由于不需要測試向量,所以STA驗證所需時間遠小于門級仿真時間。但是,靜態(tài)時序分析也有自己的弱點,它無法驗證電路功能的正確性,所以這一點必須由RTL級的功能仿真來保證,門級網(wǎng)表功能的正確性可以用門級仿真技術(shù),也可以用后面講到的形式驗證技術(shù)。值得注意的是,靜態(tài)時序分析只能有效地驗證同步時序的正確性,對于大部分設(shè)計重可能包含地異步電路的時序驗證,則必須通過門級仿真來保證其時序的正確性。由此我們可以得出這樣子的結(jié)論:靜態(tài)時序分析和門級時序仿真是從不同的側(cè)重點來分析電路以保證電路的時序正確,它們是相輔相成的。
Synopsys公司的Prime time時序分析的工具,對設(shè)計電路進行以下幾種分析:
1.從主要的輸入端口到電路中所有觸發(fā)器
2.從觸發(fā)器到觸發(fā)器
3.從觸發(fā)器到主要輸出端口
4.從主要的輸出端口到主要的輸出端口
靜態(tài)時序分析工具把整個設(shè)計電路打散成上述四種類型的時序路徑,分析不同路徑的時序信息,得到建立時間和保持時間的計算結(jié)果。當(dāng)然還有另外幾條路徑:如gated clock,DFF復(fù)位端的,具體可以參見PrimeTime的手冊。
STA入門比較好的文章,也是5life轉(zhuǎn)載過來的http://techcenter.dicder.com/data/2006/0114/article_102.htm
形式驗證
形式驗證是一種靜態(tài)的驗證手段,它根據(jù)電路靜態(tài)地判斷兩個設(shè)計在功能上是否等價,常用來判斷一個設(shè)計在修改前和修改后其功能是否保持一致。它運行時無需測試向量,但是必須有一個參照設(shè)計和一個待驗證的設(shè)計。參照設(shè)計時設(shè)計者認為功能上完備無缺的設(shè)計,理論上它可以用高級語言如C,C++實現(xiàn)的,也可以是用集成電路的建模镅詓ystemC,或者驗證語言vera或SpecmanE實現(xiàn)的;但是就實現(xiàn)而言,多數(shù)形式驗證過程中參照設(shè)計就是我們的RTL設(shè)計,一般用verilog或VHDL實現(xiàn)的。
當(dāng)RTL級功能仿真或FPGA驗證結(jié)束后,傳統(tǒng)的IC設(shè)計流程需要完成一下幾次門級仿真:綜合后門級仿真;DFT之后的門級仿真;布局布線之后的門級仿真等,如果設(shè)計很大或者電路很復(fù)雜,往往需要龐大的測試向量來驗證設(shè)計的功能及時序是否正確,這就使得我們花費在門級仿真的時間隨著電路規(guī)模的增直線上升。
形式驗證在ASIC設(shè)計流程中猶如一個迭代算法,其最初的輸入是RTL設(shè)計,每次比較,都將上一次比較后的設(shè)計(第n-1次)作為參照設(shè)計處理之后的結(jié)果(第n次)進行比較,之所以這么做,是基于以下考慮:
1.形式驗證工具開始比較前,首先在兩個設(shè)計中找到一一對應(yīng)的比較點。
2.如果一個設(shè)計改動太大,改變前后的功能是完全一致的,但如果形式驗證工具無法找到適合的比較點,也會認為這兩個設(shè)計不等價
形式驗證在ASIC設(shè)計流程中主要應(yīng)用在以下幾個方面:RTL-RTL的對比,RTL-GATE的對比,GATE-GATE的對比。采用形式驗證進行 RTL與RTL的比較,可以在較短的時間內(nèi)驗證并保證代碼修改的過程中沒有引入功能性的錯誤;進行RTL與GATE的對比,是驗證源代碼與綜合之后的門級網(wǎng)表是否等價,以保證綜合過程中不會出現(xiàn)任何錯誤;進行GATE與GATE的對比,主要是發(fā)生在驗證插入DFT后的電路網(wǎng)表在功能上是否一致;生成時鐘樹前后的電路網(wǎng)表在功能上是否一致;布局布線前后的電路網(wǎng)表在功能上是否一致等。
什么是DFT,為什么要做DFT。
可測試性技術(shù)(Design For Testability-DFT)就是試圖增加電路中信號的可控制性和可觀測性,以便及時經(jīng)濟地測試芯片是否存在物理缺陷,使用戶拿到良好的芯片。其中包括Ad Hoc技術(shù)和結(jié)構(gòu)化設(shè)計技術(shù)。目前,任何高集成度IC設(shè)計系統(tǒng)都采用結(jié)構(gòu)化設(shè)計技術(shù),其中主要掃描技術(shù)和內(nèi)建自測兩種技術(shù)。一個電路的測試性問題應(yīng)該包括兩個方面:
1.由外部輸入信號來控制電路中的各個節(jié)點的電平值,稱為可控制性。
2.從外部輸出端觀測內(nèi)部故障地難易程度,稱為可觀測性
掃描技術(shù)是指電路中的任一狀態(tài)移進或移出的能力,其特點使測試數(shù)據(jù)的串行化。比較常使用的是全掃描技術(shù)和邊界掃描技術(shù)。全掃描技術(shù)是將電路中的所有觸發(fā)器用特殊設(shè)計的具有掃描功能的觸發(fā)器代替,使其在測試時鏈接成一個或幾個移位寄存器,這樣,電路分成了可以進行分別測試的純組合電路和移位寄存器,電路中的所有狀態(tài)可以直接從原始輸入和輸出端得到控制和觀察。這樣子的電路將時序電路的測試生成簡化成組合電路的測試生成,由于組合電路的測試生成算法目前已經(jīng)比較完善,并且在測試自動化生成方面比時序電路的測試生成容易得多,因此大大降低了測試生成的難度。
對于存儲器模塊的測試一般由生產(chǎn)廠家提供專門的BIST電路,通過BIST電路可以方便地對存儲單元地存取功能進行測試,所謂的BIST電路是指把測試電路做到IC里面,利用測試電路固有的能力自行執(zhí)行一個測試存儲器的程序。另外MBIST還可以解決RAM SHADOW的問題提高芯片的可測試性。
為什么要做DFT呢?因為我們的設(shè)計,也就是RTL到GDSII交出去的只是一個版圖,最后芯片需要生產(chǎn)織造是在foundry做的,也就是廠家根據(jù)你提供的數(shù)據(jù)GDSII做成芯片。這個流程過程中可能出現(xiàn)缺陷,這個缺陷可能是物理存在的,也可能是設(shè)計當(dāng)中的遺留問題導(dǎo)致的,另外一方面在封裝的過程也可能出現(xiàn)缺陷。為了保證我們的芯片能夠不存在物理上的缺陷,所以就要做DFT。也就是說,你交給foundry一個加法器的GDSII,他在做的過程和封裝的時候都可能引入缺陷;拿到這個加法器芯片你怎么知道,里面的一個與門,廠家給你做的就是一個正常工作的與門呢?你怎么知道廠家做好的加法器的dier在封裝之后引腳就能正常輸入呢?一句話,就是通過DFT!如何做DFT呢,就是上面提到的拉。
評論
查看更多