單擊Design Summary中的Static Timing就可以啟動時序分析器(Timing Analyzer)。

在綜合、布局布線階段ISE就會估算時延,給出大概的時延和所能達到的最大時鍾頻率,經過PAR后,在Static Timing中給出的是准確的時延,給出的時序報告可以幫助我們找到關鍵路徑,然后針對其進行優化,提高系統的時鍾頻率。

這里的Minimum period指的是最小的邏輯延遲;
造成時序性能差的原因很多,主要緣由以下幾種:
1. 布局太差
一般和代碼本身沒有關系。解決方案:只能從軟件自身的布局算法考慮(調整布局的努力程度)或者使用高端芯片
2. 邏輯級數太多
邏輯級數越多,資源的利用率越高,但是對工作頻率的影響也越大。解決方案:1.使用流水線技術;2.如果是多周期路徑,添加多周期約束;3.良好的編碼習慣,不要過多嵌套if-else,盡量使用case代替if語句。
3. 信號扇出過高
高扇出會造成信號傳輸路徑過長,從而降低時序性能。解決方案:1.邏輯復制;2.區域約束,想過邏輯放置在一起。
4. 不要同時使用雙邊沿觸發
FPGA的底層工藝都是單向的同步電路,所以本身不支持統一信號的雙邊沿觸發,ISE在實際處理的時候,會自動將該信號2倍頻,然后利用第一個沿處理上升沿,第二個沿處理下降沿。這樣在分析時序時,自動把約束升級為ucf文件中的兩倍。
5. Xilinx最優時序解決方案
1.I/O約束
根據Xilinx器件的特點,控制信號置於器件的頂部或底部,且垂直布置;數據總線的I/O置於器件的左右兩側,且水平布置,這樣可以最大程度的利用芯片底層結構。
2.ISE實現工具
ISE中的工具具備不同的努力程度,直接使用最高級別的可以提高時序性能,但是會耗費很多時間,所以應該逐步調整努力程度。第一遍使用默認的參數選項,如果不滿足 再調整綜合、映射、布局布線的參數。
時序優化的若干策略
優化方向一:合理使用Blcok RAM和Distributed RAM
1. 均衡Block RAM和Distributed RAM的使用。如果Block RAM使用的過多而Distributed RAM使用的較少,建議將一些小型的FIFO用Distributed RAM來實現;如果Distributed RAM使用的過多,而Block RAM有大量富余,建議將一部分由Distributed RAM實現的FIFO改用Block RAM來實現。
2. 當需要使用Block RAM來構建大型的FIFO用作緩存時,由於Block RAM也是分布在FPGA的不同位置,當構建一個FIFO使用的RAM太多時,會給布局布線帶來很大的壓力。所以建議實施的時候可以用多個中型的FIFO帶代替一個大型的FIFO。
3. 不宜使用distributed RAM構建大位寬或者大深度的FIFO。
優化方向二:合理放寬時序約束
1. 當芯片設計中有多個時鍾域時,對於那些通過FIFO隔開的時鍾域之間,並不需要有太嚴格的約束。
2. 如果這些不相關的異步時鍾是通過同一個MMCM產生的,如果不對這些異步時鍾單獨約束,那么按照軟件的默認行為,這些異步時鍾之間的路徑是按同步路勁的分析方法進行分析的。這種默認行為的結果就是,一些不應該那么嚴格約束的路勁被過約束了。
3. 針對這種現象,一種可行的方案是:對同一個MMCM輸出的多個異步時鍾分別進行時序約束,並且只需約束兩時鍾域之間異步線路的最大布線延遲,而不需將異步線路中時序邏輯與LUT的響應時間納入時序約束的范圍。
4. Tip3中提及的時序約束方案的示例如下:
NET "CLKA" TNM_NET = "GRP_A";
NET "CLKB" TNM_NET = "GRP_B";
TIMESPEC TS_Path_A_B = FROM "GRP_A" TO "GRP_B" 5 ns DATAPATHONLY;
優化方向三:設置合理的實現工具屬性
1. 嘗試將synplify->Implementation option->Device->Enable advanced LUT combining屬性關閉。
2. 嘗試將ISE中Map Properties->Combinatorial logic optimization屬性打開。
3. 嘗試將ISE中Map Properties->Register duplication 屬性打開。
4. 嘗試將ISE中Map Properties->Allow logic optimization across hierarchy屬性打開。
5. 嘗試將ISE中Map Properties->LUT conbining屬性關閉。
優化方向四:優化代碼
1. 對於那些輸出線扇出太大的寄存器,可以考慮在代碼中手動復制。為避免復制的寄存器在綜合階段被優化掉,如果使用的是synplify綜合工具,可在寄存器定義時使用綜合指導屬性/* synthesis syn_keep=1 */。
2. 不宜在一個寄存器前放置過多的組合邏輯,如果一個功能涉及的組合邏輯過於復雜,最好是將組合邏輯較均勻的分布在各個寄存器前面。
