FPGA設(shè)計時序約束六、設(shè)置最大/最小時延
一、背景
????在設(shè)計中,有時需要限定路徑的最大時延和最小時延,如沒有特定時鐘關(guān)系的異步信號,但需要限制最大時延和最小時延,也可以對端口到端口(中間無寄存器)的路徑設(shè)置最大時延和最小時延,設(shè)置最大時延和最小時延會影響當(dāng)前的setup和hold時序分析。
二、Max/Min_delay約束
????設(shè)置路徑最大時延和最小時延的命令為set_max_delay,set_min_delay,可在Timing Constraints窗口進(jìn)入Exceptions中,選擇Set Maximum Delay或Set Minimum Delay,即為選擇最大時延或最小時延。

2.1 約束設(shè)置參數(shù)
以設(shè)置最大時延為例,雙擊Set Maximum Delay進(jìn)入設(shè)置窗口
Targets設(shè)置

Specify path delay:設(shè)置路徑最大時延值,可為正整數(shù)或負(fù)整數(shù)
From:設(shè)置路徑的起點,對象可以是Clocks,Cells,Cell?pins,I/O ports
Through:設(shè)置路徑的中間經(jīng)過點,對象可以是Net,Cells,Cell pins
To:設(shè)置路徑的終點,對象可以是Clocks,Cells,Cell?pins,I/O ports
Options設(shè)置

Rise/Fall:勾選后可設(shè)置最大時延只對上升沿觸發(fā)或下降沿觸發(fā)的路徑有效,未勾選時不區(qū)分邊沿觸發(fā)。
Set Maximum...ignored):勾選后設(shè)置的時延約束只對數(shù)據(jù)路徑有效,時鐘偏斜和hold檢查會被忽略,即等效于該路徑也設(shè)置了set_false_path -hold約束,此時如果約束中設(shè)置了set_min_delay約束也不會生效。并且該設(shè)置不能用于set_min_delay約束中。
Remove...path delays:勾選后,如果設(shè)置的約束路徑上有其他時例外約束(如false_path,multicycle約束,最大最小時延約束都將被移除)
2.2 約束說明
????對于輸入輸出邏輯的約束,將不會使用set_max_delay/set_min_delay,對于輸入端口到第一級寄存器或最后一級寄存器到輸出端口的邏輯路徑,通常使用set_input_delay
/set_output_delay約束,set_max_delay/set_min_delay通常用于約束輸入端口和輸出端口間的純組合邏輯路徑。
????set_max_delay另一個常用的場景是沒有時鐘關(guān)系的異步信號,但需要設(shè)置最大時延。兩個異步時鐘路徑可以使用set_clock_group或set_false_path,從而不會進(jìn)行時序分析。當(dāng)異步時鐘間的設(shè)計合理,如FIFO中的兩級同步寄存器,要放寬約束,保證兩個時鐘間的路徑延時符合實際情況,就需要使用set_max_delay。
????在多比特跨時鐘域(CDC)場景中,比特之間的偏斜必須在一定要求時間內(nèi),雖然偏斜可以通過set_bus_skew來約束,但必須確保兩個時鐘域間的時延不能太大。此時可以通過約束set_max_delay -datapath_only代替set_false_path/set_clock_groups。
????如果對于兩個時鐘域間的部分路徑或全部路徑的最大時延必須明確時,就必須使用set_max_delay?-datapath_only約束。這種場景下,set_clock_groups不能用來定義兩個時鐘作為異步時鐘,因為從約束的優(yōu)先級角度看它將取代set_max_delay。其他跨時鐘域路徑就必須聯(lián)合約束set_false_path或set_max_delay constraints.
?2.3 路徑分段
????不同于約束文件XDC中的其他約束,在設(shè)置最大時延和最小時延中,參數(shù)-from和-to選項為設(shè)置約束的起點和終點,在設(shè)置時,有些起點和終點對于約束來說是無效的。當(dāng)設(shè)置了一個無效的起點時,為了讓節(jié)點成為一個有效的起點,時序分析工具會阻止時序路徑通過該節(jié)點。
以如下約束為例,最大延時約束的起點為有效起點

