Object 如何使用SystemVerilog中对实例进行操作的方法获取实例的名称?

Object 如何使用SystemVerilog中对实例进行操作的方法获取实例的名称?,object,verilog,system-verilog,Object,Verilog,System Verilog,有什么方法可以在SystemVerilog中获取它所操作的对象的名称吗 喜欢实施 object1.printName() 应该打印字符串 object1 对于这样高层次的东西,我不确定是否有和你描述的完全一样的东西 但是,还有$typename系统任务。但是,我不知道它如何处理类的对象。我以前不觉得有这个必要 通常我所看到的是创建一个存储在类中的字符串,该类由构造函数指定,它是对象的“名称”。然后我可以在登录时使用它,这样我就知道不同的消息来自哪里。当然,这取决于您使用有用的名称创建新变

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

喜欢实施

object1.printName()  
应该打印字符串

object1

对于这样高层次的东西,我不确定是否有和你描述的完全一样的东西

但是,还有
$typename
系统任务。但是,我不知道它如何处理类的对象。我以前不觉得有这个必要


通常我所看到的是创建一个存储在类中的字符串,该类由构造函数指定,它是对象的“名称”。然后我可以在登录时使用它,这样我就知道不同的消息来自哪里。当然,这取决于您使用有用的名称创建新变量。

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

对于模块,可以使用
%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
的输出有用,您可以使用
$sformaf
将其捕获为字符串,然后对其进行修改或执行任何操作。

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

someObject a
someObject b

initial begin
    a = new();
    b = a;
    a.printName();
    b.printName();
end
a
b
指向
someObject
的同一个实例。我们只创造了一个。因此,两个调用都必须报告相同的名称,但您希望它们报告我们用来访问它们的句柄的名称。那是不可能的



OVM/UVM对象包含包含实例名称的成员变量。它可以在构造时给出,也可以使用
set\u name()
进行设置。可以使用
get\u name()
读取它。即使您谈论的对象不是OVM/UVM,也可以使用类似的系统。

如果您使用OVM/UVM,那么get\u full\u name()/get\u name()将返回测试台层次结构中组件的名称

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

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

如果查看OVM/UVM中的每个组件,您将看到构造函数签名: 函数新建(字符串名称=”,ovm_组件父级=null)


基类使用这些函数来实现get_full_name()/get_name()

如果要模拟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

这也是我所看到的。但是分配的字符串不必与用于实例化对象的字符串匹配。对吗?@Jean-right,您可以将其分配给任何您想要的对象。然而,这可能足以满足您的特殊需求。