类构造函数中的uvm_component父级

时间:2018-01-11 02:19:08

标签: uvm

总是让我感到困惑的一件事是:是否在UVM对象的类构造函数中添加uvm_component parent。 据我所知,从uvm_component继承的所有项目都需要uvm_component parent作为构造函数输入参数的一部分。

function new (string name, uvm_component parent);
    super.new(name, parent);
endfunction

但所有课程都来自uvm_object,他们不需要。

我的问题是为什么?

根据我的理解,我们提供uvm_component parent工厂可以替换这些对象,为什么uvm_object继承的类不需要被工厂替换?

我注意到uvm_sequence还有一个有趣的事实:所以uvm_sequence构造函数也不需要uvm_component parent属性,但是当我们按工厂创建序列时,我们提供了父参数。

3 个答案:

答案 0 :(得分:0)

派生自uvm_component的类的构造函数需要知道其父类的原因是因为从uvm_component派生的类是测试环境的基础结构的一部分;该测试环境具有层次结构,每个组件都需要知道它在该层次结构中的位置。 (例如,配置数据库使用组件层次结构。)

uvm_object派生的类不属于测试环境的基础结构;它们是流经它的数据。

答案 1 :(得分:0)

  

根据我的理解,我们为工厂提供uvm_component父级   可以替换这些对象,为什么uvm_object继承了类不需要   被工厂取代?

我认为您对parentbase类感到有些困惑。

在UVM测试层次结构中,父类是在测试层次结构中高于一级的类。例如:

uvm_test is the parent of uvm_env
uvm_env is the parent of uvm_agent
uvm_agent is the parent of uvm_driver, uvm_sequencer, uvm_monitor

这是您在实例化parent uvm组件时指定的child。它需要配置db,构建阶段,检查阶段等等。

现在,另一方面,base类是OOP概念。您可以扩展基类并为其添加功能。例如,您可能会遇到以下情况:

my_agent_base extends uvm_agent (uvm_agent is base class, my_agent_base is derived)
my_agent_derived1 extends my_agent_base
my_agent_derived2 extends my_agent_base

如果您在工厂注册所有这些组件,则可以使用my_agent_base覆盖my_agent_derived1。这允许在测试平台中交换具有不同行为的组件。

您可以使用uvm_components和uvm_objects执行此操作,没问题。唯一的必要条件是您在工厂注册。

通常,uvm_objects是在测试期间多次创建和销毁的动态对象。

uvm_components在整个测试期间持续存在并具有执行阶段。

希望这有帮助

答案 2 :(得分:0)

在UVM中,主要有3种类型。

  • uvm_component - 用于基于类的分层测试平台结构
  • uvm_object - 测试平台配置的数据结构
  • uvm_transaction - 刺激生成&分析

new方法的参数值用于在链表中创建一个条目,UVM用它来定位伪层次结构中的uvm_components,此列表用于消息传递和配置机制。理想情况下,在通过create方法创建组件时,name参数字符串应该与组件的声明句柄相同,而父参数应该是关键字" this"以便它引用正在创建组件的uvm_component。

uvm_object类不需要这样的东西,因为它不用于构建测试平台的层次结构。 uvm_sequence也仅来自uvm_object

  

uvm_object - > uvm_transaction - > uvm_sequence_item - >   uvm_sequence_base - > uvm_sequence