芯片驗(yàn)證是為了發(fā)現(xiàn)芯片中的錯(cuò)誤而執(zhí)行的過(guò)程,它是一個(gè)破壞性的過(guò)程。完備的驗(yàn)證激勵(lì)可以更有效地發(fā)現(xiàn)芯片錯(cuò)誤,進(jìn)而縮短驗(yàn)證周期。合格的驗(yàn)證激勵(lì)必須能產(chǎn)生所有可能的驗(yàn)證場(chǎng)景(完備性),包括合法和非法的場(chǎng)景,并保持最大的可擴(kuò)展性和可控性。
激勵(lì)構(gòu)造一直都是芯片驗(yàn)證的一大難點(diǎn)。本文將從完備性、可拓展性和可控性三方面展開(kāi)闡述如何系統(tǒng)地思考和構(gòu)建驗(yàn)證激勵(lì)。
? ? ? 1. 完備性
完備性可以從接口類型、內(nèi)部結(jié)構(gòu)和激勵(lì)審查三方面分析。分析接口類型是為了從待測(cè)模塊與其它模塊的交互信號(hào)上提取出驗(yàn)證場(chǎng)景。分析內(nèi)部結(jié)構(gòu)是為了從待測(cè)模塊內(nèi)部實(shí)現(xiàn)細(xì)節(jié)上來(lái)調(diào)整激勵(lì),使激勵(lì)多產(chǎn)生可能發(fā)現(xiàn)錯(cuò)誤的場(chǎng)景。激勵(lì)審查用于查缺補(bǔ)漏,從自己、他人以及項(xiàng)目等各個(gè)環(huán)節(jié)上對(duì)激勵(lì)進(jìn)行完善。
1.1 接口類型
對(duì)于待測(cè)設(shè)計(jì)的輸入輸出接口,可以通過(guò)接口類型進(jìn)行劃分,根據(jù)接口類型的特性構(gòu)造對(duì)應(yīng)的驗(yàn)證組件來(lái)產(chǎn)生激勵(lì)。常見(jiàn)接口類型有:
系統(tǒng)控制接口:主要是時(shí)鐘、復(fù)位、電源開(kāi)關(guān)、時(shí)鐘門控、時(shí)鐘分頻等,這類信號(hào)行為都會(huì)有詳細(xì)的規(guī)定,遵循實(shí)際集成關(guān)系做控制即可。例如:時(shí)鐘和復(fù)位的時(shí)序,多個(gè)時(shí)鐘是不是同步關(guān)系,多個(gè)復(fù)位信號(hào)是否可以單獨(dú)控制等。
標(biāo)準(zhǔn)總線接口:行業(yè)公開(kāi)的標(biāo)準(zhǔn)總線協(xié)議,例如AMBA系列協(xié)議。這類協(xié)議通常有現(xiàn)成的驗(yàn)證IP,只需配置它們來(lái)產(chǎn)生預(yù)期的場(chǎng)景。
非標(biāo)準(zhǔn)總線接口:公司內(nèi)部定義的接口,或者根據(jù)模塊功能需求定義的接口。這類接口需要從相鄰設(shè)計(jì)了解各信號(hào)的準(zhǔn)確信息。
其它接口:DFT等。通常來(lái)說(shuō),這類接口與驗(yàn)證關(guān)系不是很大,只需要把它們接固定值即可。
在對(duì)接口類型進(jìn)行分析要產(chǎn)生的激勵(lì)時(shí),可以先從單一接口類型進(jìn)行分析,然后再看多個(gè)接口交互上有什么需要重點(diǎn)關(guān)注。關(guān)于如何進(jìn)行測(cè)試點(diǎn)分解,可以看這個(gè)系列視頻《芯片驗(yàn)證分享系列總結(jié)及PPT分享》。
1.1.1 單一接口類型
單一接口類型分析可以按基本顆粒、高級(jí)顆粒和非法行為順序進(jìn)行。
基本顆粒:基本顆粒面向信號(hào)層,提供基本顆粒生成方法。
每根信號(hào):信號(hào)來(lái)源和功能、使能極性、脈沖有效或電平有效、時(shí)序、信號(hào)的取值范圍和格式等。
信號(hào)之間:不同信號(hào)之間的關(guān)系,是否存在握手和時(shí)序關(guān)系,無(wú)關(guān)信號(hào)是否處理成隨機(jī)值還是固定值等。
高級(jí)顆粒:高級(jí)顆粒面向場(chǎng)景層,它封裝了多個(gè)基本顆粒,較少考慮底層信號(hào)。
序列:傳輸包的序列有哪些。
密度:傳輸包的密度分布有哪些。
非法行為:用于驗(yàn)證待測(cè)設(shè)計(jì)的魯棒性,出現(xiàn)非法行為,待測(cè)設(shè)計(jì)是否可以正常處理。
數(shù)值:信號(hào)值可能出現(xiàn)哪些非預(yù)期的值。
行為:信號(hào)時(shí)序、協(xié)議等行為可能出現(xiàn)哪些異常行為。
1.1.2 多個(gè)接口交互
對(duì)于具有多個(gè)接口的待測(cè)設(shè)計(jì),我們也需要考慮接口之間可能存在的交互或同步,以及接口之間是否使用共同資源。比如,為了測(cè)試兩個(gè)接口相同地址hazard,可以讓這兩個(gè)接口共享一個(gè)地址產(chǎn)生器。
不同接口對(duì)應(yīng)不同的驗(yàn)證組件,組件之間的協(xié)調(diào)有用多種方式:
中心統(tǒng)籌式:通過(guò)集中式控制、分配和協(xié)調(diào),在上層將任務(wù)分解成每個(gè)接口組件的任務(wù),并統(tǒng)一分派給各個(gè)接口組件去執(zhí)行,進(jìn)而產(chǎn)生不同的激勵(lì)組合場(chǎng)景。比如UVM中的virtual sequence角色。
分布事件驅(qū)動(dòng)式:每個(gè)接口組件有自己的控制權(quán),各個(gè)組件直接進(jìn)行交互。比如使用SystemVerilog中的event、mailbox、semaphore和全部變量等方式實(shí)現(xiàn)通信交互。
混合式:上述兩種方式并存。這需要根據(jù)具體場(chǎng)景來(lái)使用。
1.2 內(nèi)部結(jié)構(gòu)
激勵(lì)設(shè)計(jì)除了看接口信號(hào)外,還需要結(jié)合待測(cè)設(shè)計(jì)的內(nèi)部結(jié)構(gòu)和功能去分析,調(diào)整激勵(lì)約束,從而有更大的概率產(chǎn)生有效場(chǎng)景。
可以沿著控制流(control flow)方向去分析待測(cè)設(shè)計(jì)的內(nèi)部結(jié)構(gòu)和功能,具體以下幾個(gè)地方需要重點(diǎn)關(guān)注:
觸發(fā)功能點(diǎn):觸發(fā)內(nèi)部某個(gè)功能的激勵(lì)序列有哪些,比如Prefetch、flow-control、address hazard等。觸發(fā)內(nèi)部某個(gè)功能的敏感值有哪些,比如ALU、內(nèi)部錯(cuò)誤(cache ecc error, slave error, etc)、barrier、exclusive monitor、address hazard等。
觸發(fā)資源瓶頸和爭(zhēng)搶:如何觸發(fā)內(nèi)部資源瓶頸和爭(zhēng)搶。比如FIFO空滿、Buffer空滿、多請(qǐng)求源仲裁、數(shù)字運(yùn)算上下溢等。
1.3 激勵(lì)審查
審查(Review)環(huán)節(jié)對(duì)完善激勵(lì)起著至關(guān)重要的作用,可以提高激勵(lì)質(zhì)量,并減少漏驗(yàn)特性、無(wú)效激勵(lì)的概率,對(duì)個(gè)人成長(zhǎng)也有很大幫助。
建議以下這些審查方式都要按順序進(jìn)行:
個(gè)人審查:由自己進(jìn)行,對(duì)照歷史錯(cuò)誤清單進(jìn)行,舉一反三,避免犯類似錯(cuò)誤。
同組審查:由組內(nèi)更有經(jīng)驗(yàn)的人進(jìn)行,對(duì)激勵(lì)完備性、設(shè)計(jì)結(jié)構(gòu)、假設(shè)、代碼實(shí)現(xiàn)進(jìn)行檢查。
跨組審查:由待測(cè)模塊的設(shè)計(jì)人員進(jìn)行,對(duì)激勵(lì)完備性、設(shè)計(jì)顧慮、易錯(cuò)特性、局限性和各種激勵(lì)假設(shè)進(jìn)行檢查。
? ? ? 2. 可擴(kuò)展性?
可擴(kuò)展性也包括可復(fù)用性。為了處理驗(yàn)證周期縮短、待測(cè)RTL規(guī)格頻繁變動(dòng)等各種情況,我們需要在設(shè)計(jì)激勵(lì)時(shí)提前構(gòu)思如何讓激勵(lì)更容易擴(kuò)展?;诖?,我們可以從模塊化和層次化方面去思考。
2.1 模塊化
模塊化需要將設(shè)計(jì)輸入輸出信號(hào)劃分為不同的接口類型,并創(chuàng)建出對(duì)應(yīng)的接口驗(yàn)證組件,確保各個(gè)組件之間的獨(dú)立性,各個(gè)組件才會(huì)最大程度地不受其它組件的制約。并定義好模塊之間的交互方式,這樣一個(gè)模塊的改動(dòng)對(duì)其它模塊的影響就很小,而且模塊也更容易的復(fù)用到其它地方。例如,如果有兩組相同接口,則應(yīng)該引入兩個(gè)組件分別控制,而非建立一個(gè)組件卻擁有兩套接口,這樣后期維護(hù)起來(lái)會(huì)很麻煩的。
另外把常見(jiàn)的功能封裝成公共庫(kù),這樣在多個(gè)地方都可以直接使用,如果功能需要改動(dòng),只需要改動(dòng)一處代碼即可。在寫(xiě)代碼時(shí),多留一些后門(callback),方便實(shí)現(xiàn)多樣化的激勵(lì)和后期增加新功能。
2.2 層次化
層次化需要將激勵(lì)抽象出各個(gè)層次,越高的抽象層次越不關(guān)注底層的時(shí)序,而是更重視驗(yàn)證場(chǎng)景構(gòu)造。這樣底層信號(hào)時(shí)序或功能的改動(dòng)也不容易影響到上層的激勵(lì),而且上層的激勵(lì)說(shuō)不定也可以復(fù)用到其它地方。
以UVM為例,uvm_driver應(yīng)只關(guān)心接口驅(qū)動(dòng),負(fù)責(zé)把收到的uvm_sequence_item內(nèi)容直接驅(qū)動(dòng)到接口信號(hào);uvm_sequence負(fù)責(zé)場(chǎng)景的構(gòu)造,當(dāng)然uvm_sequence也可以繼續(xù)分層,更上層的uvm_sequence產(chǎn)生更宏觀的驗(yàn)證場(chǎng)景,然后逐層分解成小的場(chǎng)景。
? ? ? 3. 可控性?
可控性用于表征是否容易控制激勵(lì)產(chǎn)生預(yù)期的驗(yàn)證場(chǎng)景。比如驗(yàn)證ECC模塊功能時(shí),在最開(kāi)始時(shí),我們需要不注入任何ECC錯(cuò)誤的激勵(lì),側(cè)重于驗(yàn)證ECC模塊功能是否正常。隨后才會(huì)打開(kāi)ECC注錯(cuò)激勵(lì),驗(yàn)證ECC模塊是否可以檢查出來(lái)。這需要提供一些方式可以控制是否打開(kāi)ECC注錯(cuò)激勵(lì)?;诖?,我們可以從局部和全局方面去思考。
3.1 局部
可控性局部的意思是驗(yàn)證激勵(lì)可以單獨(dú)控制局部激勵(lì)的行為,通常來(lái)說(shuō)面向單個(gè)接口驗(yàn)證組件。這層控制的特點(diǎn)是偏向于接口,可以細(xì)致到控制接口每根信號(hào)的行為。
比如,待測(cè)對(duì)象有兩個(gè)ECC模塊,我們可以控制其中一個(gè)有ECC注錯(cuò),另一個(gè)沒(méi)有。
3.2 全局
可控性全局的意思是驗(yàn)證激勵(lì)可以一同控制所有激勵(lì)的行為,通常來(lái)說(shuō)面向一個(gè)驗(yàn)證環(huán)境中的所有接口驗(yàn)證組件。這層控制的特點(diǎn)是偏向于特性,是把所有局部控制參數(shù)整合起來(lái),提供和驗(yàn)證特性相關(guān)的控制參數(shù)。
比如,待測(cè)對(duì)象有兩個(gè)ECC模塊,我們可以同時(shí)控制兩個(gè)都有ECC注錯(cuò),或都沒(méi)有等。又或者待測(cè)對(duì)象的某個(gè)特性還未開(kāi)發(fā)完成,我們可以控制不讓所有激勵(lì)發(fā)出與未完成特性相關(guān)的場(chǎng)景。
? ?總結(jié)? ? ??
綜上所述,激勵(lì)設(shè)計(jì)可以按照“完備性->可拓展性->可控性”方向去分析。在完備性中,可以按照“接口類型->內(nèi)部結(jié)構(gòu)->激勵(lì)審查”方向去分析。在可拓展性中,可以按照“模塊化->層次化”方向去分析。在可控性中,可以按照“局部->全局”方向去分析。
另外很重要的一點(diǎn)是:要經(jīng)常對(duì)驗(yàn)證結(jié)果進(jìn)行復(fù)盤(pán)分析,并優(yōu)化激勵(lì)。
總得思維導(dǎo)圖如下: