2015-10-06 108 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節重寫的成員。