UVM糖果爱好者教程 - 34. 定制UVM 1.2中的消息格式

本文介绍如何使用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上查看并运行代码。
  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值