提升设计性能的HDL编码方法
目錄
概述
復(fù)位的使用與性能之間的關(guān)系?
SRL
乘法器和 RAM
一般邏輯
示例 1
示例2
示例3
示例4????????
使用加法器鏈(Adder Chains)而不是加法器樹(Adder Trees)
最大化BRAM性能
HDL 編碼風(fēng)格
示例 5
綜合工具設(shè)置
寄存器的一般用途
使用專用塊寄存器
I/O 寄存器的使用
使用高扇出復(fù)制寄存器
示例 6
添加流水線
推斷與實(shí)例化
時(shí)鐘使能和門控時(shí)鐘
嵌套的 If-Then-Else、 Case 語(yǔ)句和組合 For 循環(huán)
層次結(jié)構(gòu)
結(jié)論
概述
? ? ? ? 主要來自Xilinx《WP231,HDL Coding Practices to Accelerate Design Performance 》。
????????實(shí)現(xiàn)FPGA 設(shè)計(jì)最大性能化的一個(gè)重要因素是正確的RTL 編碼設(shè)計(jì)。在實(shí)現(xiàn)RTL 級(jí)設(shè)計(jì)時(shí)做出的某些看似很小的決定可能意味著在低于 100 MHz 的設(shè)計(jì)和高于 400 MHz 的設(shè)計(jì)之間存在較大的性能差異。
????????可靠的設(shè)計(jì)性能是在設(shè)計(jì)過程中仔細(xì)考慮了許多因素的結(jié)果。首先,必須選擇最適合設(shè)計(jì)的硬件平臺(tái)。接下來,需要學(xué)習(xí)選擇的器件架構(gòu)以及綜合工具的特性。最后,這也是本文檔的主題,必須編寫高效映射到目標(biāo)器件的 HDL 代碼。可以在網(wǎng)絡(luò)上找到詳細(xì)說明這些主題的資源。本文檔通過介紹編碼風(fēng)格和小提示來提高設(shè)計(jì)性能,且重點(diǎn)關(guān)注后者。重申了正確的 FPGA 編碼慣例,并介紹了直接適用于最新 Xilinx FPGA 架構(gòu)的鮮為人知的技術(shù)。
復(fù)位的使用與性能之間的關(guān)系?
????????很少有因素能像復(fù)位那樣對(duì)性能、面積和功耗產(chǎn)生如此深遠(yuǎn)的影響。 一些系統(tǒng)架構(gòu)師指定為系統(tǒng)使用全局異步復(fù)位,其目的僅是在上電時(shí)進(jìn)行電路的初始化。然而,這對(duì)于FPGA 設(shè)計(jì)來說不是必需的。對(duì)于 Xilinx? FPGA 的架構(gòu),復(fù)位的使用和復(fù)位類型會(huì)對(duì)設(shè)計(jì)性能產(chǎn)生深遠(yuǎn)的影響。復(fù)位策略可以是:
- 避免使用設(shè)備庫(kù)組件,例如移位寄存器的查找表 (SRL)
- 避免使用專用硬件塊的同步元件
- 避免結(jié)構(gòu)內(nèi)部邏輯的優(yōu)化
- 嚴(yán)重限制布局和布線,因?yàn)閺?fù)位信號(hào)通常具有高扇出
SRL
????????當(dāng)前,所有的Xilinx FPGA 架構(gòu)都能夠?qū)⒉檎冶?(LUT) 元素配置為邏輯、 ROM/RAM 或 SRL。綜合工具可以從 RTL 代碼中推斷出這些結(jié)構(gòu)中的任何一種;然而,如果使用了更好性能的移位寄存器 SRL,就無法在代碼中實(shí)現(xiàn)復(fù)位,因?yàn)?SRL 庫(kù)組件沒有復(fù)位功能。在推斷移位寄存器的代碼中使用復(fù)位需要多個(gè)觸發(fā)器或 SRL 周圍的附加邏輯以實(shí)現(xiàn)復(fù)位功能。如圖 1 所示,不對(duì)移位寄存器進(jìn)行復(fù)位的代碼通常會(huì)在輸出上產(chǎn)生單個(gè)寄存器,這對(duì)于面積和性能而言是最佳的。
????????使用復(fù)位與不使用復(fù)位相比,對(duì)面積和功耗的影響則更為明顯,但對(duì)性能的影響則不太明顯。當(dāng)用觸發(fā)器構(gòu)建移位寄存器時(shí),移位寄存器的性能通常并不重要,因?yàn)榧拇嫫髦g的時(shí)序路徑(觸發(fā)器的時(shí)鐘到輸出、相關(guān)的布線延遲以及設(shè)置下一個(gè)觸發(fā)器的時(shí)間)通常不足以成為設(shè)計(jì)中最長(zhǎng)的路徑。然而,增加的資源消耗(觸發(fā)器和布線)卻可能對(duì)設(shè)計(jì)其他部分的布局和布線選擇產(chǎn)生負(fù)面影響,這會(huì)導(dǎo)致設(shè)計(jì)中其他路徑的布線延遲更長(zhǎng)。在向 SRL 添加額外邏輯以模擬復(fù)位功能的情況下,該邏輯的一部分出現(xiàn)在 SRL 的時(shí)鐘輸出上,從而增加了數(shù)據(jù)到達(dá)其目標(biāo)邏輯所需的時(shí)間,從而降低了性能.
????????小技巧:避免對(duì)移位寄存器進(jìn)行復(fù)位,因?yàn)樗梢宰柚雇茢喑雒娣e和性能更優(yōu)的 SRL 庫(kù)單元。
乘法器和 RAM
????????當(dāng)前,所有的Xilinx FPGA 架構(gòu)都包含專用的算術(shù)資源。此類資源可用于執(zhí)行乘法,就像在許多 DSP 算法中一樣,但也可用于其他應(yīng)用,例如桶形移位器(barrel shifter)。
????????同樣,幾乎每個(gè) FPGA 設(shè)計(jì)都使用各種大小的 RAM,無論何種應(yīng)用。當(dāng)前所有Xilinx FPGA 都包含BRAM 元素,這些元素可以實(shí)現(xiàn)為 RAM、 ROM、大型 LUT,甚至是一般邏輯。同時(shí)使用乘法器和 RAM 資源可以產(chǎn)生更緊湊和更高性能的設(shè)計(jì)。
????????復(fù)位類型的選擇會(huì)影響設(shè)計(jì)的性能。乘法器模塊和 RAM 寄存器都只包含同步復(fù)位;如果為這些功能編碼了異步復(fù)位,則不能使用這些塊中的寄存器。這對(duì)性能有嚴(yán)重影響。 例如,使用針對(duì)具有異步復(fù)位的最快 Virtex?-4 器件的全流水線乘法器可以產(chǎn)生大約 200 MHz 的性能。重新編寫代碼以使用同步復(fù)位可以將性能提高一倍以上,達(dá)到 500 MHz。
????????與乘法器類似, Virtex-4 塊 RAM 具有可選寄存器。當(dāng)使用這些輸出寄存器時(shí),它們可以減少 RAM 的時(shí)鐘輸出時(shí)間并提高整體設(shè)計(jì)速度。這些可選寄存器沒有復(fù)位端口;因此,如果代碼中使用了復(fù)位,則無法啟用輸出寄存器。
????????將 RAM 用作 LUT 或通用邏輯時(shí)會(huì)出現(xiàn)第二個(gè)問題。有時(shí),出于面積和性能的原因, 將配置為 ROM 或通用邏輯的多個(gè) LUT 壓縮到單個(gè)塊 RAM 中是有利的。這可以通過手動(dòng)指定這些結(jié)構(gòu)或通過約束綜合工具將邏輯設(shè)計(jì)的部分映射到未使用的BRAM 資源來自動(dòng)完成。由于BRAM 的復(fù)位配置,只有在使用同步復(fù)位(或無復(fù)位)時(shí), 才可以映射通用邏輯而不改變?cè)O(shè)計(jì)功能。
????????小技巧:避免異步復(fù)位,因?yàn)樗鼤?huì)阻止將寄存器打包到專用資源中并影響性能、利用率和工具優(yōu)化。
一般邏輯
????????異步復(fù)位也會(huì)對(duì)通用邏輯結(jié)構(gòu)的性能產(chǎn)生影響。由于所有Xilinx FPGA 通用寄存器都包含將置位/復(fù)位編程為異步或同步的能力,因此可以看出使用異步復(fù)位沒有任何損失;這種假設(shè)通常是錯(cuò)誤的。圖 2 中的代碼示例說明了使用異步復(fù)位將如何抑制優(yōu)化。如果不使用異步復(fù)位,則此類信號(hào)將使用的資源可用并可用于優(yōu)化驅(qū)動(dòng)該寄存器的其他同步路徑(圖 3 中的 FDRSE)。
示例 1
????????為了實(shí)現(xiàn)異步復(fù)位代碼,綜合工具必須為數(shù)據(jù)路徑推斷出兩個(gè) LUT,因?yàn)橐褂梦鍌€(gè)信號(hào)來創(chuàng)建這個(gè)邏輯。圖 2 還顯示了此代碼的可能實(shí)現(xiàn):
//異步復(fù)位always @ (posedge CLK, posedge RST)if (RESET)Q <= 1 ' b0 ;elseQ <= A | ( B & C & D & E ) ;示例2
????????用同步復(fù)位重寫相同的代碼使綜合工具在實(shí)現(xiàn)該功能時(shí)更加靈活。圖 3 還顯示了代碼的可能實(shí)現(xiàn):
//同步復(fù)位always @ (posedge CLK)i f (RESET)Q <= 1 ' b0 ;elseQ <= A | ( B & C & D & E ) ;????????通過圖 3 的結(jié)果,綜合工具可以識(shí)別任何時(shí)候 A 為高電平有效, Q 始終為邏輯 1 (OR 功能)。現(xiàn)在將寄存器 (FDRSE) 配置為同步設(shè)置/復(fù)位操作,該設(shè)置現(xiàn)在可以自由地用作同步數(shù)據(jù)路徑的一部分。
示例3
????????為了進(jìn)一步說明異步置位或復(fù)位對(duì)性能的影響,可以檢查一個(gè)具有 8 個(gè)信號(hào)的更復(fù)雜的函數(shù)。要實(shí)現(xiàn)此功能,至少需要 3 個(gè) LUT。代碼的可能實(shí)現(xiàn)如圖 4 所示:
//異步復(fù)位always @ (posedge CLK, posedge RST)i f (RESET)Q <= 1 ' b0 ;elseQ <= ( F | G | H) & (A | ( B & C & D & E ) )?示例4????????
????????圖 5 顯示了使用同步復(fù)位編寫的相同代碼;還提供了代碼的可能實(shí)現(xiàn)。
//同步復(fù)位always @ (posedge CLK)i f (RESET)Q <= 1 ' b0 ;elseQ <= ( F | G | H) & (A | ( B & C & D & E ) )?????????同樣,圖 5 中的最終實(shí)現(xiàn)不僅使用更少的 LUT 來實(shí)現(xiàn)相同的邏輯功能,而且由于幾乎每個(gè)創(chuàng)建此功能的信號(hào)的邏輯電平減少,還能導(dǎo)致更快的設(shè)計(jì)結(jié)果。
????????由于設(shè)計(jì)中的大部分邏輯都是同步的,因此使用同步或完全不復(fù)位可以進(jìn)一步優(yōu)化設(shè) 計(jì)、減少面積和優(yōu)化性能。
小技巧:
- 檢查是否需要全局復(fù)位
- 避免異步控制信號(hào)
使用加法器鏈(Adder Chains)而不是加法器樹(Adder Trees)
????????許多信號(hào)處理算法對(duì)輸入樣本流執(zhí)行算術(shù)運(yùn)算,然后對(duì)算術(shù)運(yùn)算的所有輸出求和。為了在 FPGA 等并行架構(gòu)中實(shí)現(xiàn)求和,通常使用加法器樹結(jié)構(gòu)。加法器的數(shù)量取決于加法器樹中的輸入數(shù)量。加法器樹中的輸入越 多,需要的加法器就越多,從而增加了邏輯資源的數(shù)量和功耗。更大的樹也意味著在樹的最后階段有更大的加法器;大加法器進(jìn)一步減少系統(tǒng)的性能。
????????一種在保持加法器樹的高性能的同時(shí)最小化設(shè)備利用率和功耗的方法是將加法器樹實(shí)現(xiàn)為專用硅資源(參見圖 6)。然而, FPGA 制造商不可能找到一種結(jié)構(gòu),既允許在專用資源中實(shí)現(xiàn)大多數(shù)加法器樹,同時(shí)又將芯片面積保持在最小。
????????憑借其 DSP48 專用芯片列, Virtex-4 系列在實(shí)現(xiàn)求和方面采用了不同的方法。如圖 7 所示,它涉及使用鏈?zhǔn)郊臃ㄆ鞫皇羌臃ㄆ鳂湟栽隽糠绞接?jì)算總和。沒有其他 FPGA 使用這種方法。這是最大化 DSP 算法性能和降低功耗的關(guān)鍵,因?yàn)檫壿嫼突ミB都完全包含在專用芯片中。流水線化時(shí), DSP48 模塊的性能在最快速度等級(jí)下為 500 MHz,與加法器的數(shù)量無關(guān)。級(jí)聯(lián)端口與加法器/累加器的 48 位分辨率相結(jié)合,允許 當(dāng)前樣本計(jì)算以及迄今為止所有計(jì)算樣本的總和。
????????
????????為了利用 Virtex-4 加法器鏈結(jié)構(gòu),將加法器樹描述替換為加法器鏈描述。 《UG073: XtremeDSP for Virtex-4 FPGA 用戶指南》中詳細(xì)介紹了將直接形式濾波器轉(zhuǎn)換為轉(zhuǎn)置形式或脈動(dòng)形式的這一過程,并且通常涉及增加設(shè)計(jì)延遲。轉(zhuǎn)換完成后,算法可以運(yùn)行得比應(yīng)用要求快很多。在這種情況下,可以通過使用多通道或折疊技術(shù)進(jìn)一步降低設(shè)備利用率和功耗。這兩種技術(shù)都有助于在較小的設(shè)備中實(shí)現(xiàn)設(shè)計(jì),或者允許使用釋放的資源 將功能添加到設(shè)計(jì)中。
- 多通道是一個(gè)在多個(gè)輸入流(通道)中利用非常快速的數(shù)學(xué)元素,采樣率要低得多的過程。這種技術(shù)將硅效率提高了幾乎等于通道數(shù)量的倍數(shù)。多通道濾波可以看作是時(shí)間復(fù)用的單通道濾波器。例如,在典型的多通道過濾場(chǎng)景中,多個(gè)輸入通道使用單獨(dú)的數(shù)字濾波器對(duì)每個(gè)通道進(jìn)行過濾。利用 Virtex-4 DSP48 Sl ice, 單個(gè)數(shù)字濾波器可以通過使用 8x 時(shí)鐘為單個(gè)濾波器提供時(shí)鐘來過濾所有八個(gè)輸入通道。這將所需的 FPGA 資源數(shù)量減少了近八倍。
- 折疊是一個(gè)類似的概念。不是對(duì)多個(gè)輸入流進(jìn)行時(shí)間復(fù)用,而是對(duì)單個(gè)濾波器的抽頭進(jìn)行時(shí)間復(fù)用,從而允許濾波器使用更少的資源。釋放的資源可以用于其他目的。
? ? ? ? 小技巧:使用 Virtex-4 加法器級(jí)聯(lián)代替加法器樹。
最大化BRAM性能
????????在高效推斷存儲(chǔ)元素時(shí),必須考慮影響性能的幾個(gè)因素:
? 決定使用BRAM還是分布式 DRAM
? 是否使用輸出流水線寄存器
? 避免異步復(fù)位
????????其他因素,即 HDL 編碼風(fēng)格和綜合工具設(shè)置,同樣會(huì)顯著影響存儲(chǔ)性能。
HDL 編碼風(fēng)格
????????在推斷雙端口BRAM時(shí),兩個(gè)端口可以同時(shí)訪問同一個(gè)存儲(chǔ)器單元。例如,如果兩個(gè) 端口同時(shí)在同一個(gè)存儲(chǔ)單元上寫入不同的值,則會(huì)產(chǎn)生沖突,并且無法保證存儲(chǔ)單元的內(nèi)容。
????????另一個(gè)常見的內(nèi)存配置示例是內(nèi)存輸出的值取決于目標(biāo)設(shè)備。最新的 Virtex 和 Spartan? 系列具有三種可編程操作模式,可在寫入操作發(fā)生時(shí)控制內(nèi)存輸出。設(shè)備 用戶指南中提供了有關(guān)這些操作模式的其他信息。
示例 5
????????如下所示,綜合工具能夠根據(jù)編碼風(fēng)格推斷出BRAM。
/ / ' write first ' or transparent mode always @ (posedge clk) beginif (we ) begindo <= data ;mem [ address ] <= data ;end elsedo <= mem [ address ] ; end/ / ' read first ' or read before write mode ( slower ) always @ (posedge clk) begin if (we ) mem [ address ] <= data ; do <= mem [ address ] ; end/ / ' no change ' mode always @ (posedge clk) if (we ) mem [ address ] <= data ; else do <= mem [ address ] ; end? ? ? ? 小技巧:避免使用“read before write”模式以最大化BRAM 性能。
綜合工具設(shè)置
????????另一個(gè)可以顯著影響B(tài)RAM性能的重要因素是綜合工具的設(shè)置。一些綜合工具(例如 Synpl icity?的 Synpl ify?)在 RAM 周圍插入旁路邏輯,以防止 RTL 和硬件行為之 間可能出現(xiàn)的不匹配。當(dāng)讀取和寫入操作發(fā)生在同一個(gè)存儲(chǔ)單元上時(shí),這個(gè)額外的邏輯旨在強(qiáng)制 RAM 輸出為某些已知值。如果設(shè)計(jì)人員知道同一存儲(chǔ)單元上的同時(shí)讀寫操作永遠(yuǎn)不會(huì)發(fā)生,則可以使用綜合工具設(shè)置來防止將旁路邏輯添加到應(yīng)用程序中 。額外的邏輯對(duì)存儲(chǔ)性能有負(fù)面影響,因?yàn)樗诖鎯?chǔ)的所有輸出路徑上增加了開銷邏輯。消除或阻止附加邏輯可保持存儲(chǔ)器性能。
/ / disable conflict avoidance logicreg [ 7 : 0 ] mem [ 12 7 : 0 ] ????????/ * synthesis syn_ramstyle=no_rw_check* / ;? ? ? ? 小技巧:檢查綜合工具設(shè)置、推斷模板和限制,以最大限度地提高存儲(chǔ)單元的性能。
寄存器的一般用途
????????FPGA 架構(gòu)為每個(gè) LUT 提供一個(gè)寄存器,在 I/O 和專用模塊(例如存儲(chǔ)器和 DSP)中提供額外的寄存器。使用這些資源對(duì)于實(shí)現(xiàn)最佳性能很重要。寄存器可用于加速設(shè)計(jì)性能的多種用途。它們可用于減少關(guān)鍵路徑、關(guān)鍵網(wǎng)絡(luò)扇出、設(shè)置和 I/O 或 專用塊的時(shí)鐘輸出中的邏輯級(jí)數(shù)。
使用專用塊寄存器
????????FPGA 具有用于大多數(shù)設(shè)計(jì)中使用的功能的專用電路,例如存儲(chǔ)器或 DSP 模塊。這些塊具有可選寄存器。啟用這些寄存器可通過減少設(shè)置、時(shí)鐘輸出和/或增加塊時(shí)鐘速度來加速塊性能。綜合工具會(huì)自動(dòng)嘗試將寄存器打包到這些塊中,因?yàn)樗梢怨?jié)省面積、 提高功耗并提供最佳性能。設(shè)計(jì)人員可以使用約束來控制推斷組件的綜合工具映射。 然而,在實(shí)例化這些塊時(shí),需要啟用為應(yīng)用程序提供最佳性能的寄存器集;默認(rèn)情況下,綜合工具不會(huì)優(yōu)化用戶實(shí)例化的架構(gòu)組件。在最佳情況下,應(yīng)啟用所有寄存器以獲得最大性能;但是,延遲要求可能并不總是允許這樣做。在這些情況下,設(shè)計(jì)人員有責(zé)任啟用正確的寄存器集。例如, 當(dāng)僅使用乘法器 (MREG) 和輸入寄存器 (AREG 和 BREG) 時(shí), Virtex-4 DSP48 單元(快速級(jí))的時(shí)鐘到輸出設(shè)置為 1. 8 ns 和 2. 3 ns。保持相同的功能和延遲,但啟用累加器輸出寄存器 (PREG) 而不是 MREG,建立時(shí)間增加到 3 ns,而時(shí)鐘輸出縮短到 0. 6 ns。請(qǐng)參見圖 8。
????????因此,重要的是要考慮:
- 邏輯驅(qū)動(dòng)或由專用塊驅(qū)動(dòng)的時(shí)序
- HDL代碼中寄存器的定位
????????
????????小技巧:
- 在推斷專用模塊時(shí),如果綜合工具無法啟用最佳寄存器集以提高性能,則應(yīng)應(yīng)用綜合約束。
- 在為實(shí)例化組件選擇啟用哪個(gè)寄存器時(shí),請(qǐng)確保使用了最大數(shù)量的寄存器,并考 慮到塊內(nèi)寄存器之間的延遲。
I/O 寄存器的使用
????????所有 Xilinx FPGA 在 FPGA 輸入和輸出路徑上都包含專用寄存器。通過利用這些寄存器,輸入路徑的建立時(shí)間和輸出路徑的時(shí)鐘輸出時(shí)間可以最小化,從而更容易滿足捕獲和向外部設(shè)備提供數(shù)據(jù)的時(shí)序要求。然而,有時(shí)使用專用 I/O 寄存器會(huì)對(duì)滿足 FPGA 內(nèi)的時(shí)序產(chǎn)生負(fù)面影響。它們的使用會(huì)延長(zhǎng)內(nèi)部邏輯的路由延遲。當(dāng)需要滿足 I/O 時(shí)序要求時(shí),這些寄存器應(yīng)放置在 I/O 中,或者當(dāng) I/O 時(shí)序要求允許時(shí),它們應(yīng)放置在 FPGA 架構(gòu)中。一些綜合工具,如 Synpl ify,會(huì)根據(jù)時(shí)序規(guī)范自動(dòng)將寄存器放置在結(jié)構(gòu)或 I/O 中。如果綜合工具不支持自動(dòng)布局或需要手動(dòng)控制寄存器布局, 則必須執(zhí)行以下步驟:
????????控制 I/O 寄存器使用平衡了數(shù)據(jù)路徑進(jìn)入和退出 FPGA 的時(shí)序與滿足 FPGA 內(nèi)部時(shí)序規(guī)范的需求。另一個(gè)值得注意的準(zhǔn)則是在 HDL 代碼的頂層描述 FPGA 的所有輸入和輸出端口上的寄存器。在使用分層設(shè)計(jì)方法實(shí)現(xiàn) FPGA 時(shí),在代碼的頂層層次結(jié)構(gòu)中指定寄存器可避免布局沖突。它還避免了為某些電路板原理圖捕獲工具不接受的端口描述創(chuàng)建分層名稱。
????????小技巧:禁用將寄存器全局打包到 I/O 單元中。相反,僅將PCB上時(shí)序關(guān)鍵的寄存器約束到 FPGA I/O 單元中。
使用高扇出復(fù)制寄存器
????????寄存器復(fù)制是一種通過復(fù)制寄存器來減少給定信號(hào)的扇出來提高關(guān)鍵路徑速度的技術(shù)。 這為實(shí)現(xiàn)工具提供了更多的余地來放置和路由不同的負(fù)載和相關(guān)的邏輯。綜合工具廣泛使用這種技術(shù)。如果在時(shí)序報(bào)告中將具有長(zhǎng)路由延遲的高扇出網(wǎng)絡(luò)報(bào)告為關(guān)鍵路徑,則應(yīng)考慮對(duì)綜合工具或手動(dòng)復(fù)制寄存器的復(fù)制約束。以下的 HDL 代碼說明了如何手動(dòng)復(fù)制一次 64 負(fù)載信號(hào)。
( *EQUIVALENT_REGISTER_REMOVAL= "NO " * ) reg ce1 ,ce2 ; / / Clock enable register with 64 fanout / / replicated oncealways @ (posedge clk) begince1 = ce ;ce2 = ce ; endalways @ (posedge clk) begini f ( ce1 )res [ 3 1 : 0 ] <= a_data [ 3 1 : 0 ] ;i f ( ce2 )res [ 63 : 3 2 ] <= a_data [ 63 : 3 2 ] ; end示例 6
????????很多時(shí)候,需要添加額外的綜合約束以確保手動(dòng)復(fù)制的寄存器不會(huì)被綜合工具優(yōu)化掉。 在上面的示例中,使用了 XST 語(yǔ)法 (EQUIVALENT_REGISTER_REMOVAL)。
????????大多數(shù)綜合工具使用扇出閾值限制來自動(dòng)確定是否應(yīng)該復(fù)制寄存器。調(diào)整這個(gè)全局閾值允許自動(dòng)復(fù)制高扇出網(wǎng)絡(luò),但不能提供更精細(xì)的用戶控制,即可以復(fù)制哪些特定寄存器。更好的方法是在特定寄存器或?qū)哟谓Y(jié)構(gòu)級(jí)別上應(yīng)用屬性,以指定哪些寄存器可以或不能復(fù)制。
????????小技巧:如果布局布線工具報(bào)告高扇出信號(hào)限制了設(shè)計(jì)性能,請(qǐng)考慮復(fù)制它們。
添加流水線
????????另一種提高性能的方法是用多級(jí)邏輯重構(gòu)長(zhǎng)數(shù)據(jù)路徑,并將它們分布在多個(gè)時(shí)鐘周期上。這種方法允許更快的時(shí)鐘周期和增加的數(shù)據(jù)吞吐量,但代價(jià)是延遲和流水線開銷邏輯管理。由于 FPGA 具有豐富的寄存器,因此額外的寄存器和開銷邏輯通常不是問題。使用這種技術(shù),數(shù)據(jù)路徑跨越多個(gè)周期;因此,必須對(duì)設(shè)計(jì)的其余部分進(jìn)行特殊考慮,以考慮增加的路徑延遲。以下給出了一種編碼風(fēng)格,它在 32x32 乘法器的輸 出上添加了六級(jí)寄存器。綜合工具將這些寄存器流水線化到 Virtex-4 DSP48 的可選寄存器中,以最大限度地提高數(shù)據(jù)吞吐量。
parameter PIPE = 6 ;reg signed [ 63 : 0 ] prod [ PIPE-1 : 0 ] ;/ / 3 2x32 multiplier with 4 DSP4 8 ( PIPE=6 )always @ (posedge clk) begin prod [ 0 ] <= a * b ;for ( i=1 ; i<=PIPE-1 ; i=i+1 )prod [ i ] <= prod [ i-1 ] ; endassign mult_out = prod [ PIPE-1 ] ;????????如果設(shè)計(jì)驗(yàn)證方法和工具集允許,則應(yīng)考慮將重定時(shí)與流水線相結(jié)合以進(jìn)一步提高設(shè)計(jì)性能。
????????重定時(shí)是一種綜合或布局布線算法,可在組合邏輯中自動(dòng)移動(dòng)寄存器(寄存器平衡), 以改善時(shí)序,同時(shí)確保從設(shè)計(jì)的主要輸入和輸出中看到的相同行為。
????????重定時(shí)簡(jiǎn)化了 RTL 設(shè)計(jì),因?yàn)闊o需更改任何代碼即可提高性能。但是,重定時(shí)使設(shè)計(jì)驗(yàn)證更加復(fù)雜,因?yàn)榧拇嫫髅Q、位置和功能不再與 RTL 描述匹配。因此,一些設(shè)計(jì)人員避免使用重定時(shí)。當(dāng)重定時(shí)不是一個(gè)選項(xiàng)時(shí),有關(guān)設(shè)備的知識(shí)有助于設(shè)計(jì)人 員描述 RTL 中的寄存器,以便這些寄存器有效地映射到可用的設(shè)備資源。
????????就性能而言,應(yīng)始終考慮底層架構(gòu)中的邏輯實(shí)現(xiàn)。還應(yīng)考慮每段特定代碼可能創(chuàng)建的 邏輯級(jí)別數(shù)和可能的信號(hào)扇出。必須選擇 RTL 代碼中寄存器的平衡布局,以便設(shè)計(jì) 的任何部分都不具有明顯較大的邏輯電平或扇出部分。通過遵循這些指導(dǎo)方針,設(shè)計(jì)應(yīng)該針對(duì)給定的邏輯映射充分發(fā)揮其性能潛力。
????????小技巧:通過平衡寄存器之間的邏輯級(jí)數(shù)來提高設(shè)計(jì)性能。在 RTL 代碼中添加流水線級(jí)別,在相關(guān)時(shí)應(yīng)用綜合工具的重定時(shí)選項(xiàng),或兩者兼而有之。
推斷與實(shí)例化
????????通常最好從行為上描述設(shè)計(jì)并讓綜合工具將代碼映射到 FPGA 中可用的門級(jí)資源。除了使代碼更具可移植性之外,所有推斷的邏輯對(duì)綜合工具都是可見的,從而允許工具在函數(shù)之間 執(zhí)行優(yōu)化。這些優(yōu)化包括:邏輯復(fù)制、重組和合并,或重新定時(shí)以平衡寄存器之間的邏輯延遲。當(dāng)器件庫(kù)單元被實(shí)例化時(shí),綜合工具默認(rèn)不會(huì)優(yōu)化它們。即使被指示優(yōu)化器件庫(kù)單元,綜合工具通常也無法執(zhí)行與 RTL 相同級(jí)別的優(yōu)化。因此,綜合工具通常只對(duì) 進(jìn)出這些單元的路徑進(jìn)行優(yōu)化,而不是通過這些單元。例如,如果一個(gè) SRL 被實(shí)例化 并且由這個(gè) SRL 驅(qū)動(dòng)的邏輯錐很長(zhǎng),那么這條路徑可能會(huì)成為一個(gè)瓶頸(在 SRL 部分 中提到)。 與常規(guī)寄存器相比, SRL 具有更長(zhǎng)的時(shí)鐘輸出延遲。為了在提高其時(shí)鐘輸 出性能的同時(shí)保持 SRL 提供的面積減少,創(chuàng)建一個(gè)延遲比實(shí)際所需延遲少一個(gè)延遲的 SRL,最后一級(jí)在常規(guī)觸發(fā)器中實(shí)現(xiàn)。
????????然而,在某些情況下需要實(shí)例化。這通常發(fā)生在綜合工具映射不滿足時(shí)序、功率或面積限制,或者無法推斷 FPGA 內(nèi)的特定特性時(shí)。通過實(shí)例化,設(shè)計(jì)人員可以完全控制綜合工具。例如,為了獲得更好的性能,設(shè)計(jì)人員可以僅使用 LUT 來實(shí)現(xiàn)比較器,而不是通常由綜合工具選擇的 LUT 和進(jìn)位鏈元素的組合。在其他情況下,實(shí)例化是利用設(shè)備中可用的復(fù)雜資源的唯一方法。這可能是由于:
- HDL語(yǔ)言限制。例如,不可能在 VHDL 中描述雙倍數(shù)據(jù)速率 (DDR) 輸出,因?yàn)樗枰獌蓚€(gè)單獨(dú)的進(jìn)程來驅(qū)動(dòng)相同的信號(hào)。
- 硬件復(fù)雜性。實(shí)例化 Virtex-4 I/O SerDes 元素比用行為描述它們更容易。
- 綜合工具推理限制。例如,綜合工具目前無法從行為描述中推斷 Virtex-4 FIFO 或 DSP48 對(duì)稱舍入和飽和。因此,除非用戶對(duì)其進(jìn)行實(shí)例化,否則不會(huì)使用該電路。
? ? ? ? 小技巧:
- 嘗試從行為上描述你的設(shè)計(jì)的最大值。
- 當(dāng)綜合行為代碼不滿足要求時(shí),請(qǐng)?jiān)趯⒋a替換為器件庫(kù)組件實(shí)例之前檢查綜合工具時(shí)序約束和設(shè)置。
- 在編寫常見的 Verilog 和 VHDL 行為結(jié)構(gòu)時(shí),請(qǐng)考慮“ISE 語(yǔ)言模板”。
- 在實(shí)例化設(shè)備庫(kù)組件時(shí),請(qǐng)考慮使用 CORE Generator?、架構(gòu)向?qū)Щ?ISE 語(yǔ)言模板。
時(shí)鐘使能和門控時(shí)鐘
????????對(duì)于 CLB 寄存器,賽靈思通常建議使用專用時(shí)鐘使能端口而不是門控時(shí)鐘端口。門控時(shí)鐘可能會(huì)導(dǎo)致毛刺、時(shí)鐘延遲增加、時(shí)鐘偏移和其他不良影響。使用時(shí)鐘使能可以節(jié)省時(shí)鐘資源并且可以改進(jìn)設(shè)計(jì)的時(shí)序特性和分析。有幾種方法可以使用設(shè)備上可用的時(shí)鐘啟用資源。要對(duì)整個(gè)時(shí)鐘域進(jìn)行門控以降低功耗,最好使用稱為 BUFGCE 的啟用時(shí)鐘的全局緩沖資源(參見圖 10)。
????????
????????對(duì)于僅嘗試在設(shè)計(jì)的小范圍內(nèi)暫停幾個(gè)周期的應(yīng)用,首選方法是使用 FPGA 寄存器的時(shí)鐘使能引腳。本節(jié)中的第一個(gè)示例(參見圖 11)說明了一種低效的門控時(shí)鐘信號(hào)方式, 而第二個(gè)示例(參見圖 12)顯示了有效映射到時(shí)鐘使能引腳的代碼的修改版本。 ?
assign GATECLK = ( IN1 & IN2 & CLK) ; always @ (posedge GATECLK) begin i f ( LOAD) OUT1 <= DATA; end assign ENABLE = ( IN1 & IN2 & LOAD) ; always @ (posedge CLOCK) begin i f ( ENABLE ) DOUT <= DATA; end小技巧:
- 避免門控時(shí)鐘
- 使用全局時(shí)鐘緩沖器的時(shí)鐘使能端口控制整個(gè)時(shí)鐘域上的時(shí)鐘
- 使用寄存器的時(shí)鐘使能端口在本地控制時(shí)鐘
- 如果時(shí)鐘使能信號(hào)似乎是不符合您的時(shí)序要求的路徑的一部分,請(qǐng)考慮復(fù)制時(shí)鐘使能信號(hào)
嵌套的 If-Then-Else、 Case 語(yǔ)句和組合 For 循環(huán)
????????應(yīng)避免嵌套的 if/case 語(yǔ)句以及其他語(yǔ)句中的語(yǔ)句。代碼中的嵌套數(shù)量應(yīng)該最少。 其他 if 語(yǔ)句中的 if 語(yǔ)句過多會(huì)使行長(zhǎng)度過長(zhǎng),并且會(huì)抑制綜合優(yōu)化。通過將嵌套語(yǔ)句保持在最低限度,代碼通常更具可讀性、可移植性,并且可以更輕松地格式化以進(jìn)行打印。
????????在 HDL 中描述 for 循環(huán)時(shí),最好在數(shù)據(jù)路徑中至少放置一個(gè)寄存器,尤其是當(dāng)存在算術(shù)或其他邏輯密集型操作時(shí)。在編譯期間,綜合工具展開循環(huán)。如果沒有這些同步元素, 綜合工具會(huì)連接在循環(huán)的每次迭代中創(chuàng)建的邏輯,可能會(huì)導(dǎo)致非常長(zhǎng)的組合路徑并限制設(shè)計(jì)性能。
????????
????????小技巧:
- 盡量減少順序語(yǔ)句中的嵌套數(shù)量
- 應(yīng)該將寄存器添加到生成長(zhǎng)組合路徑的 for 循環(huán)中
層次結(jié)構(gòu)
????????設(shè)計(jì)層次劃分的選擇通常取決于編寫 HDL 代碼的難易程度。然而,為了在性能方面實(shí)現(xiàn)最佳的整體設(shè)計(jì)層次結(jié)構(gòu),同時(shí)減少完成設(shè)計(jì)的整體時(shí)間,通常最好考慮設(shè)計(jì)優(yōu)化、 實(shí)現(xiàn)方法和驗(yàn)證。在優(yōu)化方面,大多數(shù)綜合工具將邏輯設(shè)計(jì)層次結(jié)構(gòu)視為“soft”,這意味著它們?cè)诳赡艿那闆r下保留層次結(jié)構(gòu),但在允許優(yōu)化的地方分解層次結(jié)構(gòu)或修改層次結(jié)構(gòu)中的封裝和邏輯內(nèi)容。但是,如果采用增量設(shè)計(jì)或 KEEP HIERARCHY 等分層設(shè)計(jì)實(shí)踐來進(jìn)行驗(yàn)證,則無法跨邏輯邊界執(zhí)行優(yōu)化。如果沒有正確遵循某些準(zhǔn)則,可能會(huì)導(dǎo)致具有更多邏輯級(jí)別或更多布局限制的不太優(yōu)化的設(shè)計(jì)。即使使用非分層設(shè)計(jì)實(shí)現(xiàn)流程時(shí),這些指南使其變得更容易,因此綜合和布局布線工具更有可能在邏輯優(yōu)化和布局方面做出最佳選擇。以下列表簡(jiǎn)要說明了這些準(zhǔn)則:
????????通過遵循這些簡(jiǎn)單的指導(dǎo)方針,所選層次結(jié)構(gòu)干擾設(shè)計(jì)優(yōu)化和性能的可能性要小得多。 如果在任何時(shí)候必須打破這些規(guī)則,我們鼓勵(lì)調(diào)查實(shí)施設(shè)計(jì)中的關(guān)鍵路徑,以確定修改層次結(jié)構(gòu)是否可能對(duì)設(shè)計(jì)的最終性能產(chǎn)生影響。
結(jié)論
????????綜合和布局布線算法的最新進(jìn)展使得實(shí)現(xiàn)特定器件的最佳性能變得更加簡(jiǎn)單。綜合工具能夠推斷復(fù)雜的算術(shù)和存儲(chǔ)描述并將其映射到專用硬件塊上。它們還執(zhí)行優(yōu)化,例如重定時(shí)和邏輯以及寄存器復(fù)制。基于時(shí)序約束,布局布線工具現(xiàn)在可以重構(gòu)網(wǎng)表并 執(zhí)行時(shí)序驅(qū)動(dòng)的封裝和布局,以最大限度地減少布局和布線擁塞。然而,給定一個(gè)特 定的 RTL 描述,這些工具只能做很多事情來最大化性能。如果設(shè)計(jì)中需要更高的性能,那么一個(gè)非常有效的方法是進(jìn)一步了解目標(biāo)器件,調(diào)整工具約束和選項(xiàng),并使用本文檔中說明的編碼指南。
總結(jié)
以上是生活随笔為你收集整理的提升设计性能的HDL编码方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何书写批处理文件?(批处理文件的介绍及
- 下一篇: 10天学会C语言