2013-12-12 84 views
5

SystemVerilog是否支持向下轉換(將基礎對象轉換爲派生對象)?如果是這樣,怎麼樣?SystemVerilog是否支持向下轉換?

下低垂例如不工作:

class base; 
    int a = 5; 
endclass 

class extend extends base; 
    int b = 1; 
endclass 

module test; 

    initial begin 
    base m_base; 
    extend m_extend; 

    m_base = new(); 
    m_extend = new(); 
    $cast(m_extend, m_base); 
    $display(m_extend.a); 
    end 
endmodule 

修改並重新對EDA遊樂場的例子:http://www.edaplayground.com/s/4/581

回答

7

是的,你可以垂頭喪氣。你的例子是正確的語法,它實際上編譯。但是,您正在收到運行時錯誤,因爲投射失敗。

您在示例中的強制轉換失敗,因爲只有在基礎對象的句柄實際引用派生類型的對象時,才能成功向下轉換。你可以調用$cast作爲一個函數,它將返回一個布爾值,指示演員是否成功。

下面是一個例子:

class animal; 
    function void eat(); 
    endfunction 
endclass 

class dog extends animal; 
    function void bark(); 
    $display("woof"); 
    endfunction 
endclass 

class cat extends animal; 
    function void meow(); 
    $display("meow"); 
    endfunction 
endclass 

module test; 

    initial begin 
    dog a_dog = new(); 
    cat a_cat = new(); 

    animal animals[$]; 
    animals.push_back(a_dog); 
    animals.push_back(a_cat); 

    foreach (animals[i]) begin 
     dog another_dog; 
     animals[i].eat(); 
     if ($cast(another_dog, animals[i])) begin 
     $display("Found a dog!"); 
     another_dog.bark(); 
     end 
    end 

    end 
endmodule 

輸出:

# Found a dog! 
# woof 

http://www.edaplayground.com/s/474/586

+0

因此喪氣的作品只有在源對象首先被上傳。 –

+1

大部分是。它不需要是顯式上傳的結果,但是您需要將基類型引用指向派生類型的對象。 – dwikle

3

IEEE Std 1800-2012 § 8.16 「鑄造」 規定:

它將繼承樹(超類或表達式類型的祖先)中較高類類型的變量分配給子類型表達式總是合法的。將超類型的變量直接賦值給它的一個子類類型的變量應該是非法的。然而,$cast可用於將超類句柄分配給子類類型的變量,前提是超類句柄引用與子類變量兼容的對象。

下面的轉換失敗是因爲超類對象不能作爲子類讀取。

m_base = new(); 
$cast(m_extend, m_base); // destination type != source object type 

要正確投源手柄的對象必須是兼容的目的地typetypes必須與:

m_extend = new(); 
m_base = m_extend; 
$cast(m_extend, m_base); // destination type == source object type 

向下轉換可以通過繼承的層面開展工作。下面的示例演示指着孫子對象基類手柄被澆鑄成擴展類(孫子對象的父類):

class ext_more extends extend; 
    int c; 
endclass 
initial begin 
    base m_base; 
    extend m_extend; 
    ext_more m_ext_more; 

    m_ext_more = new(); 
    m_base = m_ext_more; 
    $cast(m_extend, m_base); // legal, casting a subclass object to a parent handle 
    $display(m_extend.a); 
end 

這裏有一些工作示例:http://www.edaplayground.com/s/6/587