在進行數字電路系統的設計時,時序是否能夠滿足要求直接影響著電路的功能和性能。本文首先講解了時序分析中重要的概念,并將這些概念同數字系統的性能聯系起來,最后結合FPGA的設計指出時序約束的內容和時序約束中的注意事項。
一、時序分析中的重要概念
在數字系統中有兩個非常重要的概念:建立時間和保持時間,其示意圖如圖1所示。一個數字系統能否正常工作跟這兩個概念密切相關。只有建立時間和保持時間都同時得到滿足時,數字系統才能可靠的、正常的工作。

當寄存器的建立時間或保持時間不能得到滿足時,寄存器有可能會進入亞穩態( Metastable)。亞穩態是一種電壓的中間態,假設寄存器的輸出電壓大于3V判決為邏輯1,小于0.3V判決為邏輯0,那么電壓處于0.3V到3V之間并且能夠短時間穩定的狀態就是亞穩態。寄存器在進入亞穩態一段時間后會回復到正常的狀態,但是有可能回到邏輯1的狀態,也有可能回到邏輯0的狀態。這種不確定性就有可能引起數字系統的錯誤。
建立時間和保持時間是一個寄存器的固有屬性,是由其內部的結構、工藝等因素決定的,因而在進行數字系統設計時只能通過改變電路結構使其滿足建立時間和保持時間的要求,而不能改變建立時間和保持時間的值。
二、建立時間和保持時間對電路性能的影響
首先來看一個典型的同步數字系統的示意圖,見圖2。

在圖2中,FF1和FF2代表兩個寄存器,在兩個寄存器中間存在組合邏輯。同步的數字系統正是由許多的寄存器,以及寄存器中間的組合邏輯構成的(也包括寄存器間的直接連接)。
顯然,如果要數字系統正常工作,每個寄存器的建立時間和保持時間都必須得到滿足。假設時鐘信號ck到達所有寄存器的時間相同,圖3畫出了這兩個寄存器間的時序關系。

從圖中可以看到,如果要FF2的建立時間和保持時間得到滿足,必須要滿足以下公式:

其中Ts建立時間,Th為保持時間,Tclock為時鐘周期,Tclk2q為寄存器的傳輸延時(從時鐘有效沿到輸出的時間),Tdelay為兩個寄存器之間的組合邏輯延時。
從公式(1)中可以看出,建立時間是否能得到滿足取決于3個參數:時鐘周期、寄存器傳輸延時以及組合邏輯延時。其中寄存器的輸出延時是寄存器的固有屬性,不可更改,因而在設計中只能靠調節時鐘周期和組合邏輯的延時來滿足寄存器對于建立時間的要求。
從公式(2)中可以看出,保持時間能否得到滿足取決于2個參數:寄存器的傳輸延時和組合邏輯的延時,設計者能做的僅僅是調節組合邏輯的延時。
圖3僅僅是兩個寄存器之間的時序關系,在一個數字系統中往往包含有成千上萬個寄存器,任意兩個相鄰的寄存器之間的時序關系都必須滿足公式(1)和公式(2)的約束,只有如此數字系統才能正常工作。在數字系統可以正常工作的前提下,組合邏輯的延時就決定了數字系統能夠工作的時鐘頻率的上限。組合邏輯的延時越短,系統的工作頻率的上限就越高,這里的組合邏輯的延時指的是任意兩個相鄰的寄存器之間的最長的組合邏輯延時,也就是關鍵路徑的延時。當然,組合邏輯的延時也不能無限短,必須要滿足公式(2) 的要求。
三、在FPGA中對時序進行約束
在FPGA設計中,時序約束占有重要的地位。時序約束主要有兩方面的作用:第一,EDA工具會根據設計者的約束努力嘗試布局布線,盡量滿足設計者提出的時序方面的要求;第二,在EDA工具經過努力仍不能滿足設計者提出的時序要求時會給出警告信息,用以提示設計者。
在對設計進行約束時要做到恰到好處,太松或者太緊的約束都不能使電路達到最好的狀態。約束過松自不必提,約束過緊之后EDA軟件經過努力嘗試仍不能達到要求,但其不會取最接近目標的一次,而是將最后一次作為結果,可能導致電路性能更加惡化。
當今的FPGA設計中時序約束主要包括3種:一是寄存器到寄存器的約束,二是引腳到寄存器的約束,三是寄存器到引腳的約束。
寄存器到寄存器的約束是對時鐘周期的約束,對應于公式(1)中的Tclk2q+Tdelay+Ts,通常來講設計者應該對其所設計的系統需要多快的時鐘頻率有所了解,只要結合需求給出時鐘周期的約束即可。
在約束時鐘周期時,實際上保證的是兩個寄存器中后一級的寄存器。第一級寄存器連接在FPGA的外部引腳上,那么第一級寄存器能否滿足其建立時間和保持時間的約束就取決于引腳上時鐘和數據的關系以及各自到達寄存器的延時。假設引腳時鐘和內部時鐘是同步的(頻率和相位都同步),那么數據引腳和時鐘引腳的時序關系以及從引腳到寄存器輸入端的延時共同決定了第一個寄存器的建立時間和保持時間能否得到滿足,設計者可以對數據引腳到寄存器輸入端的延時進行約束。
為了保證FPGA的輸出信號和時鐘的時序關系達到預期的效果,比如達到后一級芯片對時鐘和數據時序關系的要求,設計者可以對寄存器的輸出到引腳所經歷的延時進行約束。
以上三種約束就可以涵蓋設計中的所有寄存器。但是在某些特定的情況下,比如異步時鐘域時,我們清楚地知道某些寄存器會發生建立時間或者保持時間不滿足的情況,但這是不可避免的,設計者也已經對其進行了處理。在這種情況下,設計者最好告訴EDA軟件忽略這些路徑,否則EDA軟件會努力嘗試解決這些路徑的時序沖突,既費時又沒有效果。