Home Articles

system verilog:重写成员系统verilog类

Asked
Viewed 794 times
1
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_ea 的对象的句柄赋予类变量 EA . A=EA; 将相同的句柄(指向 my_ea 对象的指针值)传递给 A . 所以, A.member1 应该参考值2.但它指的是 Value 1.为什么?

3 Answers

  • 0

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

    nothing like virtual for class members ,所以父类永远不能直接访问它们 . 使用 class_object.member 时,会引用 particular class . 从此以后,这是不可能的 .

  • 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)”函数并使用它来更改其值 .

  • 0

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

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

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

Related