3

我想删除一个 ovm 对象(及其子对象),以便我可以使用不同的配置重新创建它。有没有办法在 OVM 中做到这一点?

目前,当我尝试使用 再次创建对象时new,出现以下 VCS 运行时错误:

[CLDEXT] Cannot set 'ap' as a child of 'instance', which already has a child by that name.

我意识到我可以简单地使用不同的名称来“重新创建”实例,但是我仍然会让旧实例坐在那里吸收内存。

4

6 回答 6

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 之后需要用不同的组件替换组件,您应该重新考虑测试平台的架构。可能有更好的方法可以在不更换组件的情况下完成您尝试做的事情。

于 2012-05-24T20:43:40.527 回答
2

我只有 UVM 经验,但我认为 OVM 是相似的。我很想回复@Victor Lyuboslavsky 的评论,但我无法添加评论。

问题在于名称“ap”,它显然已经用于“instance”的孩子。请改用此代码。

static int instNum = 0;
instance_ap = my_ovm_extended_class::type_id::create
                ($sformatf ("ap%0d", instNum), this);

第一次创建对象并将句柄分配给“instance_ap”时,该对象将具有名称“instance.ap0”。下次代码执行名为“instance.ap1”的对象时,以此类推。

正如其他海报所提到的,这应该只对非组件对象进行,组件应该是静态的,并且必须在构建阶段/之前创建并在连接阶段/之前相互连接。

于 2013-05-17T09:26:15.020 回答
0

在再次调用 new 之前尝试将 null 分配给对象。

于 2012-03-07T15:22:14.477 回答
0

除非我看到其他人回答这个问题,否则我会说没有简单的方法可以在 OVM 框架中释放对象。

于 2012-03-12T20:33:36.147 回答
0

OVM 测试台是静态的,并在创建测试台时创建。

当环境类被实例化时,它将调用new(create)、build、connect、end_of_elaboration、start_of_simulation,运行并检查所有组件。

在环境构建阶段结束时,必须创建所有组件。

在环境连接阶段结束时,所有组件都必须连接其 TLM 端口。

由于这些要求,您不能更改组件(或端口连接),除非在该阶段期间。

作为测试平台环境的静态特性的一部分,每个组件都必须具有唯一的 get_full_name() 响应。这是因为字符串查找用于识别层次结构中的组件。

于 2012-09-27T19:11:30.943 回答
0

将对象分配给 null 应该释放内存。如果没有其他句柄指向该内存位置,那么它应该被回收。

于 2016-10-17T23:37:51.640 回答