當前位置:首頁 > 公眾號精選 > 芯片驗證工程師
[導讀]a.輸出方式和屬性賦值UVM提供了四個函數(shù)來完成uvm框架內(nèi)不同嚴重度消息的輸出,同時通過函數(shù)定義了消息的冗余度、關(guān)聯(lián)ID和關(guān)聯(lián)行為。uvm_report_info(stringid,stringmessage,intverbosity=UVM_MEDIUM,stringfile...

a. 輸出方式和屬性賦值
UVM 提供了四個函數(shù)來完成uvm框架內(nèi)不同嚴重度消息的輸出,同時通過函數(shù)定義了消息的冗余度、關(guān)聯(lián) ID和關(guān)聯(lián)行為。

uvm_report_info(string id, string message, int verbosity = UVM_MEDIUM, string filename =“”, int line = 0);uvm_report_warning(string id, string message, int verbosity = UVM_MEDIUM, stringfilename = “”, int line = 0);uvm_report_error(string id, string message, int verbosity = UVM_LOW, string filename = “”,int line = 0);uvm_report_fatal(string id, string message, int verbosity = UVM_NONE, string filename = “”,int line = 0);上面四個函數(shù)都是 uvm_report_object 類和 uvm_sequence_item 類的成員函數(shù),因此在繼承自這兩個類的的 component 和 transaction 中都可以使用以下四個宏對應上面的四個函數(shù):

`uvm_info(string id, string message, int verbosity)`uvm_warning(string id, string message)`uvm_error(string id, string message)`uvm_fatal(string id, string message)上面宏在全局環(huán)境中都可以使用。注意:只有“info”消息能被等級設置屏蔽,“warning”,“error”和“fatal”消息將一直會打印出來,或者只能通過設置消息關(guān)聯(lián)的行為來關(guān)閉其輸出。


b. 冗余控制
冗余控制主要通過設置全局的冗余度、組件的冗余度來調(diào)整消息的輸出。
全局控制:為了能夠給 testbench 全局的設置一個冗余等級,函數(shù) set_report_verbosity_level_hier()可以實現(xiàn)該功能。

function?void?set_report_verbosity_level_hier(int?verbosity);當一個 testbench 模型調(diào)用該函數(shù)時,能夠設置整個 UVM testbench 的冗余等級。


一個更簡單的不需要重新編譯代碼的方法是使用 UVM 命令行處理器處理 UVM_VERBOSITY plusarg 參數(shù),如下所示:

vsim?testbench? UVM_VERBOSITY=UVM_HIGH細粒度控制:除了全局控制之外, UVM 允許在組件層面甚至在 ID 的層面單獨設置冗余水平。


函數(shù) set_report_verbosity_level()能夠?qū)崿F(xiàn)設置個別組件的最大冗余水平。

function?void?set_report_verbosity_level?(int?verbosity_level);uvm_report_object 類和 uvm_component 類的成員函數(shù)包括該函數(shù),用于
設置該組件中消息的冗余等級的最大值。這個函數(shù)還有一個分等級的版本,用來設置一個組件和其子組件的冗余等級。


通過 uvm_set_verbosity plusarg, UVM 命令行處理器也提供了更多細粒度的控制,該 plusarg 也用于組件層面和 ID 等級冗余控制。

uvm_set_verbosity=<comp>,<id>,<verbosity>,<phase> uvm_set_verbosity=<comp>,<id>,<verbosity>,time,<time>這兩個參數(shù)允許用戶在仿真階段巧妙的設置特定組件在特定時間段(在 run
期間的時間)的冗余情況。


c. 關(guān)聯(lián)行為控制
UVM 中能夠設置指定消息相關(guān)聯(lián)的行為,即可以設置該消息出現(xiàn)后testbench 的動作。指定消息的類型有以下幾類:

同一組件下指定的 ID、

同一組件下指定的嚴重度、

同一組件下指定的嚴重度和 ID。


方法 1:

通過下面的函數(shù)來將某一類型的消息和特定的行為關(guān)聯(lián)起來。

function?void?set_report_severity_id_override(uvm_severity?cur_severity,?string id,uvm_severity?new_severity?)function void set_report_severity_action (uvm_severity severity, uvm_action action)function void set_report_id_action (string id,uvm_action action)function?void?set_report_severity_id_action?(uvm_severity?severity,?string?id,uvm_action action)

function?void?set_report_severity_id_verbosity_hier(uvm_severity?severity,string?id,int verbosity)function void set_report_severity_action_hier ( uvm_severity severity,uvm_action action)function void set_report_id_action_hier (string id,uvm_action action)function?void?set_report_severity_id_action_hier(uvm_severity?severity,string?id,uvm_action action)上述的函數(shù)中 action 參數(shù)可以是 7 種關(guān)聯(lián)行為的一種或者其中幾種的組合。比如為了關(guān)閉組件 mycomp 中 id 為“MYTAG”,冗余級別為 UVM_ERROR的這類消息的輸出,可以添加如下命令:

mycomp.set_report_severity_id_action(UVM_ERROR, “MYTAG”,UVM_NO_ACTION);或者為了打印該消息同時退出仿真,則可以添加如下命令:

mycomp.set_report_severity_id_action(UVM_ERROR,?“MYTAG”,UVM_DISPLAY|UVM_EXIT);

方法 2:
通過 uvm_set_action plusarg, UVM 命令行處理器也提供了更多細粒度的控
制,該 plusarg 也用于組件層面和 ID 等級冗余控制。用 uvm_set_action 也可以設置相應 component 的屬性。

uvm_set_action=<comp>,<id>,<severity>,<action>關(guān)于性能的問題
推薦使用`uvm_*()系列宏來處理報告的原因中最重要的是,當一個等級設置為消息無需被打印出來時,`uvm_info 宏在做任何字符串處理之前進行冗余等級檢查,這樣能夠提高仿真效率。
下面看一個簡單的`uvm_info()語句:

`uvm_info("Message_ID",?$sformatf("%s,data[ ]=0xx",name,ii,data[ii]),UVM_HIGH)在該語句中包含一個相對復雜的語句$sforment,當$sformat()語句被重復調(diào)用時,需要占據(jù)足夠的仿真時間。當冗余等級被設置為 UVM_HIGH 時,大多數(shù)情

況下該$sformat()消息將不會打印。因為宏的使用,當該條消息不被打印時,將
不會執(zhí)行該條語句,從而不會浪費時間去進入$sformat()生成結(jié)果字符串。

`uvm_info 宏下面用 uvm_report_object::uvm_report_enabled()?API來做一個冗余等級的檢查,然后在調(diào)用和該宏使用同樣的參數(shù)的uvm_report_info()之前決定一個消息是否被打印。

if (uvm_report_enabled(UVM_HIGH, UVM_INFO, "Message_ID"))uvm_report_info("Message_ID",?$sformatf("%s,?data[ ]?=?0xx",?name,?ii,data[ii]),?UVM_HIGH);如果直接使用 uvm_report_info(),

uvm_report_info("Message_ID", $sformatf("%s, data[ ] = 0xx", name, ii, data[ii]),UVM_HIGH);即使最終該字符串在 UVM_HIGH 冗余設置下根本不會打印, $sformat()字符串仍將在整個 uvm_report_info()函數(shù)之前進行處理,這樣會降低仿真效率。

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
關(guān)閉
關(guān)閉