系统的Verilog:覆盖的成员系统的Verilog类
问题描述:
class my_a;
int member1 = 1;
endclass
class my_ea extends my_a;
int member1 = 2;
endclass
现在,当我做系统的Verilog:覆盖的成员系统的Verilog类
my_a A;
my_ea EA;
EA =new();
A=EA;
EA = new();
给手柄my_ea
类型的反对类变量EA
。 A=EA;
将相同的句柄(指向my_ea
的对象的指针值)传递给A
。因此,A.member1
应参考值2. 但它指的是价值1.为什么?
答
到目前为止,System-Verilog不允许重写类变量。只有虚拟方法可以被覆盖。
有没有像虚拟的类成员,所以父类不能直接访问它们。当使用class_object.member,特定类别被引用。从今以后,这是不可能的。
答
您无法通过扩展课程来重新定义现有成员。您应该使用虚拟方法来访问(获取/设置)它们。例如,我为你的代码添加了“get_member1”函数,并且当你想从基类句柄中调用时,它返回2。
class my_a;
int member1 = 1;
virtual function int get_member1();
return member1;
endfunction
endclass
class my_ea extends my_a;
int member1 = 2;
virtual function int get_member1();
return member1;
endfunction
endclass
module tb;
initial begin
my_a A;
my_ea EA;
EA =new();
A=EA;
$display("%0d", A.get_member1());
end
endmodule
您可以类似地定义“set_member1(int value)”函数并使用它来更改其值。
答
在你的情况A.member1
应该返回它自己的类的原始成员。当你压倒一个班级成员时,你基本上隐藏了重写的成员。超级/基类永远不能访问其子类中的重写成员。
据我所知,只有与virtual
,randomize()
功能和constraint
类识别方法可以在不从基类隐藏它们被覆盖 - 从而它们允许基类引用将它们(多态性)
更多info,请在这里找到IEEE 1800-2012的8.14节重写的成员。