5

有什么方法可以获取它在 SystemVerilog 中操作的对象的名称?

就像实施

object1.printName()  

应该打印字符串

object1
4

5 回答 5

9

不,语言中没有为类执行此操作的机制。

对于模块,您可以使用%m格式说明符来显示分层名称。但是对于类,输出使用%m显示类类型名称,而不是实例名称。(至少那是 Incisive 和 Questa 观察到的行为。)还要注意,%m如果从函数中调用,它将包括函数名称。

例子:

module test;

  // Print %m in a module
  function void printName();
    $display("%m");
  endfunction

  class foo;

    // Print %m in a class
    virtual function void printName();
      $display("%m");
    endfunction

  endclass

  foo foo_inst = new;

endmodule

module top;
   test test_inst();

   initial begin
     test_inst.foo_inst.printName();
     test_inst.printName();
   end
endmodule

输出:

top.test_inst.foo.printName
top.test_inst.printName

如果来自的输出%m有用,您可以使用字符串将其捕获$sformatf,然后对其进行修改或执行任何操作。

于 2012-09-27T03:51:10.633 回答
3

如果您使用的是 OVM/UVM,那么 get_full_name() / get_name() 将返回测试平台层次结构中组件的名称。

对象是动态的,因此您所问的问题隐含地无效。

当有人想要实现对象名称时,他们要做的就是在每个对象的构造函数中传递一个“字符串名称”,因此当对象是新的时,父对象会说出它的名称。

如果您查看 OVM/UVM 中的每个组件,您会看到构造函数签名: function new(string name="", ovm_component parent=null)

这些被基类用来实现 get_full_name() / get_name()

于 2012-09-27T19:15:59.740 回答
3

实例没有名称。考虑这段代码:

someObject a
someObject b

initial begin
    a = new();
    b = a;
    a.printName();
    b.printName();
end

ab指向someObject. 我们只创造了一个。因此,两个调用都必须报告相同的名称,但您希望它们报告我们用来访问它们的句柄的名称。那是不可能的。


OVM/UVM 对象包含一个包含实例名称的成员变量。它可以在构造时给出或使用设置set_name()。可以使用get_name(). 即使您谈论的对象不是 OVM/UVM,您也可以使用类似的系统。

于 2012-09-27T10:13:51.820 回答
2

对于高级别的东西,我不确定是否有与您描述的完全一样的东西。

但是,有$typename系统任务。但是,我不知道它如何处理类的对象。我以前没有发现需要这个。

通常我所看到的(以及我所做的,因为我发现它很有用)是创建一个存储在由构造函数分配的类中的字符串,它是对象的“名称”。然后我可以在登录时使用它,所以我知道不同的消息来自哪里。当然,这取决于您创建具有有用名称的新变量。

于 2012-09-26T19:44:37.287 回答
0

如果你想模仿 uvm/ovm,你可以添加你自己的类方法来做到这一点。这会很笨拙,而且你基本上是在发明自己的方法——但不是每个人都使用 uvm/ovm。

package foo_pkg;

class foo;
    string name;

    // Make your own get_full_name(), but shortname it
    function string gfn (input string s="");
        return {this.name, " ", s};
    endfunction : gfn

    // let the caller pass 'name' on the constructor
    function new (input string name="");
        this.name = name;
    endfunction : new


    function void test_prints();
        // wrap your strings with gfn(..) to whatever $display or logging macros you use

        $display(gfn("some text"));

        $display($sformatf("%t %m %s: value=%p", $time, gfn(), value));
    endfunction : bar

endclass
endpackage


module squirrel;

foo_pkg::foo foo_obj = new(.name($sformatf("%m"));
initial foo_obj.test_prints();

endmodule
于 2021-05-05T22:45:07.987 回答