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

SOC/IP验证工程师

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

公告

View Post

UVM中uvm_object和uvm_component的不同

uvm_void :是始祖类,人如其名,其中不包含任何函数和类
uvm_obect :
比较基础的类,包含一些比较基础的常用函数,如 Copy 函数、Clone 函数、Compare 函数、Print 函数
可以在环境任一位置创建和销毁
uvm_component :
uvm_component 类继承于 uvm_object
uvm 组件类,继承于该类的子类,用于构成 UVM 环境( uvm_tree ),如uvm_driver、uvm_montior 、uvm_env 和 uvm_scoreboard,其他几个组件在后续讲述过程中将会全部涉及。
包含一些列方法,如 factory 系列、phase 系列、 report 系列、 hierarchy 系列和全部的 uvm_object 类的方法
  a. hierarchy系列:可以用于遍历和查找组件成员
  b. phase 系列:这是 uvm_component 组件中最重要的函数,如 build_phase,connect_phase 等这些函数为 UVM 默认创建的空函数,需由用户自主填写内容,并按照一定的顺序自动执行。
  c. repost 系列:提供了一些列方便的函数,用于输出打印信息
  d. factory 系列:用于创建或者覆盖类型或者实例
uvm_component 的特点是,必须在 build_phase 中实例化,如果在其他地方实例化,会报错。
  为了构建 uvm_tree 结构,uvm_component 的实例化具有它自己的特色,需要采用 create(最常用)创建, 原码如下:

//uvm_object
static function T create(string name , uvm_component parent = null, string context="");
//uvm_component
static function T create(string name , uvm_component parent , string context="");

uvm_object 在实例化过程中,可以指定parent组件,也可以不指定;但是 uvm_component在实例化过程中必须指定,只有指定了 parent 组件,该子 compoent 才能成功的挂载于 uvm_tree 中。

uvm_object 与 uvm_component 的区别:
uvm_component 继承于 uvm_object,包含一些 uvm_objection 没有的特性和函数,如phase系列函数
uvm_component 必须通过 create 创建,uvm_objection 可以采用 new/create 创建
uvm_component 存在于验证的整个过程中,其中存在的组任何组件( component )均不会被析构(释放内存空间),uvm_object 可以在验证的过程中任何时刻被实例化和析构
为了使用uvm_object和uvm_component自带的函数和机制,我们需要把我们继承类均注册到一张表格中,这张表格主要为了方便替换验证环境中已有的实例或者已注册的类型,我们把这些称为工厂机制(factory ),这个过程称为注册。
简单一句话总结:注册机制是为了更加灵活的配置验证环境

2.uvm_object 类注册:
uvm_object_utils : 用于把一个直接或者间接派生自 uvm_object 的类注册到 factory;
uvm_object_param_utils : 用于把一个直接或者间接派生自 uvm_object 的参数化的类注册到 factory
参数化类,形如
class A#(int WIDTF=32) extend uvm_obejct
uvm_object 类及其成员注册:
uvm_object_utils_begin : (类) ... uvm_object_utils_end
uvm_object_param_utils_begin : (类) ... uvm_object_param_utils_end
只有将成员变量注册后,使用 Copy 函数、Clone 函数、Compare 函数、Print 函数才能有效。
常用的变量的注册有以下几种;

`define uvm_field_int(ARG,FLAG)
`define uvm_field_real(ARG,FLAG)
`define uvm_field_enum(T,ARG,FLAG)
`define uvm_field_object(ARG,FLAG)
`define uvm_field_string(ARG,FLAG)
`define uvm_field_queue_enum(ARG,FLAG)
`define uvm_field_queue_int(ARG,FLAG)
`define uvm_field_queue_object(ARG,FLAG)

3.uvm_component 类注册
uvm_component_utils: 用于把一个直接或者间接派生自 uvm_component 的类注册到 factory;
uvm_component_param_utils:用于把一个直接或者间接派生自 uvm_component 的参数化的类注册到 factory
uvm_component 类及其成员注册:
uvm_component_utils_begin: (类) ... uvm_component_utils_end
uvm_component_param_utils_begin: (类) ... uvm_component_param_utils_end
  只有将 uvm_component 类注册到 factory 后,才能使用一些 component 重要的机制,那为什么要将 comonpent 的成员也注册呢,是为了使用 copy 等函数么?但是对 component 组件进行 copy 等操作意义不大。比较容易想到的问题,复制的组件的父类是谁(专业一点说就是 parent 无法指定),两个相同的组件又有什么用呢,啥用也没有。其实它的最大的意义在于自动使用 config_db 来获取某些变量的值。

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

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