本文介绍如何使用UVM 1.2自定义消息格式。
步骤0 - 默认格式
在更改消息格式之前,让我们看看在使用uvm_info宏时默认输出的外观:
UVM_INFO testbench.sv(86) @ 0: reporter [top] This is a message from top.
UVM_INFO testbench.sv(41) @ 0: uvm_test_top.my_env_h [my_env] This is a message from my_env.
UVM_INFO testbench.sv(71) @ 0: uvm_test_top [my_test] This is a message from my_test.
第1步 - 定义你的格式
在UVM 1.2之前在UVM 1.2之前,我们重载了uvm_report_server类的compose_message函数来定制消息格式。对于那些仍然使用UVM旧版本的用户,例如UVM 1.1d,请参阅定制UVM信息格式以获取更多详细信息。
class my_report_server extends uvm_report_server; // prior to UVM 1.2
virtual function string compose_message( uvm_severity severity,
string name,
string id,
string message,
string filename,
int line );
uvm_severity_type severity_type = uvm_severity_type'( severity );
return $psprintf( "%-8s | %16s | %2d | %0t | %-21s | %-7s | %s",
severity_type.name(), filename, line, $time, name, id, message );
endfunction: compose_message
endclass: my_report_server
UVM 1.2
UVM 1.2引入了一个名为uvm_report_message的新类,它为所有消息提供了公共字段。
第一步是定义您的自定义格式。这是通过重载uvm_default_report_server类的compose_report_message函数完成的。
在UVM 1.2中,uvm_report_server成为虚拟类。我们使用uvm_default_report_server作为uvm_report_server的子类,并提供report server的默认实现,并作为基类。
我创建了my_report_server类来定义compose_report_message函数。该函数从uvm_report_message对象构造消息字符串。第11行和第12行定义了实际的格式。请注意,uvm_severity是UVM 1.2中的一个枚举,因此我们在UVM 1.2(上面的第8行)之前执行的投射不再需要。
class my_report_server extends uvm_default_report_server;
virtual function string compose_report_message( uvm_report_message report_message,
string report_object_name = "" );
uvm_severity severity = report_message.get_severity();
string name = report_message.get_report_object().get_full_name();
string id = report_message.get_id();
string message = report_message.get_message();
string filename = report_message.get_filename();
int line = report_message.get_line();
return $sformatf( "%-8s | %16s | %2d | %0t | %-21s | %-7s | %s",
severity.name(), filename, line, $time, name, id, message );
endfunction: compose_report_message
endclass: my_report_server
第2步 - 使用您的格式
第二步是用my_report_server替换uvm_default_report_server。 uvm_default_report_server是一个全局服务器,它处理由uvm_report_handler生成的所有报告,而uvm_report_handler又是uvm_report_object委派大多数方法的类。
这里是我用来替换服务器的程序。首先,实例化my_report_server(第4行)。其次,使用uvm_report_server的静态函数(第7行)将my_server设置为全局report server。我使用my_test类的start_of_simulation_phase函数来更改格式,但这取决于您在何处进行。
class my_test extends uvm_test;
// ...
function void start_of_simulation_phase( uvm_phase phase );
my_report_server my_server = new;
super.start_of_simulation_phase( phase );
uvm_report_server::set_server( my_server );
endfunction: start_of_simulation_phase
endclass: my_test
第3步 - 查看您的新格式
我们来看看新输出的外观:
UVM_INFO testbench.sv(86) @ 0: reporter [top] This is a message from top.
UVM_INFO | testbench.sv | 41 | 0 | uvm_test_top.my_env_h | my_env | This is a message from my_env.
UVM_INFO | testbench.sv | 71 | 0 | uvm_test_top | my_test | This is a message from my_test.
第一行仍使用默认格式。这是因为在更换报表服务器之前显示的消息。这也表明可以即时更改消息格式。
我希望这有帮助。
您可以在EDA Playground上查看并运行代码。