如何設置UVM的消息屬性
時間:2021-11-05 13:44:31
手機看文章
掃描二維碼
隨時隨地手機看文章
[導讀]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)行為。
b. 冗余控制
冗余控制主要通過設置全局的冗余度、組件的冗余度來調(diào)整消息的輸出。
全局控制:為了能夠給 testbench 全局的設置一個冗余等級,函數(shù) set_report_verbosity_level_hier()可以實現(xiàn)該功能。
一個更簡單的不需要重新編譯代碼的方法是使用 UVM 命令行處理器處理 UVM_VERBOSITY plusarg 參數(shù),如下所示:
函數(shù) set_report_verbosity_level()能夠?qū)崿F(xiàn)設置個別組件的最大冗余水平。
設置該組件中消息的冗余等級的最大值。這個函數(shù)還有一個分等級的版本,用來設置一個組件和其子組件的冗余等級。
通過 uvm_set_verbosity plusarg, UVM 命令行處理器也提供了更多細粒度的控制,該 plusarg 也用于組件層面和 ID 等級冗余控制。
期間的時間)的冗余情況。
c. 關(guān)聯(lián)行為控制
UVM 中能夠設置指定消息相關(guān)聯(lián)的行為,即可以設置該消息出現(xiàn)后testbench 的動作。指定消息的類型有以下幾類:同一組件下指定的 ID、同一組件下指定的嚴重度、同一組件下指定的嚴重度和 ID。
方法 1:
通過下面的函數(shù)來將某一類型的消息和特定的行為關(guān)聯(lián)起來。
通過 uvm_set_action plusarg, UVM 命令行處理器也提供了更多細粒度的控
制,該 plusarg 也用于組件層面和 ID 等級冗余控制。用 uvm_set_action 也可以設置相應 component 的屬性。
推薦使用`uvm_*()系列宏來處理報告的原因中最重要的是,當一個等級設置為消息無需被打印出來時,`uvm_info 宏在做任何字符串處理之前進行冗余等級檢查,這樣能夠提高仿真效率。下面看一個簡單的`uvm_info()語句:
不會執(zhí)行該條語句,從而不會浪費時間去進入$sformat()生成結(jié)果字符串。
`uvm_info 宏下面用 uvm_report_object::uvm_report_enabled()?API來做一個冗余等級的檢查,然后在調(diào)用和該宏使用同樣的參數(shù)的uvm_report_info()之前決定一個消息是否被打印。
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, string
filename = “”, 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ù)之前進行處理,這樣會降低仿真效率。