总是让我感到困惑的一件事是:是否在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
属性,但是当我们按工厂创建序列时,我们提供了父参数。
答案 0 :(得分:0)
派生自uvm_component
的类的构造函数需要知道其父类的原因是因为从uvm_component
派生的类是测试环境的基础结构的一部分;该测试环境具有层次结构,每个组件都需要知道它在该层次结构中的位置。 (例如,配置数据库使用组件层次结构。)
从uvm_object
派生的类不属于测试环境的基础结构;它们是流经它的数据。
答案 1 :(得分:0)
根据我的理解,我们为工厂提供uvm_component父级 可以替换这些对象,为什么uvm_object继承了类不需要 被工厂取代?
我认为您对parent
和base
类感到有些困惑。
在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种类型。
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