【问题标题】:How can I delete and deallocate OVM objects in SystemVerilog?如何在 SystemVerilog 中删除和解除分配 OVM 对象?
【发布时间】:2016-10-18 07:37:51
【问题描述】:

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

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

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

我意识到我可以简单地使用不同的名称来“重新创建”实例,但我仍然会保留旧实例并占用内存。

【问题讨论】:

  • 你能说得更具体点吗?什么代码给了你错误?

标签: verilog system-verilog


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    问题在于名称“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”的对象时,以此类推。

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 这是 OVM。没有new。对象是用这样的工厂创建的:instance_ap = my_ovm_extended_class::type_id::create("ap",this); 这给出了上面提到的 VCS 运行时错误。
      • @Victor,我只有 UVM 经验,但我认为 OVM 是相似的。问题在于名称ap,它显然已经用于instance 的孩子。请改用此代码:static int instNum = 0; instance_ap = my_ovm_extended_class::type_id::create ($sformatf ("ap%0d", instNum), this); instNum++;。每次创建对象并分配给instance_ap 时,名称都会不同,instance.ap0instance.ap1 等。正如其他人所提到的,这应该只对非组件对象进行,组件应该是静态的并且必须在构建阶段期间/之前创建。
      【解决方案4】:

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

      【讨论】:

      • 当对象不再拥有对它的引用时,它们会被垃圾收集器释放。
      【解决方案5】:

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

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

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

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

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

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          猜你喜欢
          • 2020-07-29
          • 2012-08-10
          • 2011-04-12
          • 1970-01-01
          • 1970-01-01
          • 2012-09-27
          • 2014-02-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多