說到數(shù)字芯片,總是離不開FPGA,F(xiàn)PGA是可編程的數(shù)字電路,數(shù)字電路設(shè)計的目標,就是把這些功能,做成我們自己專用的ASIC/SOC,這樣無論面積,成本或者安全性等等都能有保證。
大部分同學應該都清楚,芯片設(shè)計一般分前端和后端,下面我們就數(shù)字集成電路設(shè)計為例,希望能拋磚引玉,歡迎同學們補充和指正。
從流程上講,數(shù)字集成電路芯片設(shè)計的大致步驟就是系統(tǒng)與功能定義,RTL實現(xiàn)及驗證,綜合及可測試性設(shè)計(synthesize,DFT),ATPG仿真,時序分析,到自動布局布線(APR).直至交付fab的GDS網(wǎng)表。
這個流程是可以反復迭代的,當對于不同類型芯片,如純數(shù)ASIC或混合電路(mix-signal及系統(tǒng)級芯片(SOC),每一步的方法和具體實施流程上可能又有所差異。下面就這些基本流程分步談一些主要問題。
系統(tǒng)設(shè)計主要設(shè)計到功能定義及架構(gòu)設(shè)計,總線架構(gòu)的配置,模塊設(shè)計,數(shù)據(jù)流的分配,時鐘的設(shè)計等問題??偩€包括模塊之間,模塊與MCU核之間,或者外部主機和芯片之間通信,或者測試需要等等一系列因素。時鐘涉及到數(shù)據(jù)流的規(guī)劃,通信接口或內(nèi)部MCU的時鐘約定,工藝條件,功耗等因素。模塊需要明確接口和定義。
在數(shù)字芯片的系統(tǒng)級設(shè)計上,特別是很多數(shù)?;旌想娐分谢?qū)挠刑貏e要求的電路中,還要有電壓域的設(shè)計,不同模塊之間,功能模塊和接口之間可能都需要根據(jù)工藝條件,功耗要求設(shè)置不同的電壓。
無論是時鐘,還是電壓,都可以通過控制開關(guān)來實現(xiàn)功耗的要求,時鐘實現(xiàn)比較簡單,在大部分電路中都可以實現(xiàn)這種時鐘控制,電壓控制一般是實現(xiàn)在集成有電源管理芯片的較大規(guī)模芯片上。但未來趨勢是即使沒有電源管理芯片,電壓的gating也需要納入考慮范圍。
在SOC系統(tǒng)設(shè)計上,一個重要的環(huán)節(jié)是MCU內(nèi)核的選型,現(xiàn)在常用的內(nèi)核一般是ARM,較老的ARM7,Arm9等系列,較新的是三大系列cortexA,R,M,具體的用途不做詳細訴述,選定好后核需要根據(jù)需要進行設(shè)置,一般做硬件的人不需要對它的指令集了解太多,但是需要了解它的總線接口,數(shù)據(jù)總線,指令總線,以及存儲系統(tǒng)的設(shè)計,一般需要安排ROM,RAM分別作為指令和數(shù)據(jù)存儲器,由于ROM是不可更改的,一般也需要加入flash作為補丁程序?qū)懭氲?。也可能需要外部存儲器或者DMA控制器來增加外部存儲空間。地址的分配是按照功能需要來進行的,現(xiàn)在有很多工具如synopsys的DesignKits可以產(chǎn)生外部總線代碼及進行地址分配。
RTL是專門描述硬件電路的工具語言,有VHDL和verilog。完成系統(tǒng)和功能定義后,接下來要實施的就是RTL實現(xiàn),RTL的特點就是硬件上的同時觸發(fā)性,不同于軟件的按順序執(zhí)行,電路有時序邏輯和組合邏輯組成,時序邏輯在物理構(gòu)成上就是一些寄存器,這些寄存器受時鐘控制,寄存器代表了電路中數(shù)據(jù)或控制信號,這些信號受時鐘的驅(qū)動流動.組合邏輯是不受時鐘控制的電路塊,組合邏輯顧名思義,通過一些信號的組合直接生成一些邏輯結(jié)果。
RTL設(shè)計中,一大問題是異步設(shè)計問題,異步數(shù)據(jù)的處理根據(jù)不同情況有很多方式,最簡單的,如果對異步的電平信號,可以直接在新的時鐘域中加2級寄存器來隔離,避免不定態(tài)的發(fā)生.當如果對于總線的處理,或者脈沖的處理,則需要同步模塊,同步??煲话闶侵感枰帐中盘?,就是前一級時鐘告訴采樣的時鐘,信號ok了,采樣的第二個時鐘再去采,采好后再告訴前一級時鐘,我搞定了,那樣前一級時鐘就可以換數(shù)據(jù)或其他處理。
有一種情況就是前一級時鐘太快,造成第二級來不及,則需要加入FIFO作為隔離,就是讓那些數(shù)據(jù)先放好,我在慢慢來取.這個FIFO的設(shè)計涉及到讀寫地址的判斷,寫滿或讀空都需要做相應處理,讀寫地址之間的判斷只能在其中一個時鐘域中進行,這本身又涉及異步信號的處理問題,這一般用格雷瑪解決,或者有些地方直接可以判斷地址高位,這些方法的目的就是不能讓地址在比較的時候不穩(wěn)定。
RTL設(shè)計中時鐘本身的設(shè)計問題也要注意,我們在一個芯片中,盡量把時鐘產(chǎn)生電路放在一塊,主要是從綜合,DFT的角度去考慮的,讓這些時鐘統(tǒng)一管理和約束。時鐘的分頻,切換也要專門處理,否則容易產(chǎn)生毛刺等事情。
RTL設(shè)計中還有很多需要注意的問題,比如可綜合性,還有要考慮到電路的面積,以及響應速度等等,這些問題是RTLcoding的基礎(chǔ)問題。
芯片驗證一般有這幾個層面,一個是RTL級或者Netlist(preorpostPRwithSDF),這個也是一般意義上的芯片驗證工作,一個是FPGA級的,也是RTL,只不過download到FPGA中,借助硬件環(huán)境,也可以直接做應用實驗。
在芯片設(shè)計中芯片驗證占據(jù)了大部分的時間和精力,無論是那種驗證,都需要搭建測試平臺(testbench),驗證平臺從軟件結(jié)構(gòu)上模擬芯片的工作環(huán)境。即有清晰的連線結(jié)構(gòu),也有完成這些測試所需要的非結(jié)構(gòu)性的函數(shù)或任務包。測試平臺中的被測試芯片是RTL級的,測試向量或者說施加的激勵可以是verilog/VHDL,HDL語言本身就具有比較完善的行為級描述功能,也可以滿足絕大部分測試平臺的搭建和測試激勵的產(chǎn)生,當然我們面對更復雜設(shè)計,或追求更高效率也可以使用其它被編譯器兼容的語言,如C/C++,SC,SV,E等等。
很顯然,測試激勵是有時間概念的,是按順序進入和流出芯片的,使用的這些非電路描述語言和功能和軟件幾乎是沒有區(qū)別的,所以驗證中也越來越多地使用軟件的一些技術(shù),如面向?qū)ο蟮木幊碳夹g(shù),SystemVerilog,SpecmanE等,SV也支持斷言語句(assertion),不同廠家提供的OVM,VMM,UVM等也包括了很多類庫可供使用。關(guān)于這些技術(shù)其實可以有更深入的探討,也期待感興趣的能深入展開。
無論傳統(tǒng)的驗證還是最新的驗證方法學,都需要追求驗證的收斂性,即驗證完全是自動化的檢測,除非debug,我們無需通過波形判斷測試通過與否。
對于很多驗證,我們幾乎不需要上到FPGA上驗證,比如數(shù)據(jù)通信類,完全可以軟件實現(xiàn)數(shù)據(jù)的產(chǎn)生和比對。而有些應用,如影視頻,圖形抓取等等,如果進入FPGA就可以實現(xiàn)效果功能的檢驗,F(xiàn)PGA的流程這里不做表述,不過要注意的是,我們用作流片的RTL代碼可能和待燒入FPGA的代碼有不同之處,比如有些使用的IP在FPGA中可能和流片廠家提供的不一樣,還有些端口等等需要特別注意。
還有postlayout的后仿,這個后仿是指DFT和APR之后的網(wǎng)表,加入帶有時序信息的SDF文件進行仿真。有些人說,我做過驗證,代碼和網(wǎng)表之間,PR前后網(wǎng)表之間的一致性驗證也做了,還需要后仿嗎?答案當然還是需要的,因為一致性也無法檢測到很多時序的問題,比如毛刺,甚至DFT的錯誤,功能性的問題等等。
現(xiàn)在比較常見數(shù)模混合芯片的驗證,模擬的部分主要是采用了verilogams建模,當然也有VHDLRN建模等等,這些東西就是引入了可控制和可檢測的模擬量,進入數(shù)字仿真系統(tǒng),也是數(shù)字驗證流程的一環(huán)。更專業(yè)的數(shù)?;旌向炞C系統(tǒng)ADMS,里面引入了數(shù)字和模擬多個引擎,如數(shù)字的nvverilog模擬的Eldo等等,數(shù)字部分導入RTL代碼,模擬部分直接導入GDS電路,當然為了加快速度,模擬部分在使用中一般仍然導入數(shù)字模型。
SOC驗證中,植入了燒入ROM的軟件,在仿真驗證系統(tǒng)中,使用的一般是存儲器的模型加上文本格式的代碼文件,一般實現(xiàn)是直接通過系統(tǒng)讀入指令把文件讀入到存儲器模型中。(有些仿真工具可以直接通過選項導入,類似SDF文件,如工具nscim),仿真器可以直接寫出指令執(zhí)行的log以用于debug,不過現(xiàn)在有更先進的方式用于復雜SOC驗證,如Codelink工具,能夠在原仿真器的基礎(chǔ)上,建立起MCU和HDL電路已經(jīng)軟件的關(guān)系,通過展示波形和固件(firmware)源碼的鏈接進行更方便的debug。
下面需要說的實現(xiàn)部分,就是綜合,DFT,STA,ATPG等,準備合在一起寫,感興趣的朋友也可以接著我的寫,我暫時不做這方面的更新,希望朋友們玩?zhèn)€接力。
數(shù)字集成電路設(shè)計,不同的產(chǎn)品,要求不同,所設(shè)計的步驟也不完全一致。比如,對于很多設(shè)計數(shù)字電路可能實現(xiàn)建立軟件模型,來評估我們的頻率,資源,或者數(shù)字信號處理中的信噪比等一些指標,這些都是在規(guī)格定義之后,電路設(shè)計之前需要做的一些工作。
在芯片完成了設(shè)計與驗證之后,我們要做的工作就是把它裝化成GDS網(wǎng)表,就是所謂的implementation(電路實現(xiàn)),這其中的流程包括綜合,DFT,formality,STA,ATPGpatterngeneration和仿真(和功能驗證一樣也包括前后仿),再進入后端的PR/LVS/DRC的流程,這個屬于物理設(shè)計,當然這個流程是籠統(tǒng)的,這里主要講幾個后端物理設(shè)計之前的前端實現(xiàn)的幾個步驟。
綜合的原理比較直觀,從RTL到GTECH庫到廠家工藝庫的編譯翻譯映射與替代,綜合需要輸入的就是時鐘約束即sdc文件,sdc是設(shè)計與產(chǎn)品的使用要求決定的。
Scanchain是DFT幾種類型中最常見的一種,這個可以在綜合步驟中一起做,也可以在綜合之后進行,掃描鏈的多少和芯片本身的規(guī)模和芯片可提供的可測試芯片管腳有關(guān),盡量掃描鏈的長度越短越好,以縮短測試時間;由于有些片子的管腳有限,需要壓縮掃描鏈;甚至有些芯片由于可復用的管腳太少,進入測試模式都需要在功能模式下由主機的設(shè)定,設(shè)定后再退出功能模式。
掃描鏈的插入后可以由工具產(chǎn)生ATPG的pattern,DFT成功與否要看測試覆蓋率,一般在95%以上說明就差不多ok了,如果覆蓋率偏低,需要追究原因,一般看有沒有漏掉的DFF,以及為什么會溜掉,一般主要原因不是這個,是一些不可控的節(jié)點造成了覆蓋率低,需要在電路中做一些處理來使之能有相關(guān)ATPG產(chǎn)生,如加入測試模式生效的可選的DFF或者電平/地。
有些電路包括了ROM/RAM,需要給ROM/RAM本身加入內(nèi)建自測電路(BIST),一般如果帶有MCU的SOC,其實也可以通過軟件來完成RAM測試,不一定加入BIST,但是植入CPU軟件的ROM肯定必須有BIST電路來完成自測,自測電路的原理很簡單,就是判斷寫入和讀出的數(shù)據(jù)是否吻合,否則會BIST電路會給出錯誤的標識。
Boundaryscanchain是另一種DFT,很容易理解的是,我們可以控制芯片各個pad的輸入輸出值,這樣它的作用可以應用于板級調(diào)試。
formaliry或者說equencecheck,主要檢查綜合,DFT以及后端PR之后和各自步驟之前的RTL/網(wǎng)表的等效性。
STA是靜態(tài)時序分析,主要用在芯片完成后端流程后,也檢查是否滿足時序要求,特別是插入了時鐘樹之后,這是需要后端工具(ICC/Encounter等)反標出的sdf文件來進行分析。細節(jié)不表。STA完成后才可以進行功能后仿和ATPGpattern的后仿。