通过控制component打印信息的行为,提高日志的可读性。
uvm_component 直接继承自uvm_report_object,所以component继承了一些设置report的函数。
打印信息的宏有:`uvm_info(id,mess,verbosity).
`uvm_warning(id,mess)
`uvm_error(id,mess)
`uvm_fatal(id,mess)
1. 设置信息冗余度阈值 verbosity level
冗余度等于低于阈值的信息可以打印出来,否则不会显示。uvm_verbosityUVM_NONEReport is always printed. Verbosity level setting can not disable it.
UVM_LOWReport is issued if configured verbosity is set to UVM_LOW or above.
UVM_MEDIUMReport is issued if configured verbosity is set to UVM_MEDIUM or above.
UVM_HIGHReport is issued if configured verbosity is set to UVM_HIGH or above.
UVM_FULLReport is issued if configured verbosity is set to UVM_FULL or above.1
2
3
4
5
6
7
8tyypedef enum{
UVM_NONE=0,
UVM_LOW=100,
UVM_MEDIUM=200,
UVM_HIGH=300,
UVM_FULL = 400,
UVM_DEBUG=500
} uvm_verbosity1
2$display("env's verbosity is %0d",env.get_verbosity_level());1
2
3// set_report_verbosity_level(UVM_LOW)
// 设置某个component的verbosity level
env.set_report_verbosity_level(UVM_HIGH);1
2// set_report_verbosity_level_hier(UVM_LOW)
// 递归设置1
2
3
4
5
6
7
8
9
10
11// set_report_id_verbosity("env",UVM_LOW)
//设置只打印某个id的报告,不是这个id的不打印
// 比如在env中有如下代码:
// `uvm_info("ID1","THIS IS ID1 UVM_LOW",UVM_LOW)
// `uvm_info("ID1","THIS IS ID1 UVM_HIGH",UVM_HIGH)
// `uvm_info("ID2","THIS IS ID2",UVM_LOW)
// 设置:
env.set_report_id_verbosity("env",UVM_LOW);
// 打印结果:
// THIS IS ID1 UVM_LOW
// 这个方法既对id进行过滤,也过滤verbosity level1// set_report_id_verbosity_hier("env",UVM_LOW)
也可以在仿真的时候添加仿真选项:1
2./simv +UVM_VERBOSITY=UVM_HIGH
// 为整个验证平台设置verbosity level
2. 重载打印信息严重性 severity
uvm有四种信息严重性:UVM_INFO
UVM_WARNING
UVM_ERROR
UVM_FATAL
这四种可以相互重载1
2
3// set_report_severity_override(UVM_WARNING,UVM_ERROR)
env.set_report_severity_override(UVM_WARNING,UVM_ERROR);
// 将env的UVM_WARNING设置成UVM_ERROR1
2// set_report_severity_id_override(UVM_WARNING,UVM_ERROR)
// 针对component的某个id起作用
也可以在仿真时候设置,设置选项如下:1+uvm_set_severity=,,,
使用:1./simv +uvm_set_severity="uvm_base_top.env,env,UVM_WARNING,UVM_ERROR"
2.1 观察打印信息1UVM_INFO my_env.sv(17) @ 0: uvm_test_top.env [my_env] my_env is created !!
上面是`uvm_info宏输出的信息:UVM_INFO: 信息severity
my_env.sv(17): code中的位置
@ 0: 仿真事件
uvm_test_top.env : 层次路径
[my_env]: 设置的id
my_env is created !!:要打印的信息
3. 错误信息到一定数量结束仿真
当UVM_FATAL发生时,立即结束仿真;但UVM_ERROR则需要到了一定数量才会结束仿真。
可以设置达到几个error就结束仿真。1
2
3
4
5
6// set_report_max_quit(5)
function void base_test::build_phase(uvm_phase phase);
super.build_phase(phase);
env = my_env::type_id::create("env", this);
set_report_max_quit_count(5); //5个ERROR结束仿真 $finish
endfunction
也可以在仿真选项中设置:1
2./simv +UVM_MAX_QUIT_COUNT=5,NO
// NO表示这个值不可以被后面的设置语句覆盖1
2
3//get_max_quit_count()
// 返回int值,表示当前的最大推出值
// 如果返回0,表示无论多少个error都不会结束仿真
4. 设置计数目标
上一节中UVM_ERROR到达一定值后结束仿真,也可以把UVM_WARNING也加入计数目标,error和warning的达到最大值就退出仿真。1
2
3// function void set_report_severity_action (uvm_severity severity,uvm_action action)
env.set_report_severity_action(UVM_WARNING,UVM_DISPLAY|UVM_COUNT);
// 将UVM_WARNING也加入到计数中。1// function void set_report_severity_action_hier (uvm_severity severity,uvm_action action)
也可以针对某个ID计数1
2//function void set_report_id_action (string id,uvm_action action)
//function void set_report_id_action_hier (string id,uvm_action action)
也可把id和severity联合起来进行设置1
2// function void set_report_severity_id_action (uvm_severity severity,string id,uvm_action action)
// function void set_report_severity_id_action_hier (uvm_severity severity,string id,uvm_action action)uvm_actiondescriptionUVM_NO_ACTIONNo action is taken
UVM_DISPLAYSends the report to the standard output
UVM_LOGSends the report to the file(s) for this (severity,id) pair
UVM_COUNTCounts the number of reports with the COUNT attribute. When this value reaches max_quit_count, the simulation terminates
UVM_EXITTerminates the simulation immediately.
UVM_CALL_HOOKCallback the report hook methods
UVM_STOPCauses $stop to be executed, putting the simulation into interactive mode.
5. UVM断点
执行到断点,停止仿真。
设置出现UVM_WARNING的时候停止仿真:1env.set_report_severity_action(UVM_WARNING,UVM_DISPLAY|UVM_STOP);
6. 将输出信息写入到文件1
2
3
4
5
6function void set_report_severity_file (uvm_severity severity,UVM_FILE file)
function void set_report_id_file (string id,UVM_FILE file)
function void set_report_severity_id_file (uvm_severity severity,string id,UVM_FILE file)
function void set_report_severity_file_hier (uvm_severity severity,UVM_FILE file)
function void set_report_id_file_hier (string id,UVM_FILE file)
function void set_report_severity_id_file_hier (uvm_severity severity,string id,UVM_FILE file)
6.1 将不同severity的信息打印到不同的文件中。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38// 创建文件句柄
// 写入方式打开文件
//为不同severity设置保存文件
//设置打印的行为UVM_LOG
UVM_FILE info_log; // 创建文件句柄
UVM_FILE warning_log;
UVM_FILE error_log;
UVM_FILE fatal_log;
virtual function void connect_phase(uvm_phase phase);
info_log = $fopen("info.log", "w"); // 写入方式打开文件
warning_log = $fopen("warning.log", "w");
error_log = $fopen("error.log", "w");
fatal_log = $fopen("fatal.log", "w");
env.i_agt.drv.set_report_severity_file(UVM_INFO, info_log);//为不同severity设置保存文件
env.i_agt.drv.set_report_severity_file(UVM_WARNING, warning_log);
env.i_agt.drv.set_report_severity_file(UVM_ERROR, error_log);
env.i_agt.drv.set_report_severity_file(UVM_FATAL, fatal_log);
env.i_agt.drv.set_report_severity_action(UVM_INFO, UVM_DISPLAY | UVM_LOG);//设置打印的行为UVM_LOG
env.i_agt.drv.set_report_severity_action(UVM_WARNING, UVM_DISPLAY | UVM_LOG);
env.i_agt.drv.set_report_severity_action(UVM_ERROR, UVM_DISPLAY | UVM_COUNT | UVM_LOG);
env.i_agt.drv.set_report_severity_action(UVM_FATAL, UVM_DISPLAY | UVM_EXIT | UVM_LOG);
//env.i_agt.set_report_severity_file_hier(UVM_INFO, info_log);
//env.i_agt.set_report_severity_file_hier(UVM_WARNING, warning_log);
//env.i_agt.set_report_severity_file_hier(UVM_ERROR, error_log);
//env.i_agt.set_report_severity_file_hier(UVM_FATAL, fatal_log);
//env.i_agt.set_report_severity_action_hier(UVM_INFO, UVM_DISPLAY| UVM_LOG);
//env.i_agt.set_report_severity_action_hier(UVM_WARNING, UVM_DISPLAY| UVM_LOG);
//env.i_agt.set_report_severity_action_hier(UVM_ERROR, UVM_DISPLAY| UVM_COUNT | UVM_LOG);
//env.i_agt.set_report_severity_action_hier(UVM_FATAL, UVM_DISPLAY| | UVM_EXIT | UVM_LOG);
endfunction
virtual function void final_phase(uvm_phase phase);
$fclose(info_log);
$fclose(warning_log);
$fclose(error_log);
$fclose(fatal_log);
endfunction
6.2 将不同id的信息打印到不同的文件中。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18UVM_FILE driver_log;
UVM_FILE drv_log;
virtual function void connect_phase(uvm_phase phase);
driver_log = $fopen("driver.log", "w");
drv_log = $fopen("drv.log", "w");
env.i_agt.drv.set_report_severity_id_file(UVM_WARNING, "my_driver", driver_log);
env.i_agt.drv.set_report_severity_id_file(UVM_INFO, "my_drv", drv_log);
env.i_agt.drv.set_report_id_action("my_driver", UVM_DISPLAY| UVM_LOG);
env.i_agt.drv.set_report_id_action("my_drv", UVM_DISPLAY| UVM_LOG);
//env.i_agt.set_report_severity_id_file_hier(UVM_WARNING, "my_driver", driver_log);
//env.i_agt.set_report_severity_id_file_hier(UVM_INFO, "my_drv", drv_log);
//env.i_agt.set_report_id_action_hier("my_driver", UVM_DISPLAY| UVM_LOG);
//env.i_agt.set_report_id_action_hier("my_drv", UVM_DISPLAY| UVM_LOG);
endfunction
virtual function void final_phase(uvm_phase phase);
$fclose(driver_log);
$fclose(drv_log);
endfunction
7. 信息的打印行为 action
前面大都是通过设置action来控制打印信息。uvm_actiondescriptionUVM_NO_ACTIONNo action is taken
UVM_DISPLAYSends the report to the standard output
UVM_LOGSends the report to the file(s) for this (severity,id) pair
UVM_COUNTCounts the number of reports with the COUNT attribute. When this value reaches max_quit_count, the simulation terminates
UVM_EXITTerminates the simulation immediately.
UVM_CALL_HOOKCallback the report hook methods
UVM_STOPCauses $stop to be executed, putting the simulation into interactive mode.1
2
3
4
5
6
7
8
9
10typedef enum
{
UVM_NO_ACTION = 'b000000,
UVM_DISPLAY = 'b000001,
UVM_LOG = 'b000010,
UVM_COUNT = 'b000100,
UVM_EXIT = 'b001000,
UVM_CALL_HOOK = 'b010000,
UVM_STOP = 'b100000
} uvm_action_type;
8. 打印UVM树结构1uvm_top.print_topology();
可以把它写在base_test中1
2
3
4function void base_test::report_phase(uvm_phase phase);
super.report_phase(phase);
uvm_top.print_topology();
endfunction
打印输出1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25UVM_INFO @ 43550000: reporter [UVMTOP] UVM testbench topology:
------------------------------------------------------------------
Name Type Size Value
------------------------------------------------------------------
uvm_test_top case0 - @460
env enviroment - @468
agt2mdl uvm_tlm_analysis_fifo #(T) - @492
analysis_export uvm_analysis_imp - @536
get_ap uvm_analysis_port - @527
get_peek_export uvm_get_peek_imp - @509
put_ap uvm_analysis_port - @518
put_export uvm_put_imp - @500
i_agt agent - @480
drv driver - @545
rsp_port uvm_analysis_port - @562
seq_item_port uvm_seq_item_pull_port - @553
mon_apb monitor_apb - @694
ap uvm_analysis_port - @702
sqr sequencer - @571
rsp_export uvm_analysis_export - @579
seq_item_export uvm_seq_item_pull_imp - @685
arbitration_queue array 0 -
lock_queue array 0 -
num_last_reqs integral 32 'd1
num_last_rsps integral 32 'd1