摩爾定律指出,集成芯片可容納的晶體管數(shù)目約每18個月增加一倍,性能也將提升一倍。對于FPGA和數(shù)字IC設(shè)計開發(fā)的工程師們而言,感同身受的是,在龐大復(fù)雜的系統(tǒng)研發(fā)過程中,設(shè)計和驗證幾乎同等重要,甚至驗證工作將花費(fèi)整個周期的70%~80%。
如何進(jìn)行有效的功能驗證,是我們必須面對的課題。隨著芯片設(shè)計驗證技術(shù)的發(fā)展,SystemVerilog語言在業(yè)界獲得了廣泛應(yīng)用。本文將介紹常用的驗證技術(shù)和方法。
無論是從事FPGA開發(fā),還是數(shù)字IC設(shè)計,驗證是一個無法逃避的問題,是整個項目周期中極為重要的一環(huán)。
驗證是一個覆蓋面比較廣的課題,主要包括功能驗證、物理驗證、時序驗證等。我們常常涉及功能驗證,以確保設(shè)計能夠按照設(shè)計規(guī)范實(shí)現(xiàn)應(yīng)有功能。為了完成功能驗證,我們需要搭建驗證平臺testbench,這也是業(yè)界最常用的驗證手段。
芯片設(shè)計流程
我們以專用芯片(ASIC)設(shè)計舉例,從設(shè)計規(guī)范到投片的設(shè)計流程,如圖:
與ASIC設(shè)計不同的是,在FPGA的設(shè)計流程中,沒有物理實(shí)現(xiàn)和版圖設(shè)計這一塊,因為FPGA已經(jīng)是經(jīng)過測封后的成品,只需要按照設(shè)計架構(gòu)進(jìn)行開發(fā)和驗證。因此,數(shù)字IC工程師與FPGA工程師常??上嗷マD(zhuǎn)換。
RTL設(shè)計是將設(shè)計規(guī)范進(jìn)行邏輯代碼實(shí)現(xiàn)的過程,我們常常使用verilog HDL或VHDL語言進(jìn)行設(shè)計。通過采用相對合理的設(shè)計方案,在資源消耗、處理速率和時延上進(jìn)行平衡。
功能驗證作為一個獨(dú)立模塊,但驗證過程卻相當(dāng)復(fù)雜:定義測試用例,搭建測試環(huán)境,運(yùn)行測試用例,以及保證功能覆蓋率。
怎樣進(jìn)行有效功能驗證,確保設(shè)計可靠性,是我們最關(guān)心的課題。
驗證平臺
以FPGA開發(fā)為例,當(dāng)我們完成功能模塊設(shè)計后,別急著進(jìn)行綜合與實(shí)現(xiàn),以及上板調(diào)試,進(jìn)行行為仿真或功能仿真驗證是必要的。
在功能驗證中,我們在被測設(shè)計(Design Under Test,DUT)外搭建驗證平臺,就像這樣:
驗證平臺可以用來做什么,又應(yīng)該怎么做?
如上圖所示,對于DUT,我們需要通過testbench產(chǎn)生測試激勵,然后把測試激勵應(yīng)用到DUT中,而DUT產(chǎn)生的輸出結(jié)果,我們需要進(jìn)行檢查,看驗證測試是否通過,也就是,我們要確保輸出結(jié)果和期望一致。
產(chǎn)生用戶激勵常用方法:一種是提供確定輸入,進(jìn)行直接測試(direct test);另外就是產(chǎn)生隨機(jī)數(shù)據(jù),進(jìn)行隨機(jī)測試(random test)。
通常,我們需要產(chǎn)生必要的使能信號、測試數(shù)據(jù)、地址等,通過DUT接口送入。
在高級驗證平臺種,激勵被工程師建模并封裝,進(jìn)行事務(wù)級驗證(transaction based verification)。
驗證的目的,在于檢查DUT的輸出是否和期望一致。常用發(fā)方法和途徑有以下三種。
(1)通過視圖(波形窗口)檢查。我們通過仿真器查看信號波形,這也是常用的方法,不過也存在缺點(diǎn),對于復(fù)雜的設(shè)計,信號接口眾多,數(shù)據(jù)量大,人眼視覺容易出現(xiàn)錯誤。
(2)自動化后處理對比。記錄DUT的輸出,通過運(yùn)行腳本對比結(jié)果。我們可以將需要的結(jié)果寫為文件保存,導(dǎo)入MATLAB進(jìn)行對比分析。也可將期望得到的結(jié)果與DUT輸出的結(jié)果通過程序自動對比分析。
(3)做一個實(shí)時監(jiān)測器自動檢查。當(dāng)然,監(jiān)測器需要進(jìn)行開發(fā),當(dāng)對比發(fā)生錯誤時,通過設(shè)置錯誤標(biāo)志和打印信息提示,便于快速發(fā)現(xiàn)錯誤,節(jié)省仿真時間。
在功能驗證時,需要考慮主要功能點(diǎn),提供比較完備的測試用例。對于FPGA功能模塊的驗證,或許用不上去搭建復(fù)雜的驗證平臺,但是這樣的驗證方法和思想依然可借鑒。在芯片設(shè)計領(lǐng)域,驗證工程師作為獨(dú)立崗位,承擔(dān)著設(shè)計把關(guān)的重任,一旦投片,基本就決定這款芯片的命運(yùn)了。
像筆者這樣的FPGA工程師新手而言,主要任務(wù)就是算法實(shí)現(xiàn)。算法工程師把算法模型交給你,你就開始制定功能模塊實(shí)現(xiàn)方案、與前后級商討接口、RTL設(shè)計、仿真驗證到上板調(diào)試。相對于數(shù)字IC工程師的獨(dú)立性而言,FPGA工程師需要的技能也許更多:首先要懂算法,至少要理解算法處理流程;其次,常規(guī)技能要掌握,就是RTL設(shè)計能力;仿真驗證能力,如何設(shè)計好的testbench來驗證你的DUT,保證系統(tǒng)集成時不會有問題;最后還需要上板調(diào)試,需要掌握調(diào)試手段和驗證分析能力,對整個系統(tǒng)需要比較熟悉,常常涉及射頻和協(xié)議棧。隔行如隔山,精力也有限,因此挑戰(zhàn)必然存在。
整個驗證流程,我們通過下圖來說明。
這里上圖提到的回歸測試和覆蓋率收斂,對于小白或新手而言,可能比較陌生,尤其是對于我這樣的非驗證崗人員。
一旦幾乎全部測試用例被成功執(zhí)行,那么驗證就進(jìn)入了回歸測試(regression test)和覆蓋率收斂階段。
回歸測試要求能夠周期的批處理運(yùn)行,并且激勵能夠得到重現(xiàn),成功或失敗都能夠自動檢查。
這個時候,所有測試應(yīng)該在每天或每周做回歸周期性運(yùn)行,查看覆蓋率,解決可能存在的bug,盡可能實(shí)現(xiàn)覆蓋率100%。
對于做FPGA的工程師而言,仿真時間太長,就不爽了。我們關(guān)心的是,功能驗證和邏輯驗證。覆蓋率沒有100%,也不要緊。不管是Vivado還是Quartus II自帶的仿真器,或者M(jìn)odelsim,都可用來做仿真。使用Modelsim做來聯(lián)合仿真時,需要注意版本匹配和庫文件編譯。
驗證技術(shù)和方法學(xué)
有三種常用驗證手段:白盒、黑盒和灰盒驗證。
三種主要驗證技術(shù):形式驗證、仿真驗證和硬件加速驗證。
三種主要驗證方法學(xué):隨機(jī)激勵生成、斷言驗證和覆蓋率驗證。
做功能驗證,目標(biāo)就是驗證設(shè)計能否能夠像預(yù)期工作。然而,可能存在一些設(shè)計缺陷并沒有在輸出邊界暴露出來,檢測產(chǎn)生遺漏等。
黑盒驗證:只通過其邊界信號來驗證一個模塊或設(shè)計的功能。驗證模型:
黑盒驗證有優(yōu)點(diǎn),也有缺點(diǎn)。優(yōu)點(diǎn)就是看起來testbench搭建簡單,缺點(diǎn)就是DUT內(nèi)部錯誤不好驗證。FPGA仿真驗證,就類似這樣。對于算法實(shí)現(xiàn)而言,常常利用FPGA仿真結(jié)果與MATLAB運(yùn)算結(jié)果對比,比如畫個圖,畫條線,數(shù)據(jù)相減,計算方差等等。內(nèi)部邏輯則可通過觀察波形來判斷,局限于復(fù)雜度不高的情況。
白盒驗證和灰盒則通過在設(shè)計內(nèi)部或者外部輸出信號放置監(jiān)控器或斷言來保證設(shè)計操作的正確性,不需要參考模型。
?
關(guān)于驗證技術(shù)中的形式驗證、仿真驗證和硬件輔助加速驗證等,其概念和使用方法,咱們不詳細(xì)去討論了,有興趣的朋友,去找?guī)妆維ystemVerilog驗證的參考書看看。
在功能驗證中,驗證工程師面臨著以下挑戰(zhàn):
完備性:最大限度驗證DUT的行為,然而,怎樣去獲取必須被驗證的場景,提高覆蓋率。
可重用性:考慮如何優(yōu)化驗證環(huán)境架構(gòu),使其可在不同場景下重用。若每做一個工程或迭代更新一個版本,都需要重新去設(shè)計testbench,那會累死三軍。
可靠性:在驗證中減少手工操作,以減少認(rèn)為錯誤和節(jié)省時間,然而,搭建一個自動化系統(tǒng)也并非易事,需仔細(xì)分析和搭建,同時采用約束隨機(jī)進(jìn)行驗證。
效率:在給定時間內(nèi),對驗證工作投入的產(chǎn)出最大化,提高驗證的成功率。對于設(shè)計師而言,我們常常采用重用技術(shù),比如某個通用模塊,可在不同工程中使用,我們進(jìn)行簡單移植修改即可。然而驗證就沒有這么幸運(yùn)了,場景不同,激勵也不同,產(chǎn)生的結(jié)果也不同。
性能:驗證程序性能上的挑戰(zhàn)就是要如何最大化驗證程序的效率。驗證耗時費(fèi)力,所以,每年在秋招春招時,大量芯片類企業(yè)招驗證工程師。筆者去年秋招時,本來投遞設(shè)計崗,然后當(dāng)你筆試或者面試的時候,給你安排驗證的崗位。
功能驗證方法學(xué),就是驗證電子系統(tǒng)的技術(shù)和科學(xué)。
前面,筆者在《FPGA工程師的核心競爭力—方法篇(一、二)》中,總結(jié)了UltraFast設(shè)計方法學(xué),從而有效提高設(shè)計和效率。
而對于驗證這一環(huán),也是有章法可循。
設(shè)計與驗證,相輔相成,如下圖:
DUT能正常工作嗎?測試功能點(diǎn)是什么?怎么測?功能對不對?我們做完驗證了嗎?簡直就是靈魂拷問。
在驗證方法中,斷言驗證(ABV)、約束隨機(jī)激勵測試(CR TB)、覆蓋率驅(qū)動驗證(CDV)等技術(shù)將會極大提高驗證效率??s短驗證周期,快速定位錯誤,加速激勵生成和有效實(shí)現(xiàn)驗證收斂。
對于FPGA工程師而言,在進(jìn)行設(shè)計和仿真驗證中,最常用的語言是verilog HDL或VHDL,各有千秋。verilog HDL用起來比較靈活,有C語言基礎(chǔ)和硬件思維,就可以快速入門。VHDL語法嚴(yán)謹(jǐn),有利于大規(guī)模系統(tǒng)集成。
SystemVerilog是業(yè)界新興的工程語言,基于verilog HDL進(jìn)行了擴(kuò)展,包括對硬件建模的擴(kuò)展和驗證斷言方面的擴(kuò)展。
SystemVerilog具有以下優(yōu)點(diǎn):
(1)單一,同時支持設(shè)計和驗證的標(biāo)準(zhǔn)語言。
(2)支持約束隨機(jī)的產(chǎn)生。
(3)支持覆蓋率統(tǒng)計分析。
(4)支持?jǐn)嘌则炞C。
(5)面向?qū)ο蟮?a target="_blank">編程結(jié)構(gòu),有助于采用事務(wù)級的驗證和提高驗證的重用性。
基于SystemVerilog的驗證方法學(xué)有:OVM、VMM和UVM。目前,業(yè)界最流行的是UVM。相信你在或?qū)诮窈蟮摹敖鹁陪y十”的秋招時,會被問到是否對UVM有所了解。如果你是看到本文了解到UVM這個概念,那么趕緊再深入了解一下。
下圖是驗證方法學(xué)的發(fā)展時間線:
UVM (Universal Verification Methodology)通用驗證方法學(xué)。它起源于 OVM(Open Verification Methdology),其正式版是在2011年2月由Accellera推出的,得到了Synopsys、Cadence和Mentor的一致支持。UVM幾乎完全繼承了OVM,同時又采納了Synopsys在VMM中的寄存器解決方案RAL。UVM繼承了OVM和VMM的優(yōu)點(diǎn),克服了各自的缺點(diǎn),代表了驗證方法學(xué)的發(fā)展方向。
下圖是典型的UVM驗證平臺框圖:
由于SystemVerilog可完全兼容Verilog,所以你在.sv文件中加入幾行Verilog語法的程序也不會出錯。比如讀寫文件的操作,前幾天,筆者也不了解這個SystemVerilog的用法,就在微信群里問這種小兒科問題:
“SystemVerilog和Verilog在讀寫文件操作上,有什么區(qū)別?”
$fopen,$readmemh/$readmemb,$fwrite,$fclose依然可用。
SystemVerilog中可操作字符串,這對于存儲初始化文件(.mif)的讀操作比較友好,并且可跳過文件中的注釋。
SystemVerilog中信號定義,可用logic來代替Verilog中的reg和wire。
關(guān)于任務(wù)task的使用,文件指針等等,可以參閱SystemVerilog設(shè)計和驗證的書籍,講得很詳細(xì)。
審核編輯:劉清
評論
查看更多