1.扇出太多引起的時序問題
信號驅動非常大,扇出很大,需要增加驅動能力,如果單純考慮驅動能力可以嘗試增加 buffer 來解決驅動能力,但在插入buffer的同時增加了 route 的延時,容易出現時序報告評分問題。
解決該問題常用方法為進行驅動信號邏輯復制,即對扇出很大的信號產生邏輯進行多次復制,生成多路同頻同相的信號去驅動下級邏輯電路。保證了時延同時也增大了驅動能力。但是該方法在使用過程中可以和buffer一起使用,平衡資源利用率和時延,防止資源分配不均或者時序考慮不周。
2.對於時鍾頻率要求較高導致的上升沿下降沿對不同的寄存器操作的問題
首先分析該問題產生原因,如果上升沿下降沿都使用,就相當於是電平觸發,電平觸發比時鍾沿觸發更容易受到干擾,所以,一般不同時,對一個時鍾的上升沿和下降沿分別對不同的寄存器操作。
1)將時鍾通過MMCM或者PLL產生180相移產生新的時鍾,新的始終的上升沿就是原時鍾的下降沿,從而實現都為上升沿觸發。
2)使用全局時鍾資源中的 INV 實現對原時鍾信號取反,然后新的時鍾信號的上升沿就是原時鍾的下降沿。
另外對於其他方法要思考,比如對原時鍾信號進行倍頻實現上升沿下降沿均為上升沿,這個方法直接提升系統時鍾速率一倍,如果不是時鍾速度太高這個上升沿下降沿問題也不會出現了,故,該方法暫不考慮。還有就是對於時鍾的使用一定要使用PLL或者MMC這些專門的時鍾內核生成。
3.布局太差導致的布線延遲太高問題
布線延遲太高問題一般有兩種情況:
1)一種是布線扇出太多導致的問題,另外再對扇出太多補充一點,扇出太多而增加buffer提高驅動能力,而普通I/O信號或片內信號進入BUFG到從BUFG輸出,有大約10ns的固定時延,但是BUFG到片內所有單元的延時可以忽略為0ns。這個問題在問題1中已經給出了解決方案,也就是通過邏輯復制的方法解決。
2)是本身各種信號扇出並不多,邏輯時間也不是很大,但是布線延遲很大,這種問題就是布局太差的問題。
相應的解決方案有:通過ISE布局工具中調整布局的努力程度(effort level),特別努力程度(extra effort),MPPR選項,實在不行的話就嘗試使用Flootplanner相對區域約束重新對設計進行布局規划。
4.出現邏輯級數過多情況
也就是邏輯計算時間比較大,這種情況一般不屬於時序問題,而屬於程序編寫問題,盡量不要嵌套IF ELSE語句或者CASE語句嵌套,能用CASE語句盡量不用IF ELSE語句,還有就是在使用IF 語句和CASE語句時注意防止產生不必要的鎖存器。
等待繼續補充。。。