1. 程式人生 > >一種自動編寫UVM testbench的方法

一種自動編寫UVM testbench的方法

本文轉自:http://www.eetop.cn/blog/html/28/1561828-437619.html

SystemVerilog UVM 是一個以SystemVerilog類庫為主體的驗證平臺開發框架,驗證工程師可以利用其可重用元件構建具有標準化層次結構和介面的功能驗證環境。UVM方法的強大是毋庸置疑的,但同時UVM卻也不是那麼容易掌握的。對於沒有UVM經驗的工程師,直接使用UVM方法還是比較困難的。

但是幸運的是,你可以在網上找到一些UVM模板和UVM生成器。它們都是一些基於UVM庫的UVM框架。使用這些模板或者生成器的好處在於,在一開始你並不需要知道關於UVM的所有細節,當然,在此之前還是需要懂得SystemVerilog知識和UVM基本驗證環境。所以,本文面向的是沒有UVM驗證經驗的工程師。著重介紹了一個簡單的模板和生成器,經過一些簡單的修改,只需要在一個工作日內,一個新的基於UVM的testbench就建立並且能夠正常執行起來了。

下圖是一個理想的生成器

 

模板當然不是完全自動化的,根據你的特定需求,你需要在其中描述定義你的transaction、匯流排、driver和monitor的連線等。你必須要設計你的測試用例的產生方法,比如怎樣測試多個介面等,可能還需要編寫“golden model”。這些工作都會要求你在生成器所產生的樣板檔案中修改完成。雖然不需要懂UVM的細節,但是SystemVerilog還是必不可少。

基本的UVM Testbench

最基本的UVM testbench包含有 DUT、用於介面的agent、把所有agents收集到一起的environment和一個頂層的test。DUT和基於類的testbench間是使用virtual interface連線的。下圖是一個有三個介面的簡單DUT模型(其中一個並沒有連線)。下面的UVM模板也是基於這個DUT模型展開的。

 

模板

模板並不是唯一的,不同的模板有不同的特性,沒有正確的模板,只有合適的模板。模板系統本身是可獨立執行的,即該模板可以被獨立編譯、模擬。對於一個可編譯可模擬的系統,建立的模板bug較少。這篇文章介紹的模板簡單普通,包含了共計500行程式碼的20個檔案。生成器的指令碼如下所示。

 

上面使用了tar命令為agent建立一個層級,然後處理新層級裡的所有檔案內容,使用sed把一般的模板名轉換為特定的名字(即體現在我們自己具體設計中的名字),例如下面的這個sequencer模板

 

會被轉化為下面的sequencer類

 

Transaction

Transaction用於描述你要與DUT之間進行怎樣的互動聯絡。一個工程了裡會有很多Transaction,諸如讀寫事務、暫存器事務和匯流排事務等。下面是一個包含有地址和資料的讀寫事務。

 

匯流排

各種訊號都要經過匯流排,這裡主要講的是匯流排的介面。所有生成的agent都會連線virtual interface,用於採集訊號。使用如下方式定義

 

除了上面的這種介面,這種模板還有一種介面,就是帶有驅動和監視匯流排功能的BFM(Bus Function Model匯流排功能模型)。定義方式如下:

 

Agent

Agent是包含了driver, monitor 和sequencer的容器,其目的是連線這些元件。把所有的元件放在一起,使用一個介面驅動和監視匯流排事務。下圖是一個ABC agent的結構。

 

Driver

Driver只負責驅動transaction,transaction是在sequence中產生的,所以driver 要向sequence提出請求,並通過匯流排傳送請求。每一個driver 都有特定的協議。下面是driver的模板程式碼。

 

Monitor 

Monitor 用於監視總線上的活動,每當識別出一個事務,就會例項化一個transaction物件,並且通過分析埠送出,分析埠一般連線了一個scoreboard 。scoreboard 會檢視處理transaction的正確性或者將其儲存下來。下面是monitor 的模板程式碼。

 

 Sequence

UVM sequence 是一塊簡單的軟體程式碼,用於生成供driver 執行的transaction,例如下圖中的名為boby的task產生的transaction,先呼叫了start_item()語句(旨在獲取在driver裡執行的許可權,就像呼叫wait_for_grant()一樣),然後隨機化名為tx的transaction,最後執行finish_item語句(實際用於通知driver開始驅動transaction)。所以基本的步驟應該是包括:建立、等待許可、隨機化、執行。

 

再比如下面的sequence程式碼,用於在兩個地址間產生10000個讀寫transaction。

 

另外為了建立不同的地址,我們還要建立一個新的sequence,我們可以直接從上面的sequence類派生,加上新的約束(這裡的約束是保證地址都是偶數),就得到了新的sequence類。

 

Environment

Environment也是一個容器,有點像agent,不過一般environment是包含了agent的。environment用於建立agent,以及設定連線到DUT的virtual interface。下面是一個環境的配置。

 

Test

Test即測試用例。Test本身也是一種元件,我們是在測試用例程式碼裡實例化的environment,並且在測試用例中開啟sequence。不同的測試用例會開啟不同的squence,例如在一個有三個介面的DUT中,test就會啟動3種不同的sequence。在不同的介面上,測試DUT不同的行為。在一個test上,我們只需要例項化好environment並開啟sequence,test就可以自行開啟測試模擬。

 

 其餘的部分

在一個UVM testbench中,還可能有許多其他元件,例如“analysis components”。analysis components就是諸如predictor、scoreboard、checkers 之類的元件。每一個對應的元件就有相應特定的工作。我們這裡所用的簡單模板,只用到了簡單的scoreboard。

DUT必須要連線到testbench上。top模組上例項化了介面和DUT封裝。DUT封裝例項化了DUT和連線到DUT管腳上的SystemVerilog介面訊號。Test top中例項化BFM,並開啟UVM test,具體可見以下程式碼。

下面這個簡單的Top模組例項化了匯流排(訊號都要連線到DUT上)和DUT封裝,並且設定了時鐘訊號。

 

DUT封裝把介面對映到管腳上

 

Test_top的功能比較簡單,在這個模組例項化了BFM interface。driver 和monitor會使用BFM interface傳送或接收匯流排資料。test_top模組把BFM interface儲存在全域性資料庫中,可以根據名字進行搜尋呼叫。最後test top模組呼叫run_test()開始UVM test。

 

結論:

使用UVM方法會使驗證效率會得到巨大提升。但是短時間全面學習UVM是比較費勁的。尋求其他外界資源的幫助費時費錢,使用模板系統就簡單便捷多了。但是模板也不是萬能的,你至少還是要熟悉SystemVerilog程式碼,能根據特殊的協議和DUT的功能自己修改編寫一些程式碼。

好的模板要短而精,產生器要簡單易懂,我們這個模板就是,只用了共計約500行程式碼的20個檔案,產生器用了不到50行程式碼。如果你在不精通UVM的情況下需要完成驗證工作,就從類似的模板開始吧!