system verilog:重写成员系统verilog类

时间:2015-10-06 09:20:15

标签: class oop verilog system-verilog

var url = UrlResolver.Current.GetUrl(CurrentPage.SpecificDocument)

现在我做的时候

class my_a;
int member1 = 1;
endclass
class my_ea extends my_a;
int member1 = 2;
endclass

my_a A; my_ea EA; EA =new(); A=EA; 已将类型为EA = new();的对象的句柄赋予类变量my_eaEA将相同的句柄(指向A=EA;的对象的指针值)传递给my_ea。因此,A应该引用值2。 但它指的是价值1.为什么?

3 个答案:

答案 0 :(得分:0)

到目前为止,System-Verilog不允许覆盖类变量。只能覆盖虚拟方法。

没有像类成员的虚拟,所以父类永远不能直接访问它们。使用 class_object.member 时,会引用特定类。从此以后,这是不可能的。

答案 1 :(得分:0)

您无法通过扩展类来重新定义现有成员。您应该使用虚拟方法来访问(获取/设置)它们。例如,我在代码中添加了“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)”函数并使用它来更改其值。

答案 2 :(得分:0)

在您的情况下,A.member1应该返回其自己类的原始成员。当您覆盖类成员时,您基本上隐藏了被覆盖的成员。超级/基类永远不能访问其子类中的重写成员。

据我所知,只有用virtualrandomize()函数和类constraint标识的方法才能被覆盖,而不会将它们从基类中隐藏 - 因此它们允许基类引用他们(多态)

有关详细信息,请参阅第8.14节“重写成员”中的IEEE 1800-2012