作為一名DV,開發驗證環境,編寫驗證環境也算是必備基礎技能了。雖然每天都會coding,但最終寫出來的代碼,是一次性代碼,還是方法?
何為一次性代碼?可以從復用性考慮。
代碼的復用可大可小。IP驗證內部,寫出的代碼是否可以在不同case間復用,還是僅針對具體的需求,點對點地寫代碼。一個簡單的例子就是,不同case的實現,是在不停地復制粘貼,還是精簡的實現;不同case的仿真,是否需要重新編譯驗證環境。
system或者soc驗證時,寫出的case是否可以方便地移植或者為他人所使用。一個長達數百行,for/if/while/fork來回嵌套的函數,大概率會直接打消大家review的念頭。其大概率也是一次性代碼,復用性不高。
一次性代碼和方法的區別,換個角度看,也是是驗證環境的靜態和動態性的一種體現。如果環境中的某些參數或者特性在編譯階段就已經確定,可認為是靜態性的。如果某些參數或者code執行在運行時才會確定,則是動態性的,即runtime。
使用動態性的代碼,可以使得驗證環境具備較好的靈活性。盡可能少的重新編譯環境,盡可能高效的debug case,在芯片規模較大時顯得尤為重要。尤其在使用一些如增量編譯,MSIE(multi snapshot incremental elaboration),simulation based snapshot方法時,對環境結構和靈活性的要求會更高。這里分享一些靜態式和動態式的例子和思路。
ifdef/ifndef雙刃劍
條件編譯宏在環境開發中經常會使用到,作者此前也分享過相關的總結,讀者可參閱:SystemVerilog Macro宏使用場景小結。
testbench中的env部分盡量減少使用條件編譯宏。比如下面的例子:
在環境部分使用ifdef/ifndef,就意味著在不同的場景下,需要重新編譯環境,是一種靜態式的思路。
去除ifdef/ifndef,可以使用configuration來實現,根據config的結果來決定要不要例化或者啟動某個組件。
用好plusargs
既然是runtime,動態式,那就從仿真命令中獲取數據好了。plusargs有兩個函數,plusargs和plusargs。前者檢測是否有制定了某個參數,后者用于獲取命令行輸入的參數值。
使用plusargs,可以在仿真前指定某個參數的取值,如時鐘頻率、module選擇、仿真超時域值等。甚至可以從plusargs中傳入對隨機參數的約束!而且UVM庫中也有uvm_cmdline_processor,用于處理命令行的輸入參數。同樣的,前面去除ifdef/ifndef的事情,也可以用plusargs來解決。
plusarg的使用可謂"五花八門"。如果后面有機會,作者也會做類似的分享,有興趣的讀者可私信交流和學習。總之,用好plusargs可以在case的調試時,帶來效率上的提升。
需求一直在變,做好數據驅動
不直接面向具體的數據編寫代碼,而是編寫對數據的處理和操作方法。比如環境中需要對A0~A9寄存器進行配置,以完成DUT的初始化,或者需要對某些信號進行force和check。需求變化和明天,不知道哪個會先來,雖然今天的需求是配置A0~A9, force a0~a9,明天可能就是變成B0~B9。
這里就可以做好通用的寄存器配置方法,需要配置的寄存器從plusargs或者配置文件中導入,而不是看到具體的A0或者B0寄存器。需要force和check的信號,可以從文件中導入,環境中編寫從force到check的邏輯方法。
數據驅動中,聯合數組是一個比較好的數據結構,在其他語言中也稱為哈希數組或者字典。這種數據結構有key和value兩個屬性,你所需要的信息可以設置到key和value上,而不用關心key和value具體是什么,是數據驅動的天然好幫手。比如只使用一個int cfg[string]類型的聯合數組作為函數的入參,就可以實現多個參數的配置傳遞,具體的配置參數名體現在cfg的string類型的key中,參數取值體現在cfg的int類型的value中。
審核編輯:劉清
-
處理器
+關注
關注
68文章
19336瀏覽量
230197 -
寄存器
+關注
關注
31文章
5357瀏覽量
120619 -
SoC芯片
+關注
關注
1文章
613瀏覽量
34947 -
UVM
+關注
關注
0文章
182瀏覽量
19185 -
DUT
+關注
關注
0文章
189瀏覽量
12417
原文標題:編寫動態的驗證環境
文章出處:【微信號:處芯積律,微信公眾號:處芯積律】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論