FPGA設(shè)計(jì)時(shí)序約束四、多周期約束
一、背景
????對(duì)于Vivado時(shí)序分析工具,默認(rèn)情況下是進(jìn)行單個(gè)周期內(nèi)的時(shí)序分析,這種分析存在一定的局限性,對(duì)于一些特殊的邏輯路徑不適用,例如,對(duì)于數(shù)據(jù)從起點(diǎn)到達(dá)終點(diǎn)的時(shí)間需要超過一個(gè)時(shí)鐘周期以上的場(chǎng)景。如果設(shè)計(jì)中控制電路的路徑從起點(diǎn)到終點(diǎn)大于一個(gè)周期是符合設(shè)計(jì)需要的,此時(shí),就需要使用多周期路徑約束來放寬setup時(shí)間。通俗理解,多周期約束即調(diào)整時(shí)序分析中源時(shí)鐘邊沿與目的時(shí)鐘邊沿的位置關(guān)系。
二、set_multicycle_path
????設(shè)置多周期路徑使用命令set_multicycle_path,進(jìn)入Edit Timing Constraints中的Set Multicycle Path窗口。對(duì)象設(shè)置欄含義如下圖。
a)Targets界面

Specify path_multiplier:設(shè)置多周期約束的數(shù)目,必須為大于0的整數(shù),默認(rèn)為1時(shí)為setup/recovery分析,為0時(shí)即hold/removal分析
Start Points:多周期約束的起點(diǎn)
Through Points:多周期約束中經(jīng)過的位置
End Points:多周期約束的終點(diǎn)
? ?Hold和Setup的分析邊沿存在關(guān)聯(lián)關(guān)系,對(duì)于大部分場(chǎng)景,可用下面的公式獲得hold周期的個(gè)數(shù)。
Hold移動(dòng)周期數(shù)=setup路徑的Multiplier-1-hold路徑的Multiplier。默認(rèn)的setup路徑的Multiplier是和目的時(shí)鐘相關(guān)聯(lián),使用-start參數(shù)修可以修改setup時(shí)序要求,類似地,holdup周期數(shù)和源時(shí)鐘有關(guān),使用參數(shù)-end可以修正。
命令格式示例:?
?set_multicycle_path -fall_from?[get_pins ff1_reg/C] -rise_to [get_pins ff2_reg/C] 2?
b)options界面

Setup/Hold:設(shè)置多周期約束路徑進(jìn)行時(shí)序分析類型為setup或hold
Rise/Fall:設(shè)置多周期約束是針對(duì)上升沿Rise還是下降沿Fall,默認(rèn)上升沿Rise
Start/End:設(shè)置約束中Multiplier的周期數(shù)的參考時(shí)鐘是源時(shí)鐘(startpoint)還是目的時(shí)鐘(endpoint)
Remove existing path exceptions before setting multicycle path: 對(duì)于設(shè)置多周期約束的路徑上如果存在其他時(shí)序例外約束的,勾選后將會(huì)移除,不勾選則保留該約束
?c)setup與hold關(guān)系
????對(duì)于一條時(shí)序路徑上setup和hold的關(guān)系如下圖,對(duì)于源時(shí)鐘的啟動(dòng)沿,setup考慮的是一個(gè)源時(shí)鐘周期后的邊沿與源時(shí)鐘對(duì)應(yīng)的目的時(shí)鐘的邊沿,即尋找啟動(dòng)沿之后最近的一個(gè)捕獲沿,可見圖中“setup關(guān)系”的兩個(gè)邊沿,hold考慮的是和源時(shí)鐘啟動(dòng)沿對(duì)應(yīng)的目的時(shí)鐘邊沿,即尋找與啟動(dòng)沿對(duì)齊或在啟動(dòng)沿前面最靠近的一個(gè)捕獲沿,如“hold關(guān)系1”和“hold關(guān)系2”的2組邊沿。

對(duì)于源時(shí)鐘和目的時(shí)鐘非同相同頻率時(shí),需要指定-start,-end來指定參考時(shí)鐘,啟動(dòng)沿和捕獲沿與參數(shù)-start和-end在setup/hold時(shí)序分析中的關(guān)系如下表

