我想删除一个ovm对象(及其子对象),以便我可以使用不同的配置重新创建它。有没有办法在OVM中执行此操作?
目前,当我尝试使用new
第二次创建对象时,我收到以下VCS运行时错误:
[CLDEXT] Cannot set 'ap' as a child of 'instance', which already has a child by that name.
我意识到我可以简单地使用不同的名称来“重新创建”实例,但之后我仍然会让旧实例坐在那里并吸收内存。
答案 0 :(得分:3)
OVM只是一个SystemVerilog库。这意味着SystemVerilog的所有规则都适用于OVM。所以,是的,您可以将new()与OVM一起使用。有时候最好使用工厂,有时最好使用new()(这是一个不同讨论的主题)。
SystemVerilog没有删除操作符或像C ++这样的析构函数。相反,当您完成一个对象时,您只需删除对它的所有引用,垃圾收集器将清理内存。以下是SystemVerilog参考手册(IEEE 1800-2009)第8.7节的引用:
SystemVerilog不需要复杂的内存分配和C ++的重新分配。构造对象很简单;和Java一样,垃圾收集是隐式和自动的。不存在内存泄漏或其他微妙的行为,这通常是C ++程序员的祸根。
你不能有内存泄漏并不完全正确。您可以忘记删除对象的所有引用,垃圾收集器将不知道要提取它。但是,您不必担心内存与C ++中的内容相同。
您收到的ID为CLDEXT的特定错误来自ovm_component类。从消息中可以看出,您尝试创建两个具有相同名称和相同父级的组件。 OVM中的组件通常是静态的。也就是说,您通常在时间0创建并详细说明它们,并且在此之后不要删除或添加组件。由于这个模型,ovm_component中没有删除子组件的方法。因此,实例化后,实际上没有一种好方法可以替换组件。顺便说一句,这仅适用于组件。可以重新分配其他类型的对象。
如果您觉得需要在0之后用不同的组件替换组件,则应该重新考虑测试平台的体系结构。如果不更换组件,可能会有更好的方法来实现您的目标。
答案 1 :(得分:2)
我只有UVM经验,但我认为OVM是相似的。我本来希望回复@Victor Lyuboslavsky的评论,但我无法添加评论。
问题在于名称'ap',显然已经用于'实例'的孩子。请改用此代码。
static int instNum = 0;
instance_ap = my_ovm_extended_class::type_id::create
($sformatf ("ap%0d", instNum), this);
第一次创建对象&分配给'instance_ap'的句柄,该对象的名称为'instance.ap0'。下次代码执行一个名为'instance.ap1'的对象,依此类推。
正如其他海报所述,这应该仅针对非组件对象进行,组件应该是静态的,并且必须在构建阶段期间/之前创建。在连接阶段期间/之前相互连接。
答案 2 :(得分:0)
尝试在再次调用new之前为对象指定null。
答案 3 :(得分:0)
除非我看到其他人回答这个问题,否则我认为没有简单的方法可以在OVM框架中解除分配对象。
答案 4 :(得分:0)
OVM测试平台是静态的,并在创建测试平台时创建。
实例化环境类时,它将调用new(create),build,connect,end_of_elaboration,start_of_simulation,运行并检查所有组件。
在环境构建阶段结束时,必须创建所有组件。
在环境连接阶段结束时,所有组件必须连接其TLM端口。
由于这些要求,除了阶段之外,您无法更改组件(或端口连接)。
作为测试平台环境的静态特性的一部分,每个组件都必须具有唯一的get_full_name()响应。这是因为字符串查找用于标识层次结构中的组件。
答案 5 :(得分:0)
将对象分配为null应该释放内存。如果没有其他句柄指向该内存位置,则它应该被回收。