UVM工厂机制宏定义和类定义、方法、变量定义

// 定义一个宏,用于指定 UVM 核心服务类的类型
ifndef UVM_CORESERVICE_TYPE
  `define UVM_CORESERVICE_TYPE uvm_default_coreservice_t
endif

// 定义一个类型别名,用于简化对 UVM 核心服务类的引用
typedef class `UVM_CORESERVICE_TYPE;

// 定义一个虚类 `uvm_coreservice_t`,它是 UVM 核心服务的基类
virtual class uvm_coreservice_t;
  // 定义一个静态变量 `inst`,用于存储 UVM 核心服务对象的实例
  local static `UVM_CORESERVICE_TYPE inst;

  // 定义一个静态函数 `get`,用于获取 UVM 核心服务对象的实例
  static function uvm_coreservice_t get();
    // 如果 `inst` 为空,则创建一个新的 UVM 核心服务对象
    if (inst == null)
      inst = new;
    // 返回 `inst` 对象
    return inst;
  endfunction // get

endclass

// 定义一个类 `uvm_default_coreservice_t`,它是 UVM 核心服务的默认实现
class uvm_default_coreservice_t extends uvm_coreservice_t;
  // 定义三个私有成员变量,分别用于存储 UVM 工厂、事务数据库和报告服务器对象
  local uvm_factory factory;
  local uvm_tr_database tr_database;
  local uvm_report_server report_server;

  // 定义一个虚函数 `get_factory`,用于获取 UVM 工厂对象
  virtual function uvm_factory get_factory();
    // 如果 `factory` 为空,则创建一个新的 UVM 工厂对象
    if (factory == null) begin
      // 创建一个新的 UVM 默认工厂对象
      uvm_default_factory f;
      f = new;
      // 将 `f` 对象赋值给 `factory`
      factory = f;
    end
    // 返回 `factory` 对象
    return factory;
  endfunction

endclass

代码功能解析:

这段代码定义了 UVM 核心服务的实现,包括基类 uvm_coreservice_t 和默认实现类 uvm_default_coreservice_t。

  1. uvm_coreservice_t 类:

它是 UVM 核心服务的基类,定义了获取 UVM 核心服务对象的静态函数 get。

使用 UVM_CORESERVICE_TYPE 宏来定义核心服务类的类型,默认情况下使用 uvm_default_coreservice_t。

使用静态变量 inst 来存储核心服务对象的实例,并使用 get 函数来获取该实例。

  1. uvm_default_coreservice_t 类:

它是 UVM 核心服务的默认实现,继承自 uvm_coreservice_t。

定义了三个成员变量:factory、tr_database 和 report_server,分别用于存储 UVM 工厂、事务数据库和报告服务器对象。

定义了 get_factory 函数,用于获取 UVM 工厂对象。如果 factory 为空,则创建一个新的 UVM 默认工厂对象,并将其赋值给 factory。

工作原理:

UVM 核心服务类提供了一组核心服务,例如工厂、事务数据库和报告服务器,用于管理 UVM 组件和对象。

uvm_coreservice_t 类是一个虚类,它定义了获取 UVM 核心服务对象的接口。

uvm_default_coreservice_t 类是 UVM 核心服务的默认实现,它提供了 UVM 工厂、事务数据库和报告服务器的默认实现。

UVM 使用 uvm_coreservice_t 类来管理 UVM 核心服务,并使用 uvm_default_coreservice_t 类来提供 UVM 核心服务的默认实现。

使用场景:

UVM 组件和对象可以使用 uvm_coreservice_t::get() 函数来获取 UVM 核心服务对象,然后使用该对象来访问 UVM 核心服务,例如创建组件、注册对象、记录事务和报告错误。

总结:

这段代码定义了 UVM 核心服务的实现,包括基类 uvm_coreservice_t 和默认实现类 uvm_default_coreservice_t。UVM 核心服务类提供了一组核心服务,用于管理 UVM 组件和对象。

class uvm_component_registry #(type T=uvm_component, string Tname="<unknown>") extends uvm_object_wrapper;
  // 定义一个类型别名 "this_type",用于简化代码,方便使用 "uvm_component_registry" 类型
  typedef uvm_component_registry #(T, Tname) this_type;

  // 定义一个常量字符串 "type_name",用于存储组件的类型名称
  const static string type_name = Tname;

  // 定义一个虚函数 "get_type_name",用于获取组件的类型名称
  virtual function string get_type_name();
    // 返回组件的类型名称
    return type_name;
  endfunction

  // 定义一个静态变量 "me",类型为 "this_type",用于存储当前注册的 "uvm_component_registry" 对象
  local static this_type me = get();

  // 定义一个静态函数 "get",用于获取当前注册的 "uvm_component_registry" 对象
  static function this_type get();
    // 如果 "me" 为空,则创建一个新的 "uvm_component_registry" 对象
    if (me == null) begin
      // 获取 UVM 核心服务对象
      uvm_coreservice_t cs = uvm_coreservice_t::get();
      // 获取 UVM 工厂对象
      uvm_factory factory=cs.get_factory();
      // 创建一个新的 "uvm_component_registry" 对象
      me = new;
      // 在 UVM 工厂中注册 "me" 对象
      factory.register(me)
    end
    // 返回 "me" 对象
    return me;
  endfunction

  // 定义一个静态函数 "create",用于创建指定类型的组件
  static function T create(string name, uvm_component parent, string contxt="");
    // 定义一个 "uvm_object" 类型的变量 "obj",用于存储创建的组件对象
    uvm_object obj;
    // 获取 UVM 核心服务对象
    uvm_coreservice_t cs = uvm_coreservice_t::get();
    // 获取 UVM 工厂对象
    uvm_factory factory=cs.get_factory();
    // 如果 "contxt" 为空且 "parent" 不为空,则将 "contxt" 设置为 "parent" 的完整路径
    if (contxt == "" && parent != null)
      contxt = parent.get_full_name();
    // 使用 UVM 工厂创建组件
    obj = factory.create_component_by_type(get(), contxt, name, parent);
    // 检查创建的组件是否为指定类型
    if (!Scast(create, obj)) begin
      // ... 处理创建失败的情况 ...
    end
  endfunction
endmodule

代码功能解析:

这段代码定义了一个名为 uvm_component_registry 的类,用于注册和创建 UVM 组件。它主要包含以下功能:

类型别名和类型名称:

typedef uvm_component_registry #(T, Tname) this_type; 定义了一个类型别名 this_type,用于简化对 uvm_component_registry 类型的引用。

const static string type_name = Tname; 定义了一个常量字符串 type_name,用于存储组件的类型名称。

获取类型名称:

virtual function string get_type_name(); 定义了一个虚函数 get_type_name,用于获取组件的类型名称。

静态变量和函数:

local static this_type me = get(); 定义了一个静态变量 me,用于存储当前注册的 uvm_component_registry 对象。

static function this_type get(); 定义了一个静态函数 get,用于获取当前注册的 uvm_component_registry 对象。

创建组件:

static function T create(string name, uvm_component parent, string contxt=“”); 定义了一个静态函数 create,用于创建指定类型的组件。

工作原理:

当一个 UVM 组件被创建时,它会调用 m_uvm_component_registry_internal 宏来注册自身,并将类型信息存储在 uvm_component_registry 对象中。

当需要创建指定类型的组件时,可以使用 uvm_component_registry::create 函数。该函数会根据注册的类型信息,使用 UVM 工厂创建指定类型的组件。

使用场景:

uvm_component_registry 类是 UVM 工厂的核心机制之一,它用于管理和创建 UVM 组件。它为 UVM 工厂提供了注册和创建组件的功能,简化了 UVM 组件的创建和管理。

总结:

uvm_component_registry 类是 UVM 中一个重要的类,它用于注册和创建 UVM 组件。它简化了 UVM 组件的创建和管理,并为 UVM 工厂提供了强大的功能。

function void uvm_default_factory::register (uvm_object_wrapper obj);
if (obj == null) begin
· ·
end
if (obj.get_type_name() !=""
&&obj.get_type_name() != "
<unknown>"
) begin
if (m_
type_names.exists(obj.get_type_name()))
else
m_type_names [obj.get_type_name()] = obj;
end
if (m_
types.exists(obj)) begin
if (obj.get_ type_name() != "" 6& obj.get_type_name() != "
<unknown>"
)
end
else begin
m_types [obj] = 1 ;
end
endfunction
string name,u vm_component parent)
function uvm_component uvm_default_factory::create_component_by_type
(uvm_object_wrapper requested_ type, tring parent_inst_path=""
,string name,u vm_component parent);
string full_inst_path;
requested_type =find_override_by_type(requested_type, full_inst path);
return requested_type.create_component (name, Parent);
endfunction请对这段代码进行注释
function void uvm_default_factory::register (uvm_object_wrapper obj);
  // 检查 "obj" 是否为空
  if (obj == null) begin
    // ... 处理 "obj" 为空的情况 ...
  end
  // 检查 "obj" 的类型名称是否为空或为 "<unknown>"
  if (obj.get_type_name() != "" && obj.get_type_name() != "<unknown>") begin
    // 如果 "m_type_names" 中已经存在 "obj" 的类型名称,则跳过注册
    if (m_type_names.exists(obj.get_type_name())) 
      // ... 处理类型名称重复的情况 ...
    else
      // 将 "obj" 的类型名称和对象添加到 "m_type_names" 中
      m_type_names [obj.get_type_name()] = obj;
  end
  // 检查 "m_types" 中是否已经存在 "obj" 对象
  if (m_types.exists(obj)) begin
    // 如果 "obj" 的类型名称不为空或为 "<unknown>",则跳过注册
    if (obj.get_type_name() != "" && obj.get_type_name() != "<unknown>")
      // ... 处理对象重复的情况 ...
  end
  else begin
    // 将 "obj" 对象添加到 "m_types" 中
    m_types [obj] = 1 ;
  end
endfunction

// 创建指定类型的组件
function uvm_component uvm_default_factory::create_component_by_type
  (uvm_object_wrapper requested_type, string parent_inst_path="",
  string name, uvm_component parent);
  // 定义一个字符串变量 "full_inst_path",用于存储组件的完整路径
  string full_inst_path;
  // 使用 "find_override_by_type" 函数查找类型覆盖
  requested_type = find_override_by_type(requested_type, full_inst_path);
  // 使用 "requested_type" 对象创建组件
  return requested_type.create_component (name, parent);
endfunction

代码功能解析:

这段代码定义了 UVM 默认工厂 (UVM Default Factory) 中的两个重要函数:

register(uvm_object_wrapper obj): 用于注册 UVM 对象。

该函数检查 obj 是否为空,以及 obj 的类型名称是否为空或为 。

如果 obj 的类型名称不为空,则将其添加到 m_type_names 字典中,以便通过类型名称查找对象。

如果 obj 对象本身不为空,则将其添加到 m_types 字典中,以便通过对象本身查找对象。

create_component_by_type(uvm_object_wrapper requested_type, string parent_inst_path=“”, string name, uvm_component parent): 用于根据类型创建组件。

该函数首先使用 find_override_by_type 函数查找类型覆盖,即查找是否有其他类型覆盖了 requested_type。

然后使用 requested_type 对象的 create_component 函数创建组件,并返回创建的组件对象。

工作原理:

register 函数用于将 UVM 对象注册到 UVM 默认工厂中,以便在需要创建对象时能够通过类型名称或对象本身查找对象。

create_component_by_type 函数用于根据类型创建组件,它会查找类型覆盖,并使用找到的类型创建组件。

使用场景:

register 函数通常在 UVM 组件的构造函数中调用,用于注册组件类型。

create_component_by_type 函数通常在 UVM 测试用例中调用,用于创建所需的组件。

总结:

register 和 create_component_by_type 函数是 UVM 默认工厂的核心机制之一,它们用于管理和创建 UVM 对象和组件。它们为 UVM 工厂提供了强大的功能,简化了 UVM 对象和组件的创建和管理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值