????注:當(dāng)源時(shí)鐘和目的時(shí)鐘相同或波形相同或不存在相位差時(shí),使用start和end參數(shù)將沒有明顯的區(qū)別,因?yàn)榇藭r(shí)選擇源時(shí)鐘或目的時(shí)鐘作為參數(shù)時(shí)鐘都是同一個(gè)時(shí)鐘。
三、多周期約束場(chǎng)景
????下面,將針對(duì)一些常見的多時(shí)鐘周期約束場(chǎng)景進(jìn)行約束設(shè)置的說明,同時(shí)使用圖片對(duì)setup/hold multipliers值以及參數(shù)-start,-end對(duì)時(shí)序路徑的影響進(jìn)行解釋。
????時(shí)序分析工具STA分析時(shí)序默認(rèn)的setup和hold關(guān)系如下圖

setup檢查
????Td(max)<Tclk(t=T)-Tsetup? ? ? ? =》數(shù)據(jù)傳輸?shù)淖畲髸r(shí)延加寄存器的setup時(shí)間小于一個(gè)周期
hold檢查
????Td(min)>Tclk(t=0)+Thold? ? ? ? ? =》數(shù)據(jù)傳輸?shù)淖钚r(shí)延要大于寄存器的holdup時(shí)間
3.1 單時(shí)鐘域的多周期約束
????在發(fā)起時(shí)鐘和捕獲時(shí)鐘為同一個(gè)時(shí)鐘,或兩個(gè)時(shí)鐘有相同的波形(并且不存在相移)時(shí),時(shí)序路徑屬于單時(shí)鐘域內(nèi)的時(shí)序路徑,在數(shù)據(jù)傳輸?shù)侥康臅r(shí)鐘的寄存器需要多個(gè)時(shí)鐘周期時(shí),就需要設(shè)置多周期約束。

以捕獲時(shí)鐘每?jī)蓚€(gè)周期進(jìn)行數(shù)據(jù)捕獲為例(通過使能信號(hào)每2個(gè)周期生效一次),觸發(fā)器data1_reg每2個(gè)clk周期進(jìn)行一次數(shù)據(jù)采集

多周期約束命令
約束中僅僅對(duì)setup設(shè)置了約束,但setup和hold的關(guān)系都會(huì)改變,設(shè)置多周期約束前setup邊沿和hold邊沿在源時(shí)鐘和目的時(shí)鐘的關(guān)系如下圖。

設(shè)置多周期約束后,setup邊沿和hold邊沿在目的時(shí)鐘中前移一個(gè)周期

但觸發(fā)器data0_reg中數(shù)據(jù)的hold邊沿實(shí)際并未改變,因此,需要hold的關(guān)系通過多周期約束回到初始的邊沿對(duì)比。
-end參數(shù)配合-hold時(shí),表示捕獲時(shí)鐘的邊沿往回移動(dòng)。另外,如果源時(shí)鐘和目的時(shí)鐘為相同的時(shí)鐘時(shí),-end可以省略,兩條多周期約束的效果如下圖

當(dāng)setup multiplier為4時(shí),對(duì)應(yīng)的約束為
對(duì)應(yīng)的波形效果如下圖

下面,繼續(xù)以移動(dòng)setup的多周期為例
樣例1:setup=5
只對(duì)setup約束5個(gè)周期的周期時(shí)延,約束命令為:
由于未指定hold的時(shí)延周期,將自動(dòng)的根據(jù)setup 啟動(dòng)沿和捕獲沿推斷出。通常情況,setup的multiplier是針對(duì)捕獲時(shí)鐘,將捕獲時(shí)鐘前移,hold的mulitplier未指定,因此捕獲時(shí)鐘中檢查hold的邊沿比setup檢查的邊沿提前一個(gè)周期,波形圖如下。

由于hold有4個(gè)周期的移動(dòng),在時(shí)序路徑上必須插入大量的時(shí)延,增加不必要的面積和功耗,因此,也得放寬hold的要求,見樣例2。
樣例2:setup=5/hold=4
多周期約束命令為
對(duì)應(yīng)的波形圖為:

由于源時(shí)鐘和目的時(shí)鐘波形相同,相位調(diào)整后和下圖波形效果相同

總結(jié):在一個(gè)時(shí)鐘域內(nèi)或源時(shí)鐘和目的時(shí)鐘波形相同且無相移時(shí),對(duì)setup multiplier設(shè)置了N個(gè)周期時(shí),對(duì)hold multiplier設(shè)置N-1個(gè)周期
3.2 多周期路徑與時(shí)鐘相移
?????有時(shí),時(shí)鐘約束必須定義兩個(gè)有相同周期的時(shí)鐘域,但兩個(gè)時(shí)鐘存在相移,此時(shí),理解默認(rèn)的setup和holdup關(guān)系是至關(guān)重要的,不合適的約束會(huì)導(dǎo)致兩個(gè)時(shí)鐘間的邏輯過度約束。

