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