1. 程式人生 > >vivado xdc約束基礎知識8:Vivado時序收斂的方法

vivado xdc約束基礎知識8:Vivado時序收斂的方法

Vivado時序收斂的方法

一個好的FPGA設計一定是包含兩個層面:良好的程式碼風格和合理的約束。時序約束作為FPGA設計中不可或缺的一部分,已發揮著越來越重要的作用。毋庸置疑,時序約束的最終目的是實現時序收斂。時序收斂作為 FPGA設計的重要驗證手段之一,是保證FPGA正常工作的必要條件。那麼當時序無法收斂時我們應該採取怎樣的措施呢?

首先需要明確一點,與ISE有顯著不同,在Vivado中綜合是時序驅動的綜合,綜合後的時序報告是可信的,因此要在綜合之後就開始閱讀時序報告,進行時序分析。

如下圖所示,總體而言,在綜合之後,如果時序未收斂(可以有-300ps的slack),那麼此時所能做的就是優化程式碼或者相關的模組,還有就是優化約束。這時更多關注的是程式碼風格引發的問題。

這和UltraFAST設計方法學的理念是一致的,儘可能地儘早發現潛在的問題,在設計前端把問題解決掉。在生成綜合後的時序報告時,有一個選項值得大家注意,如下圖紅色標記所示。為了發現關鍵路徑(Slack最差的路徑)可以將Interconnect設定為none,意味著相應的線延遲為0,這時就只有門級延時(本身綜合後的網表就只有門級延時)

佈局佈線後如果時序未收斂,可採取的措施更多的關注於相應的佈局佈線策略以及時序約束的合理性,可見,此時我們所能採取的措施相對單一一些,儘管也可以重新優化RTL程式碼,但需要重新綜合、佈局佈線,必然費時費力。因此,在開始FPGA設計時最好遵循UltraFAST設計方法學所提供的設計理念,在寫程式碼時做到心中有時序目標。

為了確保時序收斂,應從以下幾個方面著手:

1. 程式碼風格
良好的程式碼風格可以確保綜合後網表的高質量。因此,在寫程式碼時要注意:
(1) 合適的復位:對於復位要遵循“全域性復位區域性化,非同步復位同步化”的原則;
(2) 儘可能少的控制集:控制集由CLK、CE、RST構成,控制集種類過多會導致觸發器分散到不同的SLICE中,導致線延時過大,同時也降低了資源的利用率;
(3) 避免使用鎖存器:鎖存器會導致觸發器資源浪費,因此,可將鎖存器轉換為帶使能的觸發器;

(4) 與器件結構相匹配的程式碼描述:例如Xilinx 7系列FPGA中的觸發器是高有效,那麼程式碼描述時也要採用高有效,以使描述物件能夠很好地對映到目標器件中。

2. 時鐘樹

時鐘的FPGA設計中必然會用到的資源,規劃好時鐘的個數以及時鐘之間的關係至關重要,這直接決定了時鐘資源的利用率。顯然,時鐘個數過多會給時序收斂帶來一定挑戰。

3. 關於約束
(1) 確保合理的時鐘約束,通過report_clock_networks檢視約束物件是否為root clock,通過report_clock_interatcion來檢視時鐘之間的關係;通過report_cdc來檢視跨時鐘域之間的路徑約束是否合理;

(2) 多週期路徑與偽路徑約束越少越好;

4. 檢視線延時

如果線延時過大,可通過兩種方法來降低線延時:程式碼優化和手工佈局。

5. 嘗試不同的實現策略
Vivado提供了五大類實現策略,同時支援執行多個Implementation,如下圖所示。因此,在Vivado中嘗試不同的策略將變得非常容易。