作為一名驗(yàn)證工程師,你應(yīng)該盡可能細(xì)致深入地去檢驗(yàn)設(shè)計(jì),并提取出所有可能的漏洞夸浅。在流片之前每發(fā)現(xiàn)一個(gè)漏洞就意味著最終到顧客手里就會少一個(gè)漏洞冤荆。接下來我將更新一個(gè)系列的文章來講述SystemVerilog這門驗(yàn)證語言踊沸,希望能夠?qū)W有所長歇终。本章內(nèi)容就做一個(gè)大體的介紹,有很多東西也許解析不到位逼龟,希望以后能修改補(bǔ)充评凝。
在熟悉Verilog語言的基礎(chǔ)上,我希望能夠?qū)W習(xí)System Verilog硬件驗(yàn)證語言(Hardware Verification Language腺律,HVL)奕短。相比于硬件描述語言(HDL),HVL具有以下典型的性質(zhì):
- 受約束的隨機(jī)激勵(lì)生成匀钧。
- 功能覆蓋率翎碑。
- 更高層次的結(jié)構(gòu),尤其是面向?qū)ο蟮木幊獭?/li>
- 多線程及線程之間的通信之斯。
- 支持HDL數(shù)據(jù)類型日杈。
- 集成了事件仿真器,便于對設(shè)計(jì)施加控制佑刷。
除此之外达椰,還有很多特性,這些特質(zhì)保證了我們能夠運(yùn)用HVL來創(chuàng)建高度抽象的測試平臺项乒。
1.1 驗(yàn)證流程
什么是驗(yàn)證呢?作為一名驗(yàn)證工程師梁沧,你的目的就是確保該設(shè)備能夠成功地完成預(yù)定的任務(wù)檀何,換句話說,該設(shè)計(jì)是對規(guī)范的一種準(zhǔn)確表達(dá)廷支。
驗(yàn)證的流程并行于設(shè)計(jì)流程频鉴。一名驗(yàn)證工程師,你必須閱讀硬件規(guī)范并擬定驗(yàn)證計(jì)劃恋拍,創(chuàng)建測試來檢查RTL代碼是否準(zhǔn)確地實(shí)現(xiàn)了所有的特性垛孔。
1.1.1 不同層次上的測試
設(shè)計(jì)上的漏洞會在不同層次上產(chǎn)生漏洞,下面從底層開始對設(shè)計(jì)中的漏洞進(jìn)行下面幾種分類施敢。
- 代碼塊層次周荐,在module創(chuàng)建的代碼塊。
- 代碼塊的邊界僵娃,不同的設(shè)計(jì)者會對同一個(gè)規(guī)范有不同的理解概作,這樣會造成硬件邏輯上的爭議。
- 為了仿真一個(gè)代碼塊默怨,你需要?jiǎng)?chuàng)建測試集來模擬周圍代碼塊產(chǎn)生激勵(lì)讯榕,這樣低層次的仿真運(yùn)行起來會很快,但是產(chǎn)生激勵(lì)的方式會很繁瑣。將多個(gè)代碼塊集成到一起愚屁,在待測設(shè)計(jì)的最高層次上济竹,整個(gè)系統(tǒng)都會被測試,代碼塊之間相互激勵(lì)霎槐,運(yùn)行起來速度會更慢一些送浊,但是仿真過程就會簡單很多。你的測試應(yīng)該盡可能讓所有的代碼塊并發(fā)活動栽燕。所有的輸入輸出端口都被激活罕袋,處理器正在處理數(shù)據(jù),而高速緩存也在載入數(shù)據(jù)碍岔。這樣的話浴讯,數(shù)據(jù)分配和時(shí)序上的漏洞肯定會出現(xiàn)。
- 錯(cuò)誤注入和處理蔼啦,一旦驗(yàn)證了待測設(shè)計(jì)能夠執(zhí)行所有預(yù)期的功能以后榆纽,你還需要看一下當(dāng)出現(xiàn)錯(cuò)誤時(shí),待測設(shè)計(jì)會怎樣操作捏肢。
我們永遠(yuǎn)也無法證明沒有任何漏洞留下奈籽,所以需要不停地嘗試新的驗(yàn)證策略。
1.1.2 驗(yàn)證計(jì)劃
驗(yàn)證計(jì)劃主要包括以下幾種方法:定向測試鸵赫、隨機(jī)測試衣屏、斷言、軟硬件協(xié)同驗(yàn)證辩棒、硬件仿真狼忱、形式驗(yàn)證,以及對驗(yàn)證IP的使用等等一睁。
1.2 基本測試平臺的功能
測試平臺的用途在于確定待測設(shè)計(jì)的正確性钻弄。包含下列步驟:
(1) 產(chǎn)生激勵(lì)。
(2) 把激勵(lì)施加到DUT上者吁。
(3) 捕捉響應(yīng)窘俺。
(4) 檢驗(yàn)正確性。
(5) 對照整個(gè)驗(yàn)證目標(biāo)測算進(jìn)展情況复凳。
1.3 定向測試
所謂定向測試就是針對待測設(shè)計(jì)制訂具體的激勵(lì)向量瘤泪,然后使用這些向量對待測設(shè)計(jì)進(jìn)行仿真。仿真結(jié)束后育八,手工查看一下結(jié)果文件和波形確保設(shè)計(jì)的行為和預(yù)期一致均芽。如果測試結(jié)果正確,你就可以繼續(xù)下一個(gè)測試单鹿。如果給予你足夠的時(shí)間和人力掀宋,定向測試可以完成驗(yàn)證計(jì)劃百分之百覆蓋率所需要的全部測試。
1.4 方法學(xué)基礎(chǔ)
方法學(xué)的原則如下:
(1)受約束的隨機(jī)激勵(lì)。
定向測試可以找出設(shè)計(jì)中預(yù)期的漏洞劲妙,隨機(jī)激勵(lì)能夠找出預(yù)料不到的漏洞湃鹊。在復(fù)雜的設(shè)計(jì)中,隨機(jī)激勵(lì)十分關(guān)鍵镣奋。
(2)功能覆蓋率币呵。
當(dāng)使用隨機(jī)激勵(lì)時(shí),需要用功能覆蓋率來評估驗(yàn)證的進(jìn)展情況侨颈。使用自動生成的激勵(lì)余赢,就需要一種能夠自動預(yù)測結(jié)果的方式---通常是記分板或參考模型。建立包括自預(yù)測在內(nèi)的測試平臺基礎(chǔ)設(shè)施是一件工作量很大的事情哈垢。
(3)使用事務(wù)處理器的分層測試平臺妻柒。
分層的測試平臺能夠把問題分解為容易處理的小塊,這樣有助于控制復(fù)雜度耘分。
(4)對所有測試通用的測試平臺举塔。
建立一個(gè)測試平臺所需要的基礎(chǔ)設(shè)施,它們能在所有測試中通用并且不需要經(jīng)常性修改求泰。你只需要在某些地方放置“鉤子”央渣,以便測試能夠在這些地方執(zhí)行調(diào)整激勵(lì)或注入錯(cuò)誤這樣特定的操作。
(5)獨(dú)立于測試平臺之外的個(gè)性化測試代碼渴频。
針對單一測試的個(gè)性化代碼必須與測試平臺分開芽丹,這樣可以避免增加基礎(chǔ)設(shè)施的復(fù)雜度。
總之卜朗,建立這種風(fēng)格的測試平臺所需的時(shí)間要比傳統(tǒng)的定向測試平臺多得多---尤其是自檢部分志衍。結(jié)果是可能需要很長的準(zhǔn)備時(shí)間才能進(jìn)行第一次可運(yùn)行的測試。每個(gè)隨機(jī)測試都可以公用測試平臺聊替。受約束的隨機(jī)測試平臺找起來漏洞會比很多定向測試快很多。
隨著漏洞出現(xiàn)率的下降培廓,你應(yīng)該創(chuàng)建新的隨機(jī)約束去探索新的區(qū)域惹悄。最后的幾個(gè)漏洞可能只能通過定向測試來發(fā)現(xiàn),但是絕大部分的漏洞都應(yīng)該會在隨機(jī)測試中出現(xiàn)肩钠。
1.5 受約束的隨機(jī)激勵(lì)
我們希望仿真器能夠產(chǎn)生隨機(jī)激勵(lì)泣港,但同時(shí)又不希望激勵(lì)時(shí)完全隨機(jī)的。SystemVerilog語言可以描述激勵(lì)的格式价匠,然后讓仿真器產(chǎn)生滿足約束的數(shù)值当纱。這些數(shù)值會被發(fā)送到設(shè)計(jì)中去,同時(shí)也會被發(fā)送到一個(gè)負(fù)責(zé)預(yù)測仿真結(jié)果的高層模塊中去踩窖。設(shè)計(jì)的實(shí)際輸出最終需要和預(yù)測輸出做對比坡氯。下圖為達(dá)到完全覆蓋的技術(shù)路線。
其中,最少的代碼修改一般包括:使用新的約束和把錯(cuò)誤或延時(shí)加入到待測設(shè)計(jì)中箫柳。