如果約束設(shè)置到FD1/Q,時序分析工具將會斷開從C->Q的路徑,從而使得引腳Q為有效的起點。這種為了創(chuàng)建有效的起點而將時序路徑斷開的做法稱為路徑分段,路徑分段對最大時延和最小時延都會有影響,同時也會影響經(jīng)過這些節(jié)點(FD1/Q,FD1/C)的時序約束。

路徑分段的影響
有序設(shè)置最大/最小時延導(dǎo)致路徑分段,對于從起點FD1/Q的時序路徑將無啟動時鐘,因為終點的時鐘偏斜將會考進(jìn)來。因此,將有可能導(dǎo)致大的時鐘偏斜,如下圖所示。

在路徑分段后,將沒有默認(rèn)的hold要求時間,如果沒有選擇-datapath_only選項,使用set_min_delay命令設(shè)置hold要求時間。正式由于分段帶來風(fēng)險,出現(xiàn)路徑分段時將會有告警提示。
如果一定要將輸出FD1/Q最為約束的起點,而又不想去考慮時鐘偏斜的影響,則可以勾選-datapath_only來解決。
類似的,如果設(shè)置了一個無效的終點時,為了該節(jié)點成為有效的終點,也會出現(xiàn)路徑分段,
以LUTA/O為終點為例

為了使得LUTA/O為有效的終點,時序分析工具將會斷開LUTA/O后面的路徑,因此,所有經(jīng)過LUTA/O的setup/hold路徑都會受影響,對于REGA/C為起點和LUTA/O為終點的路徑,時鐘偏斜將會很大。
在下圖中,設(shè)置約束
由于LUTA/O不是有效的起點,將在LUTA/O處出現(xiàn)路徑分段,LUTA/I0到LUTA/O的時序路徑將斷開。盡管約束只設(shè)置在了LUTA/O和REGB/D間,REGA/C到REGC/D的路徑也受影響被斷開。

路徑分段與時序例外
路徑分段也可能導(dǎo)致時序例外的優(yōu)先級告警,特別是對于set_clock_groups和set_max_delay,如以下兩個場景
場景1?
最大延遲約束設(shè)置在兩個instance中,如果instance設(shè)有set_clock_groups -asynchronous約束,當(dāng)vivado選擇instance的一個有效的起點時,set_max_delay約束將會被覆蓋
場景2
約束是從pin引腳到inst的引腳,此時,如果instance設(shè)有set_clock_groups -asynchronous約束,set_max_delay約束將不會被覆蓋。原因是路徑分段將讓路徑起點pin不再被認(rèn)為是第一個時鐘域所啟動的起點,因此set_max_delay不會被覆蓋,從而約束有效。
三、工程示例
3.1 工程代碼
以跨時鐘域路徑ff1_reg/C到ff2_reg/D的路徑為例,設(shè)計代碼
網(wǎng)表連接

約束設(shè)置
3.2 時序報告
在report timing summary中,查看inter-clock paths中查看跨時鐘域路徑,在setup分析中,setup requirement即為設(shè)置的set_max_delay值5ns。

hold分析的requirement值為set_min_delay值2ns

在目的時鐘路徑上,時延值直接加上設(shè)置的時延值


總結(jié):set_max_delay設(shè)置的值即為該路徑的setup Requirments值,set_min_delay設(shè)置的值即為該路徑的holdup?Requirments值
四、參考資料
用戶手冊:ug903-vivado-using-constraints-en-us-2022.2.pdf
鏈接:https://pan.baidu.com/s/17AK_-J4wRXiFLtLTorlrwg?pwd=mylt?
提取碼:mylt??