假設(shè)clk1和clk2有相同的波形,但clk2相對(duì)clk1進(jìn)行了+0.3ns的相移,此時(shí)將會(huì)導(dǎo)致過約束

????在這種情況下,由于setup約束中包含了0.3ns的相移,將導(dǎo)致無法時(shí)序收斂,因?yàn)閿?shù)據(jù)到達(dá)時(shí)間在目的時(shí)鐘的hold邊沿和setup邊沿之間,必有一個(gè)違例。因此,必須對(duì)setup和holdup的邊沿進(jìn)行調(diào)整,解決方法為對(duì)捕獲時(shí)鐘的setup要求前移一個(gè)周期,holdup無需進(jìn)行約束
約束后的波形

當(dāng)相移為負(fù)的時(shí)候,無需考慮相移的影響,因?yàn)橄嘁频闹翟黾恿薶old的時(shí)間裕量,setup的捕獲沿相比啟動(dòng)沿推遲很多可保證數(shù)據(jù)提前T到達(dá),除非相移值太大導(dǎo)致時(shí)鐘的啟動(dòng)沿或捕獲沿必須調(diào)整。

3.3?慢時(shí)鐘到快時(shí)鐘的多周期約束
啟動(dòng)時(shí)鐘CLK1是慢時(shí)鐘,捕獲時(shí)鐘CLK2是快時(shí)鐘

CLK2的頻率是CLK1的3倍,在靜態(tài)時(shí)序分析中,setup和holdup邊沿關(guān)系如下圖

示例:setup=3,對(duì)setup設(shè)置周期為3的約束
由于只設(shè)定了setup的multiplier值,holdup默認(rèn)為前移3-1個(gè)周期,波形如下

示例:setup=3/hold=2(-end)
在上一個(gè)例子中,放寬hold要求,捕獲時(shí)鐘中hold的邊沿需要往回移動(dòng)2個(gè)周期,多周期約束命令
波形如下圖

總結(jié):對(duì)于數(shù)據(jù)從慢時(shí)鐘域到快時(shí)鐘域時(shí),setup的multiplier為N時(shí),hold的multiplier為N-1
3.4?快時(shí)鐘到慢時(shí)鐘的多周期約束
在下面的場(chǎng)景中,CLK1為快時(shí)鐘域,CLK2為慢時(shí)鐘域

假設(shè)CLK1的頻率是CLK2的3倍,不設(shè)置多周期約束時(shí)的時(shí)序分析波形如下,時(shí)序分析工具是按照最嚴(yán)苛的條件選擇啟動(dòng)沿和捕獲沿,因此源時(shí)鐘clk1的啟動(dòng)沿選擇最靠近目的時(shí)鐘clk2前期的上升邊沿。

示例:setup=3(-start)/hold=2,對(duì)setup/hold設(shè)置多周期約束
定義setup的multiplier值,添加-start參數(shù),可以將啟動(dòng)時(shí)鐘往回移動(dòng)
對(duì)應(yīng)的波形為:

總結(jié):對(duì)于快時(shí)鐘域到慢時(shí)鐘域,定義了setup的multiplier為N時(shí),hold的multiplier需定義為N-1,模板如下
四、工程示例
以慢時(shí)鐘域到快時(shí)鐘的多周期約束為例,主時(shí)鐘create_clk1周期為10ns,生成時(shí)鐘gen_clk_2,gen_clk_3的周期分別為40ns,2.5ns
工程代碼
邏輯連接
觸發(fā)器ff1_reg和ff2_reg的輸出經(jīng)過ff3_i_1單元進(jìn)入ff3_reg的輸入端口

多周期約束設(shè)置
a)寄存器ff1_reg的clk1約束了主時(shí)鐘,ff2_reg和ff3_reg的clk分別約束了生成時(shí)鐘gen_clk_2,gen_clk_3
b) ff1_reg/c到ff3_reg/c進(jìn)行setup/hold的多周期約束
時(shí)序報(bào)告
setup分析

hold分析

五、參考
用戶手冊(cè):ug903-vivado-using-constraints-en-us-2022.2.pdf
鏈接:https://pan.baidu.com/s/17AK_-J4wRXiFLtLTorlrwg?pwd=mylt?
提取碼:mylt?