2015-10-06 77 views
0
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类型的反对类变量EAA=EA;将相同的句柄(指向my_ea的对象的指针值)传递给A。因此,A.member1应参考值2. 但它指的是价值1.为什么?

回答

0

到目前为止,System-Verilog不允许重写类变量。只有虚拟方法可以被覆盖。

没有像虚拟的类成员,所以父类不能直接访问它们。当使用class_object.member特定类别被引用。从今以后,这是不可能的。

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类识别方法可以在不从基类隐藏它们被覆盖 - 从而它们允许基类引用将它们(多态性)

更多info,请在这里找到IEEE 1800-2012的8.14节重写的成员。