緒論
經(jīng)過了前面的文檔、編碼、驗(yàn)證階段,我們手頭已經(jīng)有了沒有錯(cuò)誤的RTL代碼。這一章我們把這些RTL代碼轉(zhuǎn)化成后端的輸入:網(wǎng)表(Netlist,綜合工具自動(dòng)將RTL翻譯成與或非門,用于實(shí)現(xiàn))。這個(gè)步驟主要是有工具來完成的,我們知道流程就行。
說是實(shí)現(xiàn),其實(shí)包含了DFT (Design For Test)三板斧的插入、DC綜合以及形式驗(yàn)證。算是芯片設(shè)計(jì)里承上啟下的一個(gè)流程。我此處把它歸到前端里了,也有歸到后端的,或者單拎出來讓DFT工程師專門做的。插句額外的話,此處只是簡(jiǎn)單列了DFT的基本原理,實(shí)際上DFT也和驗(yàn)證一樣是個(gè)有自己神奇而獨(dú)特技術(shù)棧的活,有專門的工程師工種叫DFT工程師。
一 DFT-F1: 插入BIST
BIST(Build-in-self test)是內(nèi)建自測(cè)試的意思。又分為MBIST和LBIST。
MBIST (Memory build-in-self test), 指的是存儲(chǔ)內(nèi)建自測(cè)試。這個(gè)原理上講起來比較容易,就是在SRAM周邊加上一些測(cè)試邏輯。Memory通常來講在芯片中占據(jù)的面積比較大,也容易出錯(cuò),所以加上專門的測(cè)試邏輯。這個(gè)地方需要區(qū)分MBIST和ATE (Auto-Test-Equipment, 我們后面講芯片封裝測(cè)試的時(shí)候講)的區(qū)別,ATE的激勵(lì)是外部給的,MBIST激勵(lì)是自己生成的。而且MBIST可以每次芯片上電都測(cè)試一遍,防止芯片出錯(cuò)。
這個(gè)東西的工作原理如上圖,在Memory周圍加上激勵(lì),至于怎么加激勵(lì)有人專門研究這個(gè)(MBIST Algorithm),感興趣的可以學(xué)習(xí)一下。此外,還有一種Memory Built-in Self Repair (BISR)的辦法,MBIST檢測(cè)到Memory有問題后將有問題的cell映射到冗余的好的cell上去。
LBIST (Logic build-in-self test), 邏輯內(nèi)建自測(cè)試。和MBIST同理,在關(guān)鍵邏輯上加上自測(cè)試電路,看看邏輯cell有沒有工作正常。BIST總歸會(huì)在芯片里加入自測(cè)試邏輯,都是成本。個(gè)人理解如果不要求穩(wěn)定性非常好的芯片,LBIST可以不要。但是一些芯片,比如自動(dòng)駕駛可能LBIST還是需要的。
一般來講BIST用工具直接插到RTL代碼里去,其實(shí)算是正常的交付功能。
二 DFT-F2: 插入Boundary Scan
這個(gè)boundary scan主要用來對(duì)芯片的輸入輸出(也可以是關(guān)鍵邏輯塊,比如RISC-V核心)檢測(cè)和測(cè)試,其實(shí)就是我們常聽過的JTAG接口(JTAG有個(gè)很奇葩的名字,Joint Test Action Group, 聯(lián)合測(cè)試工作組 Orz)。
基本原理也簡(jiǎn)單,像上面這張圖一樣,把芯片的IO用寄存器鏈穿起來。JTAG端口雖然只有4個(gè)信號(hào),但是能實(shí)現(xiàn)的測(cè)試功能非常多,可不是簡(jiǎn)單把IO串行拿出來看看這么簡(jiǎn)單。
上面一個(gè)小方塊scan cell包含了下面內(nèi)容。
里面包含了幾個(gè)capture cell寄存器,用來把IO上的值給采下來。還有一個(gè)update hold cell, 可以把想要的值傳給IO。
用法1:左上,直接bypass, 可以方便的把不同的JTAG CHAIN給穿起來。
用法2:右上,把IO穿起來,可以看IO的值,也可以外部給所有IO輸入值
用法3:左下,可以當(dāng)做串口,給上面講的BIST輸入控制信號(hào)
用法4:右下,Clamp模式,bypass和chain同時(shí)開了, 可以給IO置為,但是值從bypass輸出。
JTAG也是直接加到RTL代碼,當(dāng)做一個(gè)功能來用。
三 DC綜合
經(jīng)過了DFT的兩把斧,我們接下來要跑綜合。綜合的主要目的是把Verilog代碼轉(zhuǎn)換成門級(jí)網(wǎng)表。
DC是design compiler的意思,Synopsys的軟件,當(dāng)然也可以用其他廠商的RTL Compiler,不過我沒用過不熟悉。DC內(nèi)部主要實(shí)現(xiàn)了3個(gè)步驟:
·Translation, 單純的把RTL轉(zhuǎn)化成DC內(nèi)部的數(shù)據(jù)庫(kù),這個(gè)庫(kù)和工藝無關(guān),就是標(biāo)準(zhǔn)的與或非等等。
·Optimization, 這個(gè)階段根據(jù)工作頻率、面積、功耗來優(yōu)化電路,然后生成滿足設(shè)計(jì)標(biāo)準(zhǔn)的門級(jí)網(wǎng)表。
·Mapping, 這個(gè)步驟與工藝相關(guān),將門級(jí)網(wǎng)表映射到代工廠給的門級(jí)網(wǎng)表上。
這個(gè)過程其實(shí)大部分都是工具來完成的,我們只用設(shè)置一些配置。
一共九個(gè)步驟。
step0 Develop HDL files. 這個(gè)步驟就是前面介紹了一大堆設(shè)計(jì)的Verilog文件
step1 Specify libraries. 這個(gè)步驟主要是指定一下需要的庫(kù)文件。幾個(gè)庫(kù)文件都是干嘛的我們簡(jiǎn)單講講。link library指的鏈接的庫(kù),比如RAM, ROM core的庫(kù),一般放在link library. target library是代工廠給得工藝庫(kù),最后會(huì)把網(wǎng)表映射到這個(gè)庫(kù)的單元上。symbol library可以不用,GUI用到的,synopsys library. synopsys的標(biāo)準(zhǔn)lib. 中間過程要用到。
step2 Read Design. 比較簡(jiǎn)單,把你的設(shè)計(jì)讀到DC里面去。
step3&4 Design Constraint. 這兩個(gè)步驟其實(shí)可以一起講。給綜合設(shè)置一些約束,比如時(shí)鐘頻率,允許的時(shí)鐘不確定性等等。
step5 Compiler Strategy. 這個(gè)步驟主要是選綜合策略。綜合策略一般有兩種,top-down, bottom up。top-down用來綜合小模塊,設(shè)計(jì)約束在頂層,當(dāng)做一個(gè)整體一把綜合了。bottom up一般用來綜合大型的設(shè)計(jì)。先約束并綜合底層,然后設(shè)置一個(gè)dont touch, 一層一層向上綜合。
step6 Synthesis. 綜合優(yōu)化,主要占用時(shí)間的就是這一步驟。一般會(huì)在機(jī)器上跑幾個(gè)小時(shí)到幾天甚至幾周時(shí)間。
step7 Report design. 這個(gè)步驟主要是報(bào)出綜合的面積,時(shí)序,看看面積有沒有超標(biāo),時(shí)序有沒有違例,如果時(shí)序或者面積有問題,返回step0修改設(shè)計(jì),重新來綜合。
基本上的綜合流程就這些。
四 形式驗(yàn)證:RTL vs SYN Netlist
做完了綜合,我們還有做個(gè)步驟,到底綜合對(duì)了沒,等不等價(jià),需要驗(yàn)證一下。這種驗(yàn)證叫形式驗(yàn)證 Formal Verification。有個(gè)工具叫formality的可以干這個(gè)活。簡(jiǎn)單理解這個(gè)步驟就是做等價(jià)性驗(yàn)證的。這個(gè)步驟比綜合會(huì)快很多。這也可以理解,一個(gè)是從無到有的生成,另一個(gè)只是對(duì)比一下功能是不是等價(jià)的。原理大概是在RTL代碼和netlist中抽取一些點(diǎn)(一般是寄存器的輸入或者輸出),驗(yàn)證組合邏輯的等價(jià)性。
如上面兩個(gè)設(shè)計(jì),使用的單元是不一樣的,但其實(shí)功能是等價(jià)的。formality只能保證功能是等價(jià)的,但是保證不了STA不出問題。所以只能說STA沒問題的情況下,formality能保證SYN功能正確。
五 DFT-F3:SCAN CHAIN
emmm 形式驗(yàn)證完后,還有一個(gè)DFT步驟。DFT的第三把斧: 加入scan chain. 這個(gè)步驟一般不加在RTL而是直接加在DFT網(wǎng)表。原理也很簡(jiǎn)單,把設(shè)計(jì)中的所有寄存器連接成一條或者幾條鏈。
向上面這樣。正常的功能數(shù)據(jù)走functional path, 在測(cè)試模式下所有FF都是移位寄存器,可以把值讀出來看看。
當(dāng)然,也可以把值插進(jìn)去,看看某段組合邏輯有沒有問題。
比如這樣,先拉高scan enable, 用若干拍把數(shù)據(jù)load到寄存器里,然后拉低scan一拍,讓組合邏輯算出結(jié)果,然后繼續(xù)拉高scan enable, 把計(jì)算結(jié)果shfit out出來。
其實(shí)這里有個(gè)搞笑的事兒,研究生第一次流片的時(shí)候看到DFT scan chain,覺得這個(gè)東西賊有用,畢竟沒有專業(yè)測(cè)試,一旦邏輯什么寫錯(cuò)了,我豈不是可以自己寫一段數(shù)據(jù),直接shift到芯片里,看看哪里有了BUG,針對(duì)性的解決。那一瞬間,感覺自己像個(gè)小天才Orz...
后來知道一般設(shè)計(jì)中寄存器何止成千上萬,即使拆成多條鏈,每條也很長(zhǎng)。指望手動(dòng)造一個(gè)scan數(shù)據(jù)來debug是不現(xiàn)實(shí)的。一般都是自動(dòng)生成若干組pattern, 自動(dòng)測(cè)試,如果輸出和預(yù)期不一致,丫直接當(dāng)做廢片處理了Orz。所以不量產(chǎn)的芯片不用加DFT,加了也沒啥實(shí)質(zhì)性的用處。
DFT三板斧就講完了。
六 形式驗(yàn)證:DFT vs SYN
最后再來一次形式驗(yàn)證。對(duì)比一下加入DFT的網(wǎng)表和綜合出來的網(wǎng)表是不是功能一致的。原理和上面一樣,無須贅述。
七 總結(jié)
經(jīng)過這篇文章,我們終于得到了芯片設(shè)計(jì)的網(wǎng)表。行文至此,我們前端設(shè)計(jì)的所有流程就都講完了。
編輯:黃飛
?
評(píng)論
查看更多