半年前,公眾號寫了第一篇推文《入行數位IC驗證的一些建議》,介紹了IC小白可以如何一步一步地摸索入門數位IC驗證,同時也在知乎發了這篇入門貼,並且衍生出很多額外基礎的內容,收穫了不少的瀏覽量以及肯定。點選合集(數位IC合集(超級全面,持續更新))
在真實地工作一年後,對晶片驗證的理解也有了更深的認識,故在此回憶總結這一年所看到的數位IC驗證世界。
--------------------------------
我們知道晶片製造出來到使用者手中之後是沒辦法再次更改的,流片失敗的代價非常的昂貴,大公司還好有試錯成本,小公司可能直接拜拜了。因此需要確保晶片在流片前,把設計所定義的功能都檢驗正確無誤。
所以晶片驗證的開始是從spec的定義開始的,有了它之後就可以客製化相應的驗證計劃,隨後才是根據DUT搭建testbench,編寫定向和隨機的測試用例進行模擬,跑regression後收集覆蓋率,根據覆蓋率的情況再決定是否增補testcase。直到coverage達到驗收標準,功能驗證才算結束了。
--------------------------------
晶片驗證也會有很多分類,根據晶片型別的不同可以分為:CPU驗證、GPU驗證、TPU驗證、NPU驗證、SoC驗證等等;
據工具的不同可以分為EDA驗證、FPGA原型驗證、Emulator驗證:
EDA驗證即功能驗證,根據開發的不同階段分為前仿驗證和後仿驗證。主要工具有VCS、Verdi、NC-Verilog、ModelSim等等。EDA驗證是通過軟體模擬來驗證電路設計的功能行為,是比較理想情況下的,沒有考慮電路內部邏輯與互連的延時。優點是波形直觀,能夠快速找出功能bug,價效比高,缺點是模擬速度慢,難以對整個晶片系統進行驗證。
FPGA原型驗證即編譯設計程式碼,並且綜合為真實的硬體電路對應FPGA板子上去,通過真實的硬體電路進行模擬(FPGA原型)。FPGA原型驗證,將RTL程式碼移植到FPGA來驗證IC系統的功能和效能。基本流程:將ASIC程式碼轉換成FPGA程式碼,編譯與對設計拆分,綜合,佈局佈線,生成位元流檔案bitfile。優點是降低了軟硬體協同驗證的成本,加速了硬體驗證和軟體開發;缺點是編譯較慢,設計拆分時易出錯,比較難定位bug。
通常認為Emulator驗證為介於simulator和FPGA prototyping間的產物,同時擁有二者的優點,如方便debug波形、可使用force/release命令、檢查覆蓋率、列印display資訊、同時執行速度快很多,最大的缺點就是太貴了,需要時間和人力去搭建環境和維護。Cadence的Palladium、Mentor Graphics的Veloce,以及Synopsys的ZeBu等平臺。
根據層次不同可以分為模組驗證、子系統驗證、系統驗證:
模組驗證:側重點在模組本身功能的驗證,驗證計劃的重點是feature和驗證架構,然後列出testcase,模組能夠覆蓋的絕不到下一級驗證去覆蓋。主要內容有:檢查引數設定、暫存器讀寫、協定檢查、中斷和復位、狀態機跳轉、工作模式覆蓋、RAM的讀寫功能邊界等等。
子系統驗證:側重點在系統的互聯性,更加關注系統的工作模式和複雜場景應用。主要內容有:中斷的產生、DMA功能、IP的模式功能、Memory讀寫等等。
系統驗證:側重點在軟硬體協同模擬,關鍵系統路徑的覆蓋,晶片工作模式和測試模式以及資料通路和效能等。主要內容有:基本IP功能、CLK/RESET、IO MUX 、多個IP同時工作、程式的啟動、工作模式和應用場景測試。
根據可見度可分為黑盒驗證、灰盒驗證和白盒驗證等等。
黑盒驗證:驗證的輸入只有輸入訊號,輸出訊號和相應的功能。不需要關心內部訊號和架構,驗證程式碼對DUT內部的更改不太敏感。常用於大規模的系統級驗證。
白盒驗證:驗證的輸入有輸入訊號,輸出訊號,內部訊號,所有的訊號時序和相應的功能。需要了解實際的實現方式,能夠閱讀RTL設計程式碼。常用於模組級別驗證。
灰盒驗證:黑盒驗證和白盒驗證的結合體,這使得驗證環境的開發更加靈活。常用於子系統級別驗證。
--------------------------------
1.晶片規格
根據市場產品需求,規定晶片需要達到的功能和效能
產品和架構師根據客戶提出的規格spec,商定出具體設計解決方案和實現的架構,
劃分出各個模組的檔案。
2.測試點分解
根據spec檔案,分解出具體的測試點
可以分為場景類、功能類、效能類等等
分解的顆粒度儘量細緻,直到完備無漏
一個測試點被一個case覆蓋的原則分解
3.驗證方案
整個晶片的驗證方案一般由驗證負責人規劃,將設計分成多個子系統,再將子系統分成多個模組:
具體驗證策略
EDA工具和IT資源
專案進度安排
未覆蓋的功能,風險評估
4.驗證計劃
客製化驗證策略,評估驗證計劃,細化testbench搭建、debug、case開發等時間,大概分為:
spec閱讀和測試點分解時間
開發環境和偵錯冒煙測試時間
開發case,完成全部case時間
迴歸測試和驗證報告的時間
5.搭建驗證平臺
一般由激勵生成器、驅動器、取樣器、參考模型和計分板組成
從簡單的功能開始,測試可以通過驗證環境之後,再擴充套件其他功能
經常遇到編譯報錯、語法錯誤、預期錯誤,需要逐一解決
分析報錯是由驗證環境引起的,還是設計程式碼錯誤造成的
6.測試用例開發
冒煙測試:基本的暫存器讀寫測試,確保資料流已通
直接用例:根據spec中program流程設定的典型測試
隨機用例:用於變數隨機,覆蓋更多邊界,注重約束條件的設定
增補用例:以提高覆蓋測試點為目標,增補相應的測試用例
7.迴歸測試
基本功能迴歸:基本功能與基本場景覆蓋
高階功能迴歸:高階功能和邊界測試覆蓋
覆蓋率收集迴歸:高階功能測試完成之後,開始收集覆蓋率
8.覆蓋率分析
行覆蓋率
條件覆蓋率
跳轉覆蓋率
分支覆蓋率
斷言覆蓋率
狀態機覆蓋率
功能覆蓋率
9.驗證報告
應用場景驗證
模組複用說明
覆蓋率分析
風險評估
待改進方案
10.後仿
慢慢跑著就行了,基本signoff了。
以上就是晶片驗證工程師一年內可能接觸的內容。
如果覺得有用,期待您的轉發分享和在看!也可以加個關注,第一時間看見我的推播!