• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

SOC/IP验证工程师

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

factory机制的重载

任务与函数的重载
SystemVerilog是一种面向对象的语言。面向对象语言都有一大特征:重载。当在父类中定义一个函数/任务时,如果将其设置为virtual类型,那么就可以在子类中重载这个函数/任务:
重载的最大优势是使得一个子类的指针以父类的类型传递时,其表现出的行为依然是子类的行为。
factory机制最伟大的地方在于其具有重载功能。重载并不是factory机制的发明,前面已经介绍过的所有面向对象的语言都支持函数/任务重载,另外,SystemVerilog还额外支持对约束的重载。只是factory机制的重载与这些重载都不一样。
uvm_component函数

extern static function void set_type_override_by_type(uvm_object_wrapper original_type,
                                                      uvm_object_wrapper override_type,
                                                      bit replace=1);

这个函数有三个参数,其中第三个参数是replace,将会在下节讲述这个参数。在实际应用中一般只用前两个参数,第一个参数是被重载的类型,第二个参数是重载的类型。
有时候可能并不是希望把验证平台中的A类型全部替换成B类型,而只是替换其中的某一部分,这种情况就要用到set_inst_override_by_type函数。这个函数的原型如下:

extern function void set_inst_override_by_type(string relative_inst_path,
                                               uvm_object_wrapper original_type,
                                               uvm_object_wrapper override_type);

其中第一个参数是相对路径,第二个参数是被重载的类型,第三个参数是要重载的类型。
set_inst_override_by_type("env.o_agt.mon", my_monitor::get_type(), new_monitor::get_type());
无论是set_type_override_by_type还是set_inst_override_by_type,它们的参数都是一个uvm_object_wrapper型的类型参数,这种
参数通过xxx::get_type()的形式获得。

UVM还提供了另外一种简单的方法来替换这种晦涩的写法:字符串。与set_type_override_by_type相对的是set_type_override,它的原型是:

extern static function void set_type_override(string original_type_name,
                                              string override_type_name,
                                              bit replace=1);
set_type_override("bird", "parrot")

与set_inst_override_by_type相对的是set_inst_override,它的原型是:

extern function void set_inst_override(string relative_inst_path,
                                       string original_type_name,
                                       string override_type_name);
set_inst_override("env.o_agt.mon", "my_driver", "new_monitor")

如果在一个无法使用component的地方,如在top_tb的initial语句里,就无法使用。UVM提供了另外四个函数来替换上述的四个函数,这四个函数的原型是:

extern function
void set_type_override_by_type (uvm_object_wrapper original_type,
                                uvm_object_wrapper override_type,
                                bit replace=1);
extern function
void set_inst_override_by_type (uvm_object_wrapper original_type,
                                uvm_object_wrapper override_type,
                                string full_inst_path);
extern function
void set_type_override_by_name (string original_type_name,
                                string override_type_name,
                                bit replace=1);
extern function
void set_inst_override_by_name (string original_type_name,
                                string override_type_name,
                                string full_inst_path);

这四个函数都位于uvm_factory类中,其中第一个函数与uvm_component中的同名函数类似,传递的参数相同。第二个对应uvm_component中的同名函数,只是其输入参数变了,这里需要输入一个字符串类型的full_inst_path。这个full_inst_path就是要替换的实例中使用get_full_name()得到的路径值。第三个与uvm_component中的set_type_override类似,传递的参数相同。第四个函数对应uvm_component中的set_inst_override,也需要一个full_inst_path。

如何使用这四个函数呢?系统中存在一个uvm_factory类型的全局变量factory。可以在initial语句里使用如下的方式调用这四个函数:

initial begin
  factory.set_type_override_by_type(bird::get_type(), parrot::get_type());
end

在一个component内也完全可以直接调用factory机制的重载函数:
factory.set_type_override_by_type(bird::get_type(), parrot::get_type());
事实上,uvm_component的四个重载函数直接调用了factory的相应函数。

posted on 2022-09-17 19:13  SOC验证工程师  阅读(293)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3