一、基本時序路徑
1.FPGA內部來說,常見的基本時序路徑(即靜態時序分析對象)有以下四類:
(1)內部寄存器之間的時序路徑,即reg2reg
(2)輸入引腳到內部寄存器的時序路徑,即pin2reg
(3)內部寄存器到到輸引腳的時序路徑,即reg2pin
(4)輸入引腳到輸出引腳的時序路徑,即pin2pin
其中前三類路徑是和內部寄存器reg和時鍾CLK有關的,因此還需關注內部數據信號與時鍾鎖存沿的建立時間和保存時間(具體見時序分析一),而最后一類信號的傳輸通常不經過時鍾,因此它的約束也相對簡單一些,一般直接約束pin2pin的延時值得范圍即可。(另有一種說法是以上的時序分析都是針對時鍾驅動的電路進行的,並且分析對象均為‘寄存器-寄存器對’,把引腳pin看作是在引腳外部虛擬一個寄存器做為分析對象,其實怎么看都行),不說了,先上圖,四種時序路徑如下圖1
圖1 常見的4種時序路徑
2.具體的約束方法:
1>.reg2reg的約束對象為路徑起始的源寄存器到最終的目的寄存器在FPGA里面的路徑,對於reg2reg的約束方法,只要告訴時序約束工具他們的時鍾頻率(或時鍾周期),約束工具就可以讓此路徑的延時符合時鍾頻率所要求的范圍,其實就是使Setup Slack和Hold Slack大於0;見圖2

圖2
2>.pin2reg必須參考芯片的數據手冊給出的時序信息來進行約束,如數據在芯片內部的延時Tco,Tsu和Th等;也可利用圖3 pin2reg來約束,即圖中大圈表示reg2reg(pin2reg看為其內部的路徑),小圈就是pin2reg,而我們就是要約束大圈內小圈外的部分

