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