看了不少回答,都在強(qiáng)調(diào)如何使用uvm的。UVM/SV屬于工具范疇,工具用的熟不熟練,當(dāng)然非常重要,但是脫離了芯片本身討論工具未免有些本末倒置。
舉個例子,驗cpu core中fpu(也就是浮點(diǎn)運(yùn)算)的同學(xué)可能一年到頭都用不到幾次uvm,以此類推,環(huán)境寫的好不好,優(yōu)化的程度高不高,重要嗎?重要。但是作為驗證工程師,最重要的在于驗證行為本身。
什么是驗證行為?說白了就是找bug。無論用什么方法,總之,在極其有限的時間內(nèi),找出盡可能多的RTL bug,這個bug可以是功能上的,也可以是性能上的,也可能是時序上的(如果跑gatesim的情況下)。但是,至今為止,沒有哪家公司敢說他們家的芯片是沒有bug的,可能產(chǎn)品迭代了幾代以后,依舊可以找到第一代產(chǎn)品的bug。所以,只要場景足夠豐富,bug永遠(yuǎn)找不完。
所以,怎么辦呢?那就是對功能測試點(diǎn)做優(yōu)先級劃分,比如軟件可回避的場景,優(yōu)先級可以安排的最低,實在來不及在tapeout前甚至可以不做。比如,dma做數(shù)據(jù)搬運(yùn)時,對某個client發(fā)出了無效地址,系統(tǒng)該如何處理?如果軟件可以確保這類訪問不會被發(fā)出,那么這部分的check可以放到最后。
我們以cpu指令驗證為例,所有的單指令都驗完以后,指令交叉的場景可以多到懷疑人生,難道每一種排列組合都cover嗎?如果采取大規(guī)模的隨機(jī)用例組合,那么random case的數(shù)量同樣十分驚人,并且在漫無目的的全隨機(jī)中,會存在大量重復(fù)的組合,這無疑浪費(fèi)了寶貴的仿真時間。這個時候可以采取二分法,將單指令驗證歸為一類,然后直接運(yùn)行高度復(fù)雜的組合場景(比如多指令亂序發(fā)射+亂序指令+多核數(shù)據(jù)共享),如果證明無誤,那么在這個復(fù)雜度以內(nèi)的所有組合其實也被間接地證明了其正確性,初中物理中將這類做法歸類于極端法。
同樣的道理,在驗證slave數(shù)據(jù)通路的時候,如果上層直接將每次訪問的時間間隔(也就是delay)直接設(shè)置成系統(tǒng)允許的最小時間(通常是0),采取沖擊型的訪問方式,如果這種極端情況下,通路依舊可以正常工作,那么理論上正常delay間隔的所有訪問的正確性也就得到了保證。
上述說的這些內(nèi)容,都是在講驗證行為本身,并不涉及工具的使用。今天我們都在講第一性原理,通俗地講,就是對現(xiàn)象進(jìn)行層層還原,找到一個基本點(diǎn),也就是所謂的底層邏輯(當(dāng)然,也可以是物理規(guī)律),然后不斷地進(jìn)行 正-反-合的演繹,構(gòu)建出一個龐大的符號系統(tǒng)。在芯片驗證中,這個基本點(diǎn)就是芯片系統(tǒng)本身,以確保系統(tǒng)功能完備性和準(zhǔn)確性為目的,展開的一系列證明活動,就是驗證行為本身。
所以,整個認(rèn)識活動的優(yōu)先級應(yīng)該是,芯片系統(tǒng)(block/ip spec) > 驗證思想 (功能點(diǎn)以及優(yōu)先級的拆分,包括驗證計劃) > 驗證方法。
所謂形而上者,謂之道;形而下者謂之器。使用uvm/sv還是c,用仿真驗證還是形式驗證,只是具體的方法,歸根結(jié)底還只能屬于器物的范疇。