“設計重用”是將高質量知識產權(IP)從一種ASIC設計遷移到另一種ASIC設計的過程。隨著半導體技術的巨大進步,越來越難以彌合技術提供與硅生產率允許之間的生產率差距。設計全定制ASIC以占用盡可能多的硅面積變得越來越具有挑戰性。為了實現最高水平的硅效率,設計具有高度可重復使用設計實體的半定制ASIC已成為當今的挑戰。
使用預先設計和預先驗證的設計模塊來實現高水平的設計重用是最有前途的技術用于縮小可用門數與設計人員生產率之間的差距。設計復雜的芯片需要基于HDL的設計。考慮到設計重用的有效HDL生成將幫助您創建可用于多個芯片設計的IP內核。
設計重用挑戰
重復使用設計帶來了新的創新挑戰設計師。在可重復使用之前,必須使用設計,這意味著使用良好的設計實踐進行設計。必須設計一個可重復使用的設計,具有解決一般問題的思維方式;編碼良好,評論和記錄;驗證了高度的信心;
由于產品上市時間緊迫,設計人員經常繞過部分或全部這些指導原則,使設計幾乎不可重復使用。但是,遵循這些指導原則可以通過減少整個編碼和驗證循環中的迭代來加速項目的設計,驗證和調試。設計的有效使用和重用在創建具有積極設計時間表的大型ASIC中起著至關重要的作用。
雖然芯片設計人員已經使用了HDL一段時間,但今天的大多數設計都沒有使用內置的“設計 - 重用“語言的特征。換句話說,設計師并沒有完全理解HDL的目的,也沒有濫用或低估其功能。平均而言,該行業中只有20%的設計是可重復使用的。隨著對設計重用的需求不斷增加,對設計重用的編碼技術的重視程度正在提高。本文介紹了使用VHDL的本機語言特性和與可合成VHDL相關的設計重用技術開發可重用設計。除非另有說明,否則所討論的VHDL符合VHDL-87標準。
VHDL功能促進可重用性
芯片設計人員使用VHDL已超過十年。在VHDL中開發設計的主要目的之一是可重用性,盡管設計師直到最近還沒有有效地使用這種技術。您可以利用功能豐富的VHDL來重用技術。 VHDL功能包括泛型,常量包,生成語句,無約束數組,VHDL屬性,用于內聯設計分區的塊語句,用于數據捆綁的記錄數據類型,配置規范,將端口與已知常量聯系起來的能力,離開的能力未使用的輸出端口打開和未連接,數組聚合,函數和過程。
提示1:泛型
使用泛型編寫具有不同結構和行為的參數化模型(參考文獻1)。清單1提供了一個具有可修改結構和行為的同步計數器的簡單示例。您可以通過使用VHDL泛型來完成此修改。此示例說明了使用語言的特征進行模擬和合成來修改結構和行為的泛型。您可以通過打開和關閉泛型來啟用和禁用選擇性功能。例如,如果在第8行中將COUNT_ENABLE泛型設置為FALSE,則第32行到第38行中描述的邏輯都不會被詳細說明或合成,但父設計仍然可以具有計數啟用。對OutDelay和DOWN_ COUNT使用不同的值會更改計數器的行為(盡管合成會忽略OutDelay),更改BIT_WIDTH或COUNT_ENABLE會修改設計的結構。使用泛型創建設計可以在需要不同結構或行為的各種情況下重用設計。例如,設計可能需要兩個計數器:一個計數到1024,另一個計數到八。設計兩個獨立的計數器 - 一個是10位寬,一個是3位寬 - 在設計,驗證和合成時間方面存在不必要的投資缺點。
如果使用通用方法設計計數器考慮到重用,您可以節省大量的設計,綜合和驗證時間。使用泛型來參數化結構和行為對于設計重用應用程序至關重要。以下示例說明了清單1中的計數器在需要10位遞增計數器和3位遞減計數器的應用程序中的實例化
清單2中的示例說明了以下幾點:
第3到第14行將計數器實例化為10位遞增計數器,并啟用計數啟用邏輯。
TenBit計數器實例化使用命名關聯作為其泛型和端口。
實例化中未映射的通用值假定為默認值。
第18行到第30行實例化與3位遞減計數器相同的計數器,其中count-enable-logic關閉。
ThreeBit計數器實例化使用其泛型和端口的位置關聯。通常,不建議使用位置關聯,因為更改可重用設計中的參數或端口需要在該設計的所有實例中進行相同的修改。
泛型的使用當您需要相同設計的多個實例時,可以極大地幫助您節省資源和時間。
使用泛型來設計參數化不僅有助于創建可重復使用的設計塊,而且還有助于在合成期間刪除不必要的邏輯或修改有用的邏輯。在通過泛型參數化設計時,一些綜合工具可幫助創建宏和模板。您可以在后續設計中使用由此創建的特征作為庫元素進行模擬或合成。通過泛型參數化總線和寄存器寬度是使用泛型的一個簡單示例。
考慮清單1中具有以下通用值的計數器示例:
當綜合詳細說明此設計時,綜合工具會忽略OutDelay的泛型,因為該工具無法處理映射邏輯中的時間延遲元素。綜合工具使用count_enable邏輯創建一個2位向下計數器,如下例所示。
考慮具有以下泛型的同一計數器的另一個案例:
此代碼創建一個沒有計數啟用邏輯的8位遞增計數器。如果門數是一個重要參數,則可以使用此方法有效地優化未使用的邏輯。您可以使用這種優雅的參數化方法在設計,合成和模擬過程中修改結構(更改BIT_WIDTH)或行為(向上或向下計數器,count_enable禁用或啟用)。
泛型非常適合指定計數器,總線,移位寄存器和其他設計的寬度,但如清單2所示,您還可以使用泛型來打開和關閉各種功能。此技術允許您僅使用適用于當前項目的功能。您可以使用泛型來指定FIFO深度等功能;總線接口,如PCI或ARM系統總線;架構,例如向上/向下計數器,基于觸發器的寄存器與基于鎖存器的寄存器,以及紋波進位加法器與進位超前加法器;登記地址;寄存器的上電復位值;寄存器中的支持和保留位;時鐘分頻電路的時鐘分頻比;時鐘樹中的緩沖區數量。
如果使設計有點通用,其他人可以更容易地重復使用它。當您在層次結構中使用泛型時,會出現通用方法的一個缺點。要將泛型應用于層次結構的最低級別,泛型必須向下傳遞到層次結構中。這種傳遞可能涉及泛型必須經歷不使用泛型值的塊。使用泛型的另一個缺點是,隨著泛型列表的增長,在層次結構中的每個點處攜帶它們變得更加麻煩。第三個缺點是一些綜合工具對泛型的支持有限。例如,綜合工具可能要求所有泛型都是整數類型。避免這些問題的一種有效方法是使用一個常量包。
提示2:常量
VHDL包是一種簡單的方法,可以對一組相關的聲明進行分組。共同的目標。您可以使用庫語句使包對可見的設計塊可見。使用庫語句意味著添加或更改參數只需要修改一個包文件。此外,某些綜合工具不允許使用布爾,字符串,枚舉或數組類型進行泛型。在這種情況下,使用庫語句允許您在包中使用常量。大多數綜合工具允許大多數數據類型,并且使用庫語句允許包對枚舉數據類型使用TYPE語句。一個常量包還允許您在“設計感知”測試平臺中使用相同的包進行設計和模擬。
作為使用常量包的示例,請考慮將清單2中的計數器更改為使用這樣的包。另外,假設包位于“pkgs”VHDL庫中(清單3)。此計數器示例顯示使用常量包類似于使用泛型進行參數化。此外,使用常量包允許任何設計實體引用包中的參數而不會產生任何開銷。此外,要更改設計的結構,您必須僅更改包中的參數值,并且可以在引用該參數的所有單元中看到更改。常量包也可以使用子類型和枚舉數據類型來引用參數以獲得可重用性和可讀性,并且中央包可以用作參數化包以參數化整個設計。此外,使用包使得使用數組和其他復合數據類型進行參數化相對簡單。
您可以作為設計單元單獨處理包,獨立于設計創建包,并重用包裝在模型的不同部分。泛型定義中的一些不可合成的構造(例如枚舉數據類型)在包中使用時可以合成。包可能包含您可能用于參數化的其他常量和信息,但設計仍可能使用此信息。該包用作此類共享信息的通用占位符。此外,一組參數提供了更好的代碼結構,提供了有效的組織,并且是自我記錄的。
圖1顯示了不同泛型和常量值的參數化計數器。使用Synopsys設計編譯器合成計數器,該編譯器具有0.2-μm標準單元庫,在所有合成測試中BIT_WIDTH參數設置為2.
在圖1的計數器中,COUNT_ENABLE為false(未連接的en enable信號),BIT_WIDTH為2,DOWN_COUNT為false(傳統的up-counter)。在圖2的計數器中,具有計數使能的遞增計數器,COUNT_ENABLE為真(連接使能信號),BIT_WIDTH為2,DOWN_COUNT為假。同樣在圖3的計數器中,沒有啟用的遞減計數器,COUNT_ENABLE為假(未連接的啟用信號),BIT_WIDTH為2,DOWN_COUNT為真。這三個示例顯示了如何通過使用不同的泛型和常量值來修改計數器結構和行為,同時消除不必要的門。
延遲常量是您聲明但不初始化包中的常量的常量。相反,您在使用常量的設計中初始化延遲常量。換句話說,你“推遲”常量的綁定。在引用它們之前必須綁定延遲常量,以便對包的任何更改都不需要設計計數器重新編譯或重新合成。
使用常量包與使用泛型修改具有相同的效果合成過程中的結構或行為。常量包還允許您有效地使用復合數據類型以提高可讀性,并仍然保留設計可合成性。此外,合成使用常量包的設計比使用泛型的設計更容易。換句話說,工程師更容易學習如何使合成工具使用常量包而不是使用使用泛型的設計。對于具有復合數據類型的設計,某些綜合工具具有較長的運行時。
您可以使用一組常量,其方式與使用泛型相同。如果涉及許多參數,常量包比泛型更容易使用。與泛型相比,包通常也更好地支持綜合工具。但是,使用常量包意味著您不能在單個設計單元中使用具有不同參數的多個設計實例。相反,您需要為每個重復設計單元提供唯一的實體和獨特的包。此外,使用非延遲常量的包中的更改會導致重新編譯或重新合成引用包的設計,即使參數不影響設計也是如此。此外,常量包需要您維護單獨的文件或庫。
在考慮應用程序的預期范圍后,使用常量包與使用泛型進行參數化進行比較。作為一般做法,對于具有許多參數且在大型設計中未多次實例化的設計,使用常量包。例如,將主機/CPU周期轉換為存儲器周期的存儲器控??制器設計不太可能在設計中多次實例化。這樣的設計應該使用一組常量。您應該將泛型用于總線接口,計數器,加法器和線性反饋移位寄存器等設計。
技巧3:生成語句
您可以實現許多數字系統,例如記憶,作為子系統的常規迭代組合。例如,存儲器包括矩形存儲單元陣列。設計人員更喜歡這樣的實現,因為它們可以更容易地生成緊湊,經過驗證,面積有效的布局,從而降低成本。如果您可以將設計表達為某個子系統的重復,那么您應該能夠描述子系統一次,然后描述如何重復實例化,而不是單獨描述每個實例化(參考文獻2)。
您可以使用generate語句有效地生成設計的迭代結構。生成語句是并發VHDL結構,可能包含進一步的并發語句以進行復制。當您將生成語句與泛型或常量結合使用時,它們可以有效地生成重復結構。考慮一種情況,您需要通過輸出焊盤使用8個輸出使能從片內驅動32位片外數據總線(清單5)。該示例實例化數據總線的32個填充單元。請注意使用“范圍”和“長度”屬性。這些屬性還促進了重用,因為它們使用先前定義的數據總線總線寬度。還要注意在將輸出使能信號分配給焊盤單元時使用“i/4”。綜合工具應該足夠智能,可以將除法截斷為整數值,以便將dataoe(3)正確分配給數據(31:24),將dataoe(2)分配給數據(23:16),依此類推。
清單6說明了使用帶有并發語句迭代結構的generate語句來從觸發器創建寄存器。您還可以使用generate語句有條件地創建,修改或刪除結構。該技術涉及代碼級優化,在精化時間內刪除不需要的結構。通過使用泛型或常量包,此技術可用于創建可重用的設計。
使用條件生成語句,您可以啟用或禁用實現某些功能的邏輯,而不是手動刪除代碼或通過合成優化。作為條件代碼包含和排除的示例,您可以將輸出同步到時鐘或使用常量CONSTANT SYNC_OUTPUTS組合設置它:BOOLEAN:TRUE;這種技術允許您生成同步或組合輸出(清單7)。
generate語句是一個控制邏輯包含或排除的強大工具。它對于在迭代結構中重復使用邏輯塊(例如觸發器)的設計很有用。這些塊形成寄存器,填充單元和許多其他結構。許多設計人員使用生成語句來實例化單元格,如pad示例所示,但您也可以使用generate語句來有條件地創建,修改或刪除VHDL代碼的各個部分。生成語句是促進設計重用的強大工具。一些顯示生成語句應用的示例是選擇基于鎖存器或基于觸發器的寄存器的實現;在總線仲裁器設計中包括固定,循環或其他仲裁方案;并且僅包括您知道將要使用的中斷控制器的那些位??紤]已注冊的中斷進入中斷控制器的情況。如果這些輸入在被路由到其他寄存器之前經過大量的組合邏輯,則使用generate語句僅包括必要的觸發器將有助于綜合工具顯著減少門數。請注意,某些綜合工具無法跨觸發器進行優化。在這些情況下,即使我們知道輸入(例如未使用的中斷)總是高電平,綜合工具也不能使用此信息來減少合成設計的門數。
提示4:端口
在許多情況下,您可以通過將某些端口綁定到默認值來有選擇地禁用邏輯。當采用自上而下的方法進行綜合時,綜合工具使用“通過恒定傳播進行優化” - 優化該路徑并考慮該關聯值。您可以稍后從實體中刪除綁定端口??紤]三門與門設計(圖4a)。如果將其中一個輸入連接到零(圖4b),則生成的邏輯將消除所有AND門,輸出F始終為邏輯0。
端口輸出也是如此。通過保持未使用的端口輸出打開(zo => open),您可以在采用自上而下的綜合方法時消除創建這些輸出的邏輯。
技巧5:無約束數組
使用無約束數組是重用可變寬度實現設計的有用方法。在設計中使用“范圍”和“長度”等屬性時應該小心,以避免運行時和精化時錯誤。無約束陣列特別適用于地址,數據和寄存器寬度。您可以將這些數組用于函數和過程以及實體端口中的形式參數。
VHDL允許使用無約束數組類型,使您可以指定索引值的類型而無需指定索引邊界。無約束數組可用于制作只需修改其位寬即可在不同應用程序中重用的設計。前面的計數器示例使用無約束數組作為計數輸出(清單8)。此技術允許您將計數器實體連接到任何大小的數組信號或任何范圍的索引值。注意使用VHDL屬性“range”來創建與端口計數具有相同寬度和范圍規范的信號。您無法自己合成此設計,并且必須在頂級實體中實例化它以將數組值綁定到有限范圍(清單9)。您必須以自上而下的方式合成清單9中的代碼,以便您可以將計數器與設計的其余部分合成。
無約束數組的另一種用法出現在函數和過程中。您應該盡可能一般地編寫為合成而設計的函數和過程,而與位寬無關。考慮二進制代碼到格雷碼轉換器的示例。要從二進制代碼創建格雷碼,請使用圖5a中的算法。圖5b是如何將二進制100轉換為其灰度代碼等效值110的示??例。表1示出了圖5a的算法創建的3位二進制值的格雷碼。您可以針對3位案例對此算法進行硬編碼和優化。當設計必須容納更多計數時,函數必須更改,要求您重新驗證所有邏輯。編寫獨立于位向量長度的通用函數可以實現有效的重用。清單10是二進制代碼到格雷碼轉換器的與位寬無關的實現。再舉一個例子,考慮IEEE std_logic庫中的函數和過程。大多數這些函數和過程都是使用無約束數組實現的,以支持有效的重用。
技巧6:VHDL屬性
復合類型的一些屬性在創建可重用設計時很有用。屬性“左”,“右”,“范圍”,“長度”,“低”和“高”是可綜合的,并使代碼獨立于數據類型。請參閱使用無約束數組的示例(清單8和清單9),其中函數Gray2bin和實體計數器使用“range”屬性來提升可重用性。
提示7:配置規范
您使用配置規范將組件實例綁定到設計實體。您還可以使用這些配置傳遞參數(如測試平臺中最頂層的泛型),為實體選擇體系結構,或覆蓋實例化中的端口映射。某些綜合工具不支持配置規范。
考慮前面的計數器示例,該示例說明了泛型用于參數化。清單11說明了另一個使用generate語句緩沖計數器輸出的體系結構的計數器?,F在,計數器在頂級設計中使用計數器的兩個實例進行實例化。配置規范在實體頂部配置計數器,如清單13所示。配置規范允許您配置設計層次結構的各個級別。
提示8:塊語句
塊語句是VHDL結構,允許內聯設計分區。例如,如果對設計進行分區以使數據路徑存在于單獨的VHDL實體中,則可以使用塊語句對該實體的體系結構進行分區。塊語句是一種對相關邏輯進行分組的方法。塊語句還提供了在塊內聲明信號的能力,如果刪除塊,則不必要的信號在代碼中不會保持未連接狀態。您可以將generate語句與block語句組合以選擇性地包含或排除塊。
技巧9:未使用的端口
在分層設計中,如果您不使用某些端口實體,然后通常的做法是將它們連接到虛擬信號。從自上而下的綜合方法來看,這種情況使得合成器假設您已將信號連接到網絡。您可以通過保持端口未連接或通過使用VHDL關鍵字指定“打開”來避免此問題。
提示10:預處理器
在許多情況下,設計人員無法使用他們想要的內容可用的功能。在某些情況下,希望只看到與設計相關的代碼。在這種情況下,您可以使用預處理器通過使用預處理程序指令來添加,刪除或修改特定應用程序的代碼。
-
PCB打樣
+關注
關注
17文章
2968瀏覽量
21652 -
華強PCB
+關注
關注
8文章
1831瀏覽量
27722 -
華強pcb線路板打樣
+關注
關注
5文章
14629瀏覽量
42980
發布評論請先 登錄
相關推薦
評論