過去幾年來,業界已投入許多心力來提升設計驗證的生產力與結果品質,其中大部份的努力都是專注於開發區塊級(block-level)適用的技巧。這些技巧——例如限制性隨機交易產生、功能驗證覆蓋以及通用驗證方法學(UVM)——都已大幅提升了驗證的品質與生產力。然而,雖然這些技巧在區塊級已經非常成功,但在子系統與SoC級的驗證挑戰日益嚴峻,因此我們仍需要新的作法來解決此一問題。

不論是商用還是公司內部自行開發的工具,都已提升了驗證的生產力與效率。例如,明導(Mentor)的Questa inFact商用工具,可提高擷取的層級(提升生產力)、增加測試產生的效率,並能應用於各種驗證環境之中。

隨著業界越來越想把自動測試帶到交易導向的區塊級環境之外,因此對於擁有一套標準化的輸入規範語言,用於明確指定這些測試的需求也日益升高。為此,EDA產業標準組織Accellera成立了一個工作小組,稱為「可攜式激發向量工作小組」(PSWG),目標在於收集各方需求、匯整技術貢獻,並規範一種標準化的輸入語言,用於說明測試意圖,並適用於各種驗證平台。Mentor一直積極參與並推動PSWG的活動,並已針對標準化流程投入技術與專業能力。

什麼是可攜式激發向量?

可攜式激發向量(Portable Stimulus)的目標可用圖1來說明。它的基本概念是針對適用於IP級、子系統級與SoC級驗證的測試意圖進行單一的描述(可攜式激發向量描述);同時,測試意圖必須以適當的方式來建置,使其能夠用於各種驗證型態的驗證引擎。

20170821_Mentor_TA31P1 圖1:可攜式激發向量的目標

除了上述可攜式激發向量的目標之外,更重要的是強調其不同之處。可攜式激發向量的描述並不會強制規定所有的描述都必須為單一層級的擷取,或要求所有的測試意圖必須以一種固定的方式來進行。我們將會看到,PSWG目前正在開發的可攜式激發向量規範包含了許多的要素,使用者能夠擁有描述其測試意圖的靈活性,因此能以最自然的方式符合其驗證任務的需求。另一點值得注意的是,建立高效率的自動測試,才是讓PSWG尋求可攜式作法的主因。可攜式激發向量不僅是取得「最小公分母」的技巧,讓它能輕鬆支援所有的驗證引擎。此外,Accellera可攜式激發向量規範(PSS)的目標並不在於取代現有的程式語言,例如C/C++或SystemVerilog。由於現有語言的程式碼再利用是很重要的,因此,Accellera PSS提供了一些機制,能夠重複使用以這些語言所描述的行為。

可攜式激發向量概要

可攜式激發向量試圖提升擷取的層級,並讓使用者能夠針對子系統與SoC級驗證中會出現的複雜情境進行自動化測試。但是,Accellera PSWG所開發的PSS是以基於限制的交易級驗證為基礎,業界對此技術已經非常瞭解且已廣泛佈署。在這些基本的特性之上,Accellera PSS提供的特性完全聚焦於讓使用者能更具生產力地擷取複雜的SoC級情境,並有效地予以實現。

因此,Accellera PSS支援隨機與非隨機的資料欄位(field)與結構,如同常用的SystemVerilog限制,同時,其固有的向量型態與物件導向語言相近。

透過混合運用限制隨機產生與程序程式碼,可建立SystemVerilog的情境。但此作法在情境的再利用,以及無需更改原始程式碼就能進行客製化等方面,卻有一些限制。對此,Accellera PSS提供了一種「行動」(action),作為行為的原始要件,並提供了一個封裝複雜行為的方法,讓它能夠輕鬆地被再利用與客製化。在這些複雜的行動中,可指定子行動的序列與平行執行,以及子行動的重複動作。在該行動中的行為會以宣告的方式來指定,因而實現高度的自動化與靜態分析。

Accellera PSS提供了專屬的架構來建模行動的資源需求,以及情境中行動之間的資料交換。這能讓使用者描述正當情境的邊界規則,並讓工具根據這些規則自動建立複雜的正當情境——如同指定正當交易邊界的資料限制一樣,讓限制解算器自動產生許多的正當交易。

可攜式激發向量在區塊級的應用

可攜式激發向量應用在區塊級驗證環境可產生顯著的效益。可攜式激發向量工具要求非常有效、明確的測試產生,由於這項要求,因此能為SoC級環境有效地產生測試。在區塊級環境中,有效的測試產生能夠更快達到功能覆蓋的目標,並儘早在驗證週期中找到錯誤。舉例來說,Mentor Questa inFact的使用者通常會發現,此工具在達成覆蓋目標的效率比隨機產生更高10~100倍,讓他們能夠更快找到錯誤,而且無需增加模擬資源就能擴大覆蓋範圍。

