2016-09-21 33 views
1

VHDL的任何版本(可能在2008年)都有可能在聲明之前使用類型嗎?在聲明VHDL之前使用類型(2008)

E.g.我有一個實體的結構數組聲明:

type my_array is array (integer range <>) of my_type; 
在相同的架構部分

而且還在,但後來在文件中我有這樣的:

type my_type is record 
    my_field: signed(31 downto 0); 
end record; 

現在,這提供了以下錯誤的Vivado:

[Synth的8-1031] my_type未聲明

解決方案當然是將數組聲明上方的記錄聲明移動。然而,隨着類型數量的增加,這會變得非常複雜和混亂(因爲你基本上必須對它們的類​​型進行拓撲排序並考慮它們的依賴關係)。

類似這樣的東西在每種主流編程語言中都是支持的,所以我想也許它也存在於VHDL中。我還隱約記得有關這方面的內容已被添加到VHDL 2008中,但無法找到任何有關它的資源,而我用VHDL 2008進行的快速測試是負面的。

因此,在聲明它之前,是否有可能在VHDL中使用類型,因爲聲明的類型仍然在相同的架構,相同的文件中,但在下面幾行?

+1

VHDL-2008中的通用類型可能會有幫助。 –

+0

嗯。雖然泛型可能有助於簡化一些複雜的依賴關係,但我沒有看到它使問題通常更容易(因爲現在您必須小心分開插入泛型,這可能會導致更長,更難以閱讀代碼以及重複)。 – Piedone

回答

2

是否有可能在任何版本的VHDL中,也許在2008年,在它聲明之前使用類型?

IEEE標準1076至2008年6聲明

6.1一般

的語言定義了幾種由報關申報或明或暗地命名實體的。每個實體的名稱都由該聲明定義,無論是作爲標識符還是作爲運算符符號或字符文字。
...
對於每種形式的聲明,語言規則都定義了一段稱爲聲明範圍的文本區域(見12.2)。 ...

12.2聲明的範圍

一聲明的範圍,除了一個體繫結構體,從聲明到立即關閉聲明性區域的端部的開始延伸;架構主體的範圍從架構主體的開始延伸到結束。在任何一種情況下,聲明範圍的這一部分稱爲即時範圍

12。3可見性

聲明僅在其範圍的某個部分中可見;除了PSL驗證單元,包裝聲明或受保護類型聲明之外的設計單元的聲明外,該部分從聲明結束開始,在這種情況下,在保留字發生後立即開始設計單位,包裝聲明或受保護的型號聲明。該規則適用於顯式聲明和隱式聲明。

這是可見性規則阻止您在聲明它之前引用類型。

此外,VHDL不支持接口類型聲明(泛型)以外的類型的前向聲明,但是您的示例my_array所示的子類型不支持。

的泛型類型布賴恩表示作用是有限的缺乏綜合供應商的支持,以及對一種類型的操作限制(參見6.5.3接口類型聲明)彼得艾舍登的書VHDL 2008年僅新玩意總結:

1.1泛型類型

VHDL-2008定義了一些涵蓋正式泛型類型,它們可以使用方式的規則。正式的泛型類型名稱可能會表示任何受約束的類型,除了文件類型或受保護的類型。該實體只能假設所有這些類型可用的操作都適用,即:轉讓;使用新的分配;類型鑑定和類型轉換;平等和不平等的運作。正式的泛型類型不能用作文件元素或屬性的類型。此外,如果實際類型不是訪問類型並且不包含訪問類型的子元素,則它只能用作顯式聲明的常量或信號類型(包括端口)。對於信號,實際類型的預定義的相等運算符用於驅動程序更新和事件檢測。

+0

這很傷心,但我想人們必須忍受不方便的事實。你知道任何間接的解決方法,比如偶然訪問類型嗎? – Piedone

2

注意,對於訪問類型有一個特殊的情況下,在一個不完整的類型聲明可以參考,以允許類型鏈表,如:

type value_cell; -- Incomplete declaration 

type value_ptr is access value_cell; -- value_cell only for access type 

type value_cell is record -- Full declaration 
    value  : bit_vector(0 to 3); 
    next_cell : value_ptr; 
end record value_cell; 

然而,這不是用聲明前的類型,訪問類型既不可合成,但對測試平臺代碼來說,這是一種有用的技術。

+0

這看起來完全像是能解決我的情況的東西。但正如你所說,這是不可綜合的,這是一個無賴...我不幸需要這個可綜合代碼。 – Piedone