圖3
3>.reg2pin通過芯片給出的引腳信息來約束,跟圖3差不多啦,只不過變為輸出而已。
4>.pin2pin路徑基本是一些組合邏輯和走線延時,在純組合邏輯內部較常見,無所謂的保持時間和建立時間,我們只需要關心信號通過此路徑的延時時間范圍,在做約束時,只需要把最大,最小延時值傳達給時序設計工具即可。
3.下面直接給出各路徑的約束計算公式,說簡單點就是滿足Setup Slack和Hold Slack就ok啦!
1>.reg2reg:寄存器-寄存器( Register-to-Register)
建立時鍾余量:
Clock Setup Slack = Data Required Time – Data Arrival Time
Data Arrival Time = Launch Edge + Clock Network Delay Source Register+μtco + Register-to-Register Delay
Data Required Time = Clock Arrival Time – μtsu – Setup Uncertainty
Clock Arrival Time = Latch Edge + Clock Network Delay to Destination Register
保持時鍾余量:
Clock Hold Slack = Data Arrival Time – Data Required Time
Data Arrival Time = Launch Edge + Clock Network Delay to Source Register+μtCO + Register to Register Delay
Data Required Time = Clock Arrival Time + μtH + Hold Uncertainty
Clock Arrival Time = Latch Edge + Clock Network Delay to Destination Register
2>.reg2pin: 寄存器-輸出引腳
建立時鍾余量:
Clock Setup Slack Time = Data Required Time – Data Arrival Time
Data Arrival Time = Launch Edge + Clock Network Delay to Source Register + Input Maximum Delay of Pin + Pin-to-Register Delay
Data Required Time = Clock Arrival Time – μtsu
Clock Arrival Time = Latch Edge + Clock Network Delay to Destination Register
保持時鍾余量:
Clock Hold Slack Time = Data Arrival Time – Data Required Time
Data Arrival Time = Launch Edge + Clock Network Delay to Source Register + Input Minimum Delay of Pin + Pin to Register Delay
Data Required Time = Clock Arrival Time + μtH
Clock Arrival Time = Latch Edge + Clock Network Delay to Destination Register
3>.pin2reg: 輸入引腳-寄存器
建立時鍾余量:
Clock Setup Slack Time = Data Required Time – Data Arrival Time
Data Arrival Time = Launch Edge + Clock Network Delay to Source Register +μtco + Register-to-Pin Delay
Data Required Time = Clock Arrival Time – Output Maximum Delay of Pin
Clock Arrival Time = Latch Edge + Clock Network Delay to Destination Register
保持時鍾余量:
Clock Hold Slack Time = Data Arrival Time – Data Required Time
Data Arrival Time = Launch Edge + Clock Network Delay to Source Register +μtCO + Register to Pin Delay
Data Required Time = Clock Arrival Time – Output Minimum Delay of Pin
Clock Arrival Time = Latch Edge + Clock Network Delay to Destination Register
哈哈,是不是快要看傻了,細心的孩子還是可以發現一點規律的,現在讓我們先來分析一下吧,這邊的Setup Slack和Hold Slack和《Altera系列FPGA時序分析一》的東西是一樣的啦,只做了一下小小的變通哦。先拿Setup Slack來開刀吧。
從上面三組公式可以看出: Data Arrival Time的前兩項是相同的; Data Required Time的第一項是相同的; Clock Arrival Time的公式是相同的。
Clock Setup Slack Time = Data Required Time – Data Arrival Time
Data Arrival Time = 時鍾到達前級寄存器的時刻 + 前級寄存器時鍾到后級寄存器數據輸入的延遲。
Data Required Time = 時鍾到達后級寄存器的時刻 – 后級寄存器的建立時間。
其中,兩個公式的第二項在其他情況下適當修改即可。這就和一些書中講到時序分析時采用的公式一致了。明白了嗎?
現在Hold Slack也就相對簡單點了嘛,哈哈,你又要被搞掉了,以下內容留給讀者自己去動手解決。
其實嘛,時序約束是一件特別難搞的事,如果你以為你掌握了上述公式就可以做出完美的時序約束來,那你就大錯特錯了,記得以前我們高中數學老師講過,任何公式都是有使用前提的,如果忽略了它的使用條件,得出來的結果基本都是錯的,就算結果蒙對了,思維還是不夠嚴謹的,看來我寬哥威武啊!好啦,再來說說Launch Edge和Latch Edge;
建立時間檢查須滿足的條件如下:信號從Launch Edge開始計時,經過一系列的時序路徑,到達后級寄存器的數據輸入Pin的速度不能太慢,時間不能太長,否則會侵占后級寄存器數據輸入Pin相對於Latch Edge的建立時間。剛好滿足后級寄存器建立時間的數據到達時間是Data Required Time( 相對於Latch Edge計算),實際的數據到達時間是Data Arrival Time(相對於Launch Edge計算)。顯然,在建立時間檢查中,Data Arrival Time要小於Data Required Time,否則就會造成建立時間違規。也就 是說,Data Required Time是Data Arrival Time的最大值。二者之差就是建立時間的時序余量。建立時間檢查時,Timequest分析每個寄存器至寄存器通路的Launch Edge和 latch edge來確定建立關系。對於目標寄存器的每個Latch Edge, Timequest使用最靠近源寄存器的前一時鍾的邊沿做為Launch Edge。
保持時間檢查須滿足的條件如下:信號從Launch Edge開始計時,經過一系列的時序路徑,到達后 級寄存器的數據輸入Pin的速度不能太快,時間不能太短,否則會侵占后級寄存 器數據輸入Pin相對於上一個Latch Edge的保持時間。剛好滿足后級寄存器保持時 間的數據到達時間是Data Required Time(相對於Latch Edge計算),實際的數據 到達時間是Data Arrival Time(相對於Launch Edge計算)。顯然,在保持時間檢 查中, Data Arrival Time要大於Data Required Time,否則就會造成保持時序違規。 也就是說, Data Required Time是Data Arrival Time的最小值。二者之差就是保持 時間的時序余量。 建立時間檢查和保持時間檢查都是同步邏輯設計中對同一個規則的不同解 釋:當前時鍾沿發出的數據要在下一個時鍾沿被正確捕獲,不能晚,也不能早。 晚了會造成下一個時鍾沿的建立時間違規,當前時鍾沿發送的數據不能被下一個 時鍾沿捕獲;早了會造成上一個時鍾沿發送的數據保持時間違規,上一個時鍾沿 發送的數據不能被當前時鍾沿正確捕獲。二者在計算公式上的區別在於Slack計 算公式中減數與被減數關系。 Timequest分析器對每一種建立關系進行兩種保持檢查。第一種保持檢查確 定當前Launch Edge的數據沒有被前一Latch Edge捕獲到。第二種保持檢查確定下一Launch Edge沒有被當前Latch Edge捕獲到。需要注意的是,在Hold Slack計算中公式中的Latch Edge實際對應的是上一個Launch Edge。所以,當launch clock和latch clock是同一個時鍾時,上述公式中的Latch Edge等於0;當前級和后級時鍾不同時,還需要具體計算Latch Edge的取值。
好啦,差不多就是這樣子理解就好了,我也不知道讀者們懂了沒,感覺說得太多了。如果有什么不正確的地方,請各位大俠指出,小弟定會好好改正,小編也會加緊修煉,增強功力,在與各高手過招的過程中不斷學習。實際上吧,個人認為時序約束是FPGA開發設計中最難搞的一塊,還需要計算PCB上的走線延時,什么最大最小延時之類的,好吧,真的太多了。
小編在這兩篇博客中也省略了不少東西,比如恢復時間和移除時間啊,還有一些概念也沒寫出來吧,還有一些約束常用的語法未講;過大家注意到一點東西沒,就是這里全是理論知識,
還需要讀者們親手去試試,做一下約束,畢竟,理論和實踐的差距真的挺大的。小編在這邊就做得不好啦。當然這里的東西不一定全對,我怕會誤導大家,如果是這樣的話,小編是個罪人了,千古罪人啊。最后送給大家一句話:
盡信書不如無書!
