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