前言
在項目中,一個TB通常是很多人一起開發的,大家或多或少都會往log中打印一些信息(message),方便自己debug。但是如果log里信息太多,會造成自己感興趣的信息被淹沒了,只能通過關鍵字搜索的方式去查找。因此,本文推薦可以使用UVM提供的UVM_LOG功能,只需要增加少量的代碼,就可以根據ID或uvm_severity類別,把自己感興趣的信息單獨提取到指定的文件。
UVM_LOG機制
為了使用UVM_LOG功能,需要在打印message之前打開指定的文件,仿真結束時再關閉這個文件,并且需要把打開文件的句柄傳遞給UVM的message管理系統。可以將打開的文件設置為默認文件指向、或關聯到指定的uvm_severity或id,或兩者都關聯。
在uvm_report_object和uvm_component類里提供了接口函數給用戶去配置UVM_LOG功能,注意uvm_report_object是uvm_component的父類,因此大家只需要在uvm_component層次上調用這些接口函數就好了,而且可以控制UVM hierarchy上任何節點的消息打印行為。
具體的接口函數(API)分為兩類。
第一類是只適用于當前uvm_component層次的,也就是這些接口函數的配置不會影響到UVM hierarchy的其它任何節點,有這些函數:
set_report_default_file(UVM_FILE file); //設置默認輸出定向文件,如果id, severity都沒有關聯到輸出定
//向文件的話,那么就默認采用這里設置的文件。
set_report_id_file(string id, UVM_FILE file); //將id關聯到參數指定的輸出定向文件。
set_report_severity_file(uvm_severity severity, UVM_FILE file); //將severity關聯到參數指定的輸出
// 定向文件。
set_report_severity_id_file(uvm_severity severity, string id, UVM_FILE file); // 將severity
// 和id一起關聯到參數指定的輸出定向文件。
get_report_file_handle(uvm_severity severity, string id); // 返回指定severity和id的輸出定向文件句柄
這些函數參數中傳遞的文件句柄必須是multi-channel描述符(mcd)或與$fdisplay兼容的文件id。UVM_FILE類型其實就是int類型。如果上述接口函數對id或severity重復指定輸出定向文件句柄,那么它們優先級是set_report_severity_id_file() > set_report_id_file() > set_report_severity_file() > set_report_default_file()。
第二類是除了適用于當前uvm_component層次,它的子uvm_component也都全部適用,有這些函數:
set_report_default_file_hier(UVM_FILE file);
set_report_id_file_hier(string id, UVM_FILE file);
set_report_severity_file_hier(uvm_severity severity, UVM_FILE file);
set_report_severity_id_file_hier(uvm_severity severity, string id, UVM_FILE file);
可以看出,第二類接口函數的命令是在第一類接口函數命名后面加上”_hier”,對應的功能是類似,只是作用的uvm_component范圍不一樣。
例子
說了這么多,來幾個例子。
第一個例子,在uvm_component子類里加入以下代碼:
UVM_FILE log_fh = $fopen("cpu.log"); // 打印cpu.log的文件,并把句柄傳給log_fh
this.set_report_id_action("cpu", (UVM_DISPLAY | UVM_LOG)); // 將”cpu”的id加上UVM_LOG功能
this.set_report_id_file("cpu", log_fh); // 將“cpu”的id管理到log_fh文件句柄
`uvm_info("cpu", "The message will be logged in log file", UVM_LOW);
`uvm_info("cpu0", "The message will not be logged in log file", UVM_LOW);
$fclose(log_fh); // 關閉log_fh文件句柄
上述代碼執行完之后,將會在仿真目錄下生成1個名為cpu.log的文件,里面包含代碼里第一個uvm_info打印的消息” The message will be logged in log file”。代碼里第二個uvm_info的打印消息不會定向到cpu.log里,因為它的id是”cpu0”。
第二個例子,在uvm_component子類里加入以下代碼:
UVM_FILE log_fh = $fopen("cpu.log");
UVM_FILE default_fh = $fopen("default.log");
this.set_report_id_action("cpu" , (UVM_DISPLAY | UVM_LOG));
this.set_report_id_action("cpu0", (UVM_DISPLAY | UVM_LOG));
this.set_report_id_file("cpu", log_fh);
this.set_report_default_file(default_fh);
`uvm_info("cpu", "The message will be logged in cpu.log file", UVM_LOW);
`uvm_info("cpu0", "The message will be logged in default.log file", UVM_LOW);
$fclose(log_fh);
$fclose(default_fh);
上述代碼執行完之后,將會在仿真目錄下生成cpu.log和default.log兩個文件,第一個uvm_info的id為”cpu”,它只會定向到cpu.log,而不會定向到default.log,因為set_report_id_file()設置的文件句柄優先級高于set_report_default_file()設置的。第二個uvm_info的id為”cpu0”,它會定向到defualt.log,因為沒有顯示關聯到它的文件句柄,UVM會使用默認的文件句柄,也就是set_report_default_file()設置的defualt_fh(default.log)。
友情提示:
UVM_LOG功能需要用戶自己創建文件句柄并關聯到對應的id或severity上,因此用戶需要維護文件句柄的打開和關閉,建議可以在report_phase()里去統一關閉它們,如果提前關閉的話。
有趣的功能衍生
讀者可以考慮 將id與UVM的uvm_cmdline_processor或SV自帶的valueplusargs (user_string, variable)功能聯系起來 ,這樣通過Command Line可以很方便地控制要將哪些id定向到特定的log文件里, 這個功能很有用,也不需要重復編譯就可以去定向提取各式各樣的ID ,大家可以自己先去試試,需要源代碼的話在微信公眾號聊天窗口里輸入”id代碼”,兩種版本的代碼都有提供。
-
UVM
+關注
關注
0文章
182瀏覽量
19189
發布評論請先 登錄
相關推薦
評論