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