在本文中,將以多通道直接記憶體存取(DMA)引擎為例說明。像這樣典型的DMA引擎,其記憶體傳輸運算的特性是由傳輸描述元決定,它包含了傳輸大小、來源與目的位址、位址增量設定以及詳細的傳輸選項。在區塊級,我們希望能完整地執行這些傳輸描述元欄位的結合,以便能完整地驗證DMA建置。

圖2簡單檢視與此IP相關的UVM測試平台。DMA引擎利用UVM序列來執行,此序列會根據DMA描述元類別編程DMA引擎中的暫存器。

20170821_Mentor_TA31P2 圖2:基於IP的UVM測試平台簡圖

SV限制的再利用

DMA描述元類別包含了用於定義有效DMA傳輸的欄位與限制。能夠運用來自可攜式激發向量的既有描述是很重要的,因為工程師已經投入許多時間,以便能正確地擷取限制,而且環境的其他部份也是由此類別驅動的。所幸Accellera PSS的交易級子集會與SystemVerilog限制子集重疊,因此許多基於SystemVerilog限制的描述都能被轉換為PSS描述。

20170821_Mentor_TA31P3 圖3:SystemVerilog與PSS的比較

Questa inFact可針對此目的提供匯入工具。如圖3顯示原始SystemVerilog class與PSS struc的比較。匯入SystemVerilog描述,並使其可在PSS描述中使用,此過程利用了在SystemVerilog中建立序列級的描述,因此能更簡單地開始執行PSS,並確保PSS描述能與在SystemVerilog端進行的任何序列修改保持同步。

指定基本運算

現在,我們將描述最基本的DMA運算:DMA傳輸。在可攜式激發向量的描述中,資料以及運算的行為都會被封裝在一個「行動」之中。

20170821_Mentor_TA31F1

如上所示,行動可在元件(component)中進行宣告,其中封裝了由多個行動共享的資源。在基本的區塊級驗證,我們不需要為wb_dma_c元件提供任何特別的東西。我們的do_dma行動只是擷取隨機的wb_dma_描述元struct欄位,稍後會說明建置細節。

描述情境

從測試的觀點來看,我們要做的第一件事只是產生一連串單一的DMA傳輸。我們在行動中描述測試情境,就像我們的基本運算一樣。由於我們的測試情境是由行動本身組成的,因此增加一個Activity Graph(關鍵字:activity)來指定子行動之間的關係。

20170821_Mentor_TA31F2

請注意,我們在元件中宣告了simple_xfer行動。此元件包含wb_dma_c元件的一個實例,而此元件並宣告了do_dma行動。我們的simple_xfer行動只是重覆執行256次do_dma行動。

20170821_Mentor_TA31F3

我們可能會想要稍加擴展測試,以便能執行兩個緊接的DMA傳輸,但是兩個傳輸所使用的通道限制並不相同。這將會在DMA控制器中引發更有趣的動作。請注意,如上所示,我們如何限制一個行動實例的隨機欄位——利用引導式隨機序列途徑則是相當困難的。

指定環境介面

至此,我們還不用太擔心「行動」該如何連接至UVM測試平台環境。PSS提供的type extension功能可輕鬆地連接至環境,而無需更改我們所描述的任何行動或元件。

在我們的UVM測試平台中,激發向量是由UVM序列來驅動的,該序列並產生wb_dma_描述元序列細項。我們要將PSS描述整合到UVM序列中,並讓它產生wb_dma_描述元序列細項——但採用的是可攜式激發向量工具所選擇的欄位數值,而非利用一般的SystemVerilog隨機限制工具。

20170821_Mentor_TA31F4

PSS封包提供了一個封裝環境特性的絕佳方式,我們可利用封包涵蓋如何將do_dma行動整合至UVM序列的細節。特別是,我們假設該序列可提供一個名為do_item的任務,它可接受並執行wb_dma_描述元序列細項。import宣告則是詳細說明此外部方法的特點。

接下來,我們必須指定do_dma行動應如何使用此匯入方法。PSS提供exec區塊,以指定PSS物件與外部程式碼之間的關係。在exec區塊中的‘body’型態指定了執行期間的行為(類似UVM序列body任務)。在此案例中,我們指定了do_dma行動的執行期間行為,以便將wb_dma_描述元欄位傳送給do_item任務。

20170821_Mentor_TA31P4 圖4:以PSS驅動的UVM序列可驅動UVM測試平台,更高效地執行DMA傳輸模式

