原文標(biāo)題:你真的了解數(shù)字驗(yàn)證嗎?
一、什么是芯片驗(yàn)證及其方法學(xué)?
芯片驗(yàn)證就是采用相應(yīng)的驗(yàn)證語言,驗(yàn)證工具,驗(yàn)證方法,在芯片生產(chǎn)之前驗(yàn)證芯片設(shè)計(jì)是否符合芯片定義的需求規(guī)格,是否已經(jīng)完全釋放了風(fēng)險(xiǎn),發(fā)現(xiàn)并更正了所有的缺陷,站在全流程的角度,它是一種防范于未然的措施。我們知道芯片流片回來測試時(shí)發(fā)現(xiàn)硬件bug,那時(shí)基本就無力回天了(芯片內(nèi)的硬件bug一般都沒辦法修正,當(dāng)然部分bug是可以通過軟件或燒efuse等措施來屏蔽),因此把問題攔截在流片之前非常之重要,這正是驗(yàn)證存在的意義。
什么是驗(yàn)證方法學(xué)?驗(yàn)證工程師繞不開的一個(gè)基本概念。芯片規(guī)模越大功能越復(fù)雜,潛在的問題也就越多,驗(yàn)證的難度也就越大,驗(yàn)證方法學(xué),就是研究怎樣降低驗(yàn)證工程復(fù)雜度的同時(shí),還能保證驗(yàn)證的可靠性,提升驗(yàn)證效率的一門學(xué)問。從它被提出到今天,其核心依然是帶約束的隨機(jī)激勵(lì)、覆蓋率驅(qū)動(dòng)以及重用,并利用面向?qū)ο裾Z言的特性對(duì)常用功能進(jìn)行高度封裝,再提供統(tǒng)一的事物層接口使不同抽象層級(jí)的建模數(shù)據(jù)得以共享和有效通信,從而極大地提升驗(yàn)證平臺(tái)的構(gòu)建效率,并加速EDA仿真,最終對(duì)縮短芯片面市周期做出貢獻(xiàn)。
二、芯片驗(yàn)證的主要工作
芯片驗(yàn)證的主要工作是根據(jù)規(guī)格文檔和詳細(xì)設(shè)計(jì)文檔提取驗(yàn)證功能點(diǎn),編寫測試激勵(lì),并搭建驗(yàn)證環(huán)境,或利用已有的驗(yàn)證環(huán)境對(duì)DUT進(jìn)行驗(yàn)證和回歸。驗(yàn)證具體崗位還可以進(jìn)行細(xì)分,例如功能仿真驗(yàn)證,FPGA原型驗(yàn)證,硬件模擬加速平臺(tái)驗(yàn)證(Palladium,ZeBu,Veloce),后端時(shí)序驗(yàn)證等,常見工作如下:
①熟悉芯片規(guī)格
主要是學(xué)習(xí)各種相關(guān)的文檔材料,包括但不限于協(xié)議、需求、規(guī)格、功能說明、歷史芯片文檔、重用環(huán)境評(píng)估與恢復(fù)。
②提取驗(yàn)證功能點(diǎn)
測試點(diǎn)一般分解過程如下,首先根據(jù)各種文檔梳理出驗(yàn)證特性,然后根據(jù)驗(yàn)證特性細(xì)化出測試點(diǎn)。
測試點(diǎn)分為場景類、功能類、性能類、白盒測試點(diǎn)(設(shè)計(jì)人員提供)、接口類、異常類等維度,全面、明確、細(xì)致,無歧義的將所有驗(yàn)證特性細(xì)化為一個(gè)個(gè)不可分割的小點(diǎn),每個(gè)點(diǎn)明確采用directtest還是coverage覆蓋還是assertion覆蓋。功能覆蓋需要細(xì)化覆蓋范圍,比如典型值、邊界值、異常值、cross。當(dāng)然測試點(diǎn)也不是一次分解完成,在整個(gè)驗(yàn)證過程中會(huì)進(jìn)行多次分解和review,直至完善。
測試點(diǎn)分解絕對(duì)算是芯片驗(yàn)證工作中的最重要的一環(huán),是充分體現(xiàn)驗(yàn)證人員經(jīng)驗(yàn)、能力、智慧、價(jià)值的一項(xiàng)工作。芯片中的bug往往都是沒有想到的點(diǎn)或者沒有覆蓋到的點(diǎn)。所以測試點(diǎn)分解一定要追求完備、細(xì)致、無歧義,要做到測試點(diǎn)分解完成后,無論哪個(gè)驗(yàn)證人員測試,驗(yàn)證質(zhì)量都是有保證的。過于粗糙的測試點(diǎn)會(huì)導(dǎo)致不同的驗(yàn)證人員在測試用例設(shè)計(jì)時(shí)有不同的理解和實(shí)現(xiàn),或許就會(huì)遺漏掉一些corner點(diǎn)。同時(shí)粗糙的測試點(diǎn)也會(huì)造成工作量評(píng)估不準(zhǔn)確,導(dǎo)致后期突發(fā)任務(wù)增多,造成項(xiàng)目延期。
③撰寫模塊級(jí)和系統(tǒng)級(jí)驗(yàn)證方案
對(duì)于驗(yàn)證方案,每個(gè)公司可能有不同的標(biāo)準(zhǔn),目的是設(shè)計(jì)驗(yàn)證架構(gòu)指導(dǎo)后續(xù)驗(yàn)證工作,保證所有測試點(diǎn)都能在該驗(yàn)證過程中覆蓋到。標(biāo)準(zhǔn)化、參數(shù)化的方案設(shè)計(jì)是非常重要,要考慮到該模塊的后期集成和重用,驗(yàn)證方案中一般還包括進(jìn)度安排、風(fēng)險(xiǎn)評(píng)估等。
注意:設(shè)計(jì)參考模型或checker時(shí)一定不要過多參考設(shè)計(jì)方案或代碼,理論上設(shè)計(jì)和驗(yàn)證從spec開始就要分開,是平行獨(dú)立的兩條線,過多的參考設(shè)計(jì)是非常不可取的,造成的后果就是參考模型/checker和設(shè)計(jì)代碼實(shí)現(xiàn)一樣,case總是一跑就過,完全測試不出設(shè)計(jì)bug。
④開發(fā)驗(yàn)證環(huán)境、參考模型和驗(yàn)證腳本
這是驗(yàn)證人員的基本功,一個(gè)足夠完備靈活自動(dòng)化的驗(yàn)證環(huán)境能節(jié)省后面測試用例實(shí)現(xiàn)的很多工作量,測試用例會(huì)變得很簡單,不同的測試用例只需要開關(guān)某些配置和修改一些約束;反之一個(gè)糟糕的驗(yàn)證環(huán)境會(huì)讓測試用例變得冗長、復(fù)雜、低效。軟仿測試平臺(tái)現(xiàn)在流行基于UVM搭建環(huán)境,一般使用高級(jí)硬件語言如SystemVerilog開發(fā)。
⑤驗(yàn)證執(zhí)行
驗(yàn)證執(zhí)行階段,按照測試點(diǎn)一個(gè)一個(gè)進(jìn)行覆蓋,寫測試用例(直接測試、隨機(jī)測試)、debug,后期進(jìn)行代碼覆蓋率和功能覆蓋率的收集分析、用例增加以及最后用例檢視。這個(gè)階段把驗(yàn)證發(fā)現(xiàn)的debug做好登記。
⑥撰寫驗(yàn)證報(bào)告
驗(yàn)證執(zhí)行做完后,需要輸出驗(yàn)證報(bào)告(一般都會(huì)有評(píng)審環(huán)境),報(bào)告主要包括各功能點(diǎn)覆蓋情況、代碼覆蓋情況、性能分析、功耗分析、風(fēng)險(xiǎn)評(píng)估等類容。
⑦配合其他工程師的工作
主要是查找修復(fù)設(shè)計(jì)缺陷,帶領(lǐng)其他工程師完成項(xiàng)目驗(yàn)證工作;協(xié)同設(shè)計(jì)和固件工程師在硬件加速器/FPGA平臺(tái)進(jìn)行驗(yàn)證調(diào)試;與硬件工程師共同確立硬件實(shí)現(xiàn)方案,提供硬件設(shè)計(jì)建議;協(xié)助測試工程師完成芯片測試等工作也是驗(yàn)證人員需要干的活。
三、數(shù)字芯片驗(yàn)證流程
一般意義上,數(shù)字芯片驗(yàn)證就是對(duì)RTL代碼進(jìn)行EDA仿真,并從中發(fā)現(xiàn)RTL代碼BUG后,再提交設(shè)計(jì)工程師進(jìn)行BUG修復(fù)的過程。實(shí)際項(xiàng)目操作中,驗(yàn)證工作的參與不僅僅是在RTL代碼的仿真階段,它應(yīng)該貫穿整個(gè)項(xiàng)目的始終。如果說開發(fā)一顆芯片是一場戰(zhàn)斗,那么設(shè)計(jì)與驗(yàn)證是同時(shí)投入,積糧草、挖戰(zhàn)壕、沖鋒陷陣都在一起,但拼殺結(jié)束后,設(shè)計(jì)可以陸續(xù)撤離,而驗(yàn)證則要負(fù)責(zé)打掃戰(zhàn)場,確認(rèn)所有敵人都不再喘氣兒,保證萬無一失。下面用這張圖示意驗(yàn)證各重要環(huán)節(jié)在整體開發(fā)流程中的位置與配合關(guān)系。
架構(gòu)師從原始需求提煉出來功能規(guī)格(FS)與架構(gòu)規(guī)格(AS),兩套流程使用不同的思路和方式對(duì)其進(jìn)行實(shí)現(xiàn),實(shí)現(xiàn)過程中互為對(duì)照同步收斂,產(chǎn)生分歧時(shí)以架構(gòu)為根本決策依據(jù),最后殊途同歸。
驗(yàn)證流中,首要環(huán)節(jié)為測試點(diǎn)(亦稱驗(yàn)證特性 Verification Feature,我習(xí)慣稱測試點(diǎn))提取,驗(yàn)證的后續(xù)所有動(dòng)作基本都是圍繞測試點(diǎn)來展開的。測試點(diǎn)實(shí)際就是把一個(gè)有機(jī)整體的功能分解成一系列單個(gè)的功能點(diǎn),起到化整為零,化繁為簡的作用,從而方便構(gòu)建測試用例對(duì)其進(jìn)行驗(yàn)證。分解的粒度沒有一定之規(guī),但有幾個(gè)大原則要把握:完備性,即不能遺漏任何功能點(diǎn),特別是異常處理,邊界處理,容錯(cuò)處理這些往往容易被忽視;低耦合,不同測試點(diǎn)之間的相關(guān)性越低越好,這也直接決定了分解粒度,并影響testcase的開發(fā)難度;無歧義,測試點(diǎn)的描述要直接而明確,不同測試點(diǎn)之間不存在矛盾之處。
測試點(diǎn)的主要來源為FS和AS,這也就要求驗(yàn)證工程師在項(xiàng)目架構(gòu)設(shè)計(jì)階段并不能置身事外,而是和設(shè)計(jì)工程師一樣,要參與到架構(gòu)文檔的Review活動(dòng)中來,在不改變產(chǎn)品功能的前提下,甚至可以向架構(gòu)師提出可驗(yàn)證性方面的設(shè)計(jì)建議或需求,參與度越高,理解越深刻,越能保證測試點(diǎn)的提取質(zhì)量。測試點(diǎn)也有少部分來源于設(shè)計(jì)工程師的微架構(gòu)或設(shè)計(jì)規(guī)格(DS),主要針對(duì)一部份corner case,來源于DS的測試點(diǎn)不能有悖于FS/AS的要求。
測試點(diǎn)是驗(yàn)證活動(dòng)的核心,直接決定驗(yàn)證結(jié)果的可靠性與完備性,非常重要,但因?yàn)樗且粋€(gè)相對(duì)主觀東西,很大程度上依賴于工程師的經(jīng)驗(yàn)、理解能力、以及責(zé)任心,可以說衡量一名驗(yàn)證工程師的技術(shù)水準(zhǔn),不在于他的Testbench寫得多漂亮,UVM玩得多熟,而在于他的測試點(diǎn)分解質(zhì)量。為了保證驗(yàn)證源頭的正確性,驗(yàn)證工程師應(yīng)該對(duì)FS/AS反復(fù)研讀,項(xiàng)目組內(nèi)進(jìn)行交叉串講,并通過答辯后再行測試點(diǎn)分解,分解結(jié)果依然需要通過架構(gòu)師、設(shè)計(jì)工程師、以及組內(nèi)其他驗(yàn)證工程師(特別是相鄰模塊)的Review后,方可進(jìn)入后續(xù)流程環(huán)節(jié)。這個(gè)過程看似繁瑣,但磨刀不誤砍柴功,切不可圖省事而草草了之。
測試點(diǎn)明確以后,便可以針對(duì)性的設(shè)計(jì)測試激勵(lì)與相應(yīng)的功能覆蓋點(diǎn),并明確覆蓋手段。功能覆蓋率讓自然語言描述的測試點(diǎn)變得更加具象和量化,由主觀變成客觀,是驗(yàn)證出口標(biāo)準(zhǔn)中最重要的依據(jù)之一。功能覆蓋點(diǎn)的選取尤其要注意邊界值與異常值,并設(shè)置合理的cross,確保完備。同樣,相互之間反復(fù)Review是必不可少的操作。
驗(yàn)證平臺(tái)的設(shè)計(jì)現(xiàn)在已經(jīng)非常標(biāo)準(zhǔn)化,UVM一統(tǒng)天下后,基本框架都差不多,主要取決于對(duì)UVM的理解與System Verilog的編程能力,在這里沒有太多可說的,當(dāng)然它也有很多細(xì)節(jié),可另外開文單獨(dú)進(jìn)行講解。我覺得需要稍加注意的幾個(gè)點(diǎn),一是transaction中,對(duì)隨機(jī)約束的設(shè)計(jì)要符合測試點(diǎn)的要求,每一個(gè)constraint的粒度把握好,方便在testcase中進(jìn)行擴(kuò)展與差異化控制;二是功能覆蓋率編碼不要遺漏,也不要加入毫無意義的cover bins,嚴(yán)格符合測試點(diǎn)階段的結(jié)論;三是適當(dāng)考慮組件的可重用性,提升整體效率。重用的問題,后面會(huì)講到,這里不展開。
和設(shè)計(jì)工程師對(duì)自己的代碼進(jìn)行單元測試一樣,驗(yàn)證環(huán)境搭建完成后,也應(yīng)該進(jìn)行自測試,以排除低級(jí)簡單的錯(cuò)誤。比如可以采用driver的輸出接monitor輸入的方式,檢查測試激勵(lì)是否可以生成,整個(gè)平臺(tái)的數(shù)據(jù)通路是否暢通,自檢測機(jī)制是否正常等,這是一個(gè)簡單而必要的步驟,能使RTL與VE的第一次集成,即Sanity Test變得事半功倍。Sanity Test(冒煙測試),顧名思義,就是一跑就冒煙掛了。這是設(shè)計(jì)代碼和驗(yàn)證環(huán)境都剛剛完成后的測試,目的就是確保寄存器讀寫OK和打通基本數(shù)據(jù)流。這個(gè)過程設(shè)計(jì)人員和驗(yàn)證人員高度配合,發(fā)現(xiàn)bug會(huì)立即修改。這個(gè)過程會(huì)發(fā)現(xiàn)很多代碼問題,這個(gè)階段發(fā)現(xiàn)的bug一般不提問題單。
冒煙測試完成后,DUT已經(jīng)基本可以正常工作,這時(shí)候就正式開始進(jìn)入驗(yàn)證執(zhí)行階段。驗(yàn)證是一個(gè)不斷迭代的過程,需要不斷編寫或修改測試用例來覆蓋功能點(diǎn)和rtl代碼。仿真中發(fā)現(xiàn)問題,更正問題,記錄問題,回歸測試,往復(fù)循環(huán)的同時(shí),分析功能覆蓋率與代碼覆蓋的空洞,根據(jù)分析結(jié)果增加用例運(yùn)行次數(shù),或者調(diào)整隨機(jī)約束,或者增加direct testcase,使覆蓋率趨于收斂。Regression 在Sanity test后將一直持續(xù)到Tape Out。
流程走到Sanity Test,正式開啟EDA動(dòng)態(tài)仿真之旅。Sanity Test是一條最基本的測試用例,使用最正常的測試激勵(lì),最小的隨機(jī)范圍或不進(jìn)行隨機(jī),以快速確認(rèn)基本的數(shù)據(jù)流能通以及寄存器讀寫正常(如果有的話), 是后面復(fù)雜測試進(jìn)行下去的前提。以后不論是RTL還是VE的每一次代碼增改,在提交版本服務(wù)器之前,通過sanity test是最基本的要求。
流程再往后延伸,就是一個(gè)不斷迭代的過程。根據(jù)最前面的測試點(diǎn)分解,驗(yàn)證工程師不斷添加測試用例,對(duì)RTL代碼進(jìn)行仿真,發(fā)現(xiàn)問題,更正問題,記錄問題,回歸測試,往復(fù)循環(huán)的同時(shí),分析功能覆蓋率與代碼覆蓋的空洞,根據(jù)分析結(jié)果增加用例運(yùn)行次數(shù),或者調(diào)整隨機(jī)約束,或者增加direct testcase,使覆蓋率趨于收斂。在實(shí)際的項(xiàng)目管理過程中,往往會(huì)把這個(gè)階段根據(jù)功能實(shí)現(xiàn)比率再進(jìn)行細(xì)分,比如按85%網(wǎng)表、95%網(wǎng)表、100%網(wǎng)表分為三段,達(dá)到每一段的出口標(biāo)準(zhǔn)后,將對(duì)設(shè)計(jì)和驗(yàn)證代碼進(jìn)行固化鎖定,作為后續(xù)的基線版本,這樣既有利于項(xiàng)目進(jìn)度的精細(xì)化控制,也方便問題的管理與回溯。100%網(wǎng)表以后,設(shè)計(jì)將全面進(jìn)入后端設(shè)計(jì)流程,RTL代碼的變更將變得很少且嚴(yán)格,但這并不意味著驗(yàn)證工作可以停步,Regression 在Sanity test后將一直持續(xù)到Tape Out。在我以往的工作經(jīng)驗(yàn)中,一直都堅(jiān)持Daily Regression的形式,即每天下班前,都會(huì)將所有測試用例提交服務(wù)器進(jìn)行回歸測試,在**CRV(constraint random verification)**機(jī)制下,用例跑得越多,最終的驗(yàn)證結(jié)果越可靠,但如果全部采用Direct testcase進(jìn)行驗(yàn)證,daily regression將變得毫無意義。
EDA仿真到最后,完成標(biāo)準(zhǔn)主要有三個(gè),一是所有testcase全部通過,二是代碼覆蓋率達(dá)標(biāo),最后是功能覆蓋率達(dá)到100%。代碼覆蓋率通常情況下不要求100%,但所有空洞需要經(jīng)過分析確認(rèn)并記錄在驗(yàn)證報(bào)告中,其它兩個(gè)標(biāo)準(zhǔn)是硬性指標(biāo)絲毫不能打折扣。即使以上標(biāo)準(zhǔn)全部達(dá)到,通常還需要穩(wěn)定回歸兩個(gè)星期以上,如果回歸期間出現(xiàn)了新的問題,一切歸零,問題修復(fù)后重新開始計(jì)算回歸周期。實(shí)際上,成熟規(guī)范的公司對(duì)出驗(yàn)證出口標(biāo)準(zhǔn)的要求比這個(gè)嚴(yán)格得多,會(huì)有一長串checklist需要逐一確認(rèn),每一條check項(xiàng)后面,是一系列的質(zhì)量保證活動(dòng),比如文檔檢視、代碼檢視、文檔代碼一致性確認(rèn)、Bug收斂趨勢分析、Bug Review、Corner Case確認(rèn)、End_of_Check確認(rèn)、編譯仿真Warning分析、異步路徑分析、網(wǎng)表仿真結(jié)果、后仿真結(jié)果、寄存器遍歷、接口信號(hào)翻轉(zhuǎn)遍歷…………,這樣的checklist通常都是用慘痛的代價(jià)換來的,每一條都要認(rèn)真對(duì)待。做芯片就是這樣,永遠(yuǎn)要保持“戰(zhàn)戰(zhàn)兢兢,如履薄冰”的心態(tài),驗(yàn)證尤為如此,畢竟如果流片回來存在BUG,板子往往是先打驗(yàn)證。
四、數(shù)字驗(yàn)證的定位
我始終認(rèn)為驗(yàn)證工作是一項(xiàng)科學(xué)嚴(yán)謹(jǐn)重要的研發(fā)活動(dòng),驗(yàn)證人員也是核心研發(fā)人員,絕不是設(shè)計(jì)人員的附屬品,更不是產(chǎn)線操作工。驗(yàn)證工作是芯片前端開發(fā)的最后一道保障,是保證芯片一版成功的重要基石,小的芯片或許重點(diǎn)依靠設(shè)計(jì)人員能夠一版成功,大的SOC成功必然是設(shè)計(jì)驗(yàn)證緊密配合共同努力的結(jié)果。
那些把驗(yàn)證人員當(dāng)designer附屬品或產(chǎn)線操作工的公司,得到的也基本會(huì)是附屬品或操作工的芯片質(zhì)量;反之,把驗(yàn)證工作看做跟設(shè)計(jì)工作同等重要地位的公司,芯片質(zhì)量往往會(huì)好很多。
五、需要掌握的技能
①linux基礎(chǔ),腳本語言(bash、tcl、perl、python等,要掌握一門或多門腳本語言);
②數(shù)字電路和IC設(shè)計(jì)基礎(chǔ)知識(shí);
③C/C++、Verilog、System Verilog編程語言;
④驗(yàn)證方法學(xué)(UVM)。
以下書籍可以作為入門教材:
《數(shù)字電子技術(shù)基礎(chǔ)(第五版)》閻石 主編《Verilog數(shù)字系統(tǒng)設(shè)計(jì)教程》《SystemVerilog測試驗(yàn)證平臺(tái)(中文版)》《UVM實(shí)戰(zhàn)》《芯片驗(yàn)證漫游指南―從系統(tǒng)理論到UVM的驗(yàn)證全視界》
參考文獻(xiàn):https://zhuanlan.zhihu.com/p/165336811