有什么方法可以获取它在 SystemVerilog 中操作的对象的名称?
就像实施
object1.printName()
应该打印字符串
object1
有什么方法可以获取它在 SystemVerilog 中操作的对象的名称?
就像实施
object1.printName()
应该打印字符串
object1
不,语言中没有为类执行此操作的机制。
对于模块,您可以使用%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
,然后对其进行修改或执行任何操作。
如果您使用的是 OVM/UVM,那么 get_full_name() / get_name() 将返回测试平台层次结构中组件的名称。
对象是动态的,因此您所问的问题隐含地无效。
当有人想要实现对象名称时,他们要做的就是在每个对象的构造函数中传递一个“字符串名称”,因此当对象是新的时,父对象会说出它的名称。
如果您查看 OVM/UVM 中的每个组件,您会看到构造函数签名: function new(string name="", ovm_component parent=null)
这些被基类用来实现 get_full_name() / get_name()
实例没有名称。考虑这段代码:
someObject a
someObject b
initial begin
a = new();
b = a;
a.printName();
b.printName();
end
a
并b
指向someObject
. 我们只创造了一个。因此,两个调用都必须报告相同的名称,但您希望它们报告我们用来访问它们的句柄的名称。那是不可能的。
OVM/UVM 对象包含一个包含实例名称的成员变量。它可以在构造时给出或使用设置set_name()
。可以使用get_name()
. 即使您谈论的对象不是 OVM/UVM,您也可以使用类似的系统。
对于高级别的东西,我不确定是否有与您描述的完全一样的东西。
但是,有$typename
系统任务。但是,我不知道它如何处理类的对象。我以前没有发现需要这个。
通常我所看到的(以及我所做的,因为我发现它很有用)是创建一个存储在由构造函数分配的类中的字符串,它是对象的“名称”。然后我可以在登录时使用它,所以我知道不同的消息来自哪里。当然,这取决于您创建具有有用名称的新变量。
如果你想模仿 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