| |
UVM测试平台是由uvm_component基类扩展来的组件objects构建的。创建uvm_component object时,它将成为测试平台层次结构的一部分,该层次结构在仿真期间保持不变。这与uvm类层次结构的sequence分支形成对比,其中objects是瞬态的 - 它们被创建,使用,然后在解除引用时当成垃圾被收集。
【此处需一幅图】
report的基础组件使用uvm_component静态层次结构打印出创建报告信息的组件范围,通过配置过程确定哪些组件可以访问配置对象,以及factory是否可以访问factory 重载。此静态层次结构由链表表示,该链表在创建每个组件时构建,层次结构中的组件位置由传递给其create method的名称和父参数确定。
例如,在下面的代码片段中,在spi_env中创建了一个apb_agent组件,对应的,而spi_env又在test中创建为m_env。agent的分层路径为“uvm_test_top.m_env.m_apb_agent”,对它的任何引用都需要使用此路径字符串。
//
// Hierarchical name example
//
class spi_env extends uvm_env;
//....
apb_agent m_apb_agent; // Declaration of the apb agent handle
// ...
function void build_phase(uvm_phase phase);
// Create the apb_agent:
//
// Name string argument is the same as the handle name
// The parent argument is 'this' - i.e. the spi_env
//
// The spi_env has a hierarchical path string "top.m_env" this is concatenated
// with the name string to arrive at "uvm_test_top.m_env.m_apb_agent" as the
// hierarchical reference string for the apb_agent
m_apb_agent = apb_agent::type_id::create("m_apb_agent", this);
// ...
endfunction: build_phase
// ....
endclass: spi_env
uvm_component类继承自uvm_report_object,其中包含支持UVM Messaging基础结构所需的功能。reporting过程使用组件静态层次结构将组件的范围添加到report消息字符串。
uvm_component基类模板具有每个UVM Phases的virtual method,并且根据需要填充这些virtual method,如果未实现Phase级virtual method,则组件不参与该Phase。
同样内置于uvm_component基类中的是对配置表的支持,该配置表用于存储与测试平台层次结构中的组件子节点相关的配置对象。使用config_db API时,此静态层次结构将用作路径机制的一部分,以控制哪些组件能够访问配置对象。
为了提供配置的灵活性并允许以智能方式构建UVM测试平台层次结构,uvm_components在UVM factory中进行注册。在build
phase中创建UVM组件时,factory用于构造组件对象。使用factory允许使用factory 重载将组件变换为派生类型之一。这可以是一种有用的技术,用于在不必重新编译的情况下直接更改测试平台的功能。实现工作需要许多编码约定,这些在有关UVM Factory的arcticle中被概述。
UVM包包含许多对公共测试平台组件的uvm_component的扩展类。这些扩展类中的大多数都扩展的非常少,即它们实际上只是具有新名称空间的uvm_component的扩展类,这意思是说可以替代使用uvm_component。但是,它们可以帮助自我记录,因为它们表明了类所代表的组件类型。还有一些分析工具可以使用这些基类作为线索来帮助他们构建测试平台层次结构的整棵树。许多扩展组件实例化子组件并且这些扩展组件在构建block时被添加上对应值。下表总结了可用的uvm_component派生类。
【此处需一个表】