透過此方式,我們便完成任務了!現在,以PSS驅動的UVM序列可驅動UVM測試平台,且其優點是能夠更有效率地執行DMA傳輸模式。

可攜式激發向量在子系統與SoC級的應用

在子系統與SoC級,需要驗證的項目以及如何進行驗證都改變了。如今,相較於專注驗證DMA引擎的建置,我們更有興趣的是DMA引擎如何與子系統或SoC中的其他區塊整合。此外,不同的是,特別是在SoC級,它還提供一個嵌入式處理器,可用於處理器上執行的程式碼以驅動某些測試活動。

對於一個子系統級環境,我們應該從如圖5所示的方塊圖開始著手

20170821_Mentor_TA31P5 圖5:UVM序列子系統方塊圖

現在,DMA引擎位於子系統環境中,其中包含了一個處理器(連接至匯流排功能模型)以及其他的IP。

利用以下的兩個步驟,可將PSS描述帶到子系統/SoC環境中:

  1. 為情境級測試需求進行建模
  2. 指定新的環境整合

如上所述,在此環境中的目標是要驗證與子系統中其他IP的整合。為此,我們將執行多個平行的DMA傳輸。首先我們要做的是擴展dma_c元件來指定可用的資源——在此案例中為31個DMA通道。同時,我們將建立一個新的行動類型,它會消耗一個DMA通道,並指定其資料流需求。

20170821_Mentor_TA31F5

現在,更新後的DMA元件與行動可指定:

  • DMA有31個通道資源(利用資源庫)
  • 每個DMA運算佔用來源記憶體緩衝,並產生目的地的記憶體緩衝
  • 每個do_mem2mem_dma運算(來自於do_dma)必須存取一個DMA通道(利用lock欄位)
  • DMA描述元中指定的通道必須與指派給DMA運算的通道一樣
  • DMA運算使用的來源與目的地位址必須能搭配來源與目的地的記憶體緩衝

20170821_Mentor_TA31F6

進一步說明更多的細節:我們建立了aes_c元件,為AES區塊上的運算建模。請注意,do_encrypt行動會佔用記憶體緩衝,而使我們將輸入資料的位址作為AES區塊的緩衝位址。membuf_s輸入上的限制是雙向的,所以當do_mem2mem_dma行動傳送資料給do_encrypt行動時,其限制迫使DMA鎖定AES元件。我們還利用了aes_c元件中的資源庫,指定在特定時間中的AES區塊上只能出現單一運算。

最後,指定一個元件來代表我們的系統,該系統指定了可用的資源(DMA和AES區塊),同時,我們還指定一個上層的行動來執行平行的DMA傳輸。請注意,我們僅擷取了想用於執行四個平行DMA運算的事實。這是一種局部的規範:無需指定資料應該從哪裡來,也不必指定資料應該去哪裡。PSS處理工具將會推論並連接至適當的行動,以確保產生正當情境。重點是:

  • 在四個平行傳輸中的每一個都發生在不同的DMA通道上;
  • 一次只能有一個運算鎖定AES區塊。

局部規範是一項功能非常強大的技巧,可從簡單、精簡的規範中產生複雜的測試情境。

SoC級的整合

在子系統級環境中,DMA傳輸仍是由序列而驅動的,我們能重複使用與UVM環境整合的相同方式,就像我們在區塊級環境中所做的一樣。在SoC級,測試將利用以C撰寫的公用程式功能來編程DMA。在許多案例中,這些公用程式功能將成為驅動程式常式的開始,其後則被用在OS驅動程式中。整合測試這些具有相同工具功能的常式,為這些工具常式以及實作硬體IP(如下指令)提供更高度的信心。

20170821_Mentor_TA31F7

就像在區塊級環境中一樣,核心PSS描述可擴展至環境指定的分層中。在此案例中,我們描述了會採用到的C API (wb_dma_drv_single_xfer),此外,也為do_dma行動提供對於exec區塊的定義,此行動將從DMA描述元中調用API以及傳送數值。

以可攜式激發向量提高生產力

可攜式激發向量工具有助於提升測試描述的層級並實現情境的建模,如果利用導引式、交易級的限制隨機測試來建立這些任務將是非常困難的。因此,它們可促進更多獨特測試的自動化任務。透過本文的範例說明,Accellera PSS輸入規範的特性能讓測試在不同的環境中重新利用,並讓描述的核心在不同環境中保持獨立。此外,隨機欄位與限制能夠輕鬆地從既有的SystemVerilog描述帶入,同時還能逐量地採用標準的關鍵元件,使其易於上手。

所以,下一次當你的驗證任務超出引導式或限制隨機測試的能力時,不妨考慮採用可攜式激發向量。