C語言網(wǎng)站開發(fā)pdf抖音矩陣排名軟件seo
目錄
一、時(shí)序例外約束
1.1 為什么需要時(shí)序例外約束
1.2 時(shí)序例外約束分類
二、多周期約束
2.1 多周期約束語法
2.2 同頻同相時(shí)鐘的多周期約束
2.3 同頻異相時(shí)鐘的多周期約束
2.4 慢時(shí)鐘域到快時(shí)鐘域的多周期約束
2.5 快時(shí)鐘域到慢時(shí)鐘域的多周期約束
三、虛假路徑約束
四、最大/最小延時(shí)約束
一、時(shí)序例外約束
1.1 為什么需要時(shí)序例外約束
? ? ? ? 在STA中時(shí)序分析工具默認(rèn)的時(shí)序檢查方式可能與實(shí)際情況不吻合,此時(shí)就需要額外增加一些約束命令,用于調(diào)整時(shí)序檢查方式,添加的這些額外的時(shí)序約束稱為時(shí)序例外約束。
? ? ? ? 如以下情況就可以通過時(shí)序例外約束改善系統(tǒng)時(shí)序:
- 某些邏輯的時(shí)序單元不是每個(gè)時(shí)鐘周期都進(jìn)行數(shù)據(jù)采樣傳輸,可以使用多周期約束;
- 對(duì)時(shí)序路徑施加更緊的約束以獲得更大的時(shí)序余量,可以使用最大最小約束;
- 某些路徑組合是靜態(tài)的或并不需要進(jìn)行時(shí)序約束,可以使用虛假路徑忽略。
? ? ? ? 因此對(duì)一些可以放寬時(shí)序要求的路徑添加時(shí)序例外約束,以減少對(duì)布局布線的占用、釋放資源給時(shí)序要求高的路徑,確保系統(tǒng)更好的收斂。
1.2 時(shí)序例外約束分類
? ? ? ? 時(shí)序例外約束主要包括多周期約束、虛假路徑約束和最大最小延時(shí)約束。
命令 | 功能 |
set_multicycle_path | 多周期約束,指定從起始時(shí)鐘沿到目標(biāo)時(shí)鐘沿所需的時(shí)鐘周期數(shù)。常用于放寬某些時(shí)序路徑的時(shí)序要求,以指導(dǎo)設(shè)計(jì)工具實(shí)現(xiàn)更合理的布局布線資源分配。 |
set_false_path | 虛假路徑約束,指定在設(shè)計(jì)中不做分析的時(shí)序路徑,即在布局布線中作為最低優(yōu)先級(jí)的路徑。 |
set_max_delay set_min_delay | 最大延時(shí)約束和最小延時(shí)約束。該約束將會(huì)覆蓋設(shè)計(jì)默認(rèn)的(已約束或系統(tǒng)默認(rèn))用于建立和保持時(shí)間分析的最大或最小路徑延時(shí)時(shí)間,即用延時(shí)時(shí)間對(duì)特定時(shí)序路徑添加的約束。 |
二、多周期約束
2.1 多周期約束語法
? ? ? ? 默認(rèn)情況下,時(shí)序工具以單周期為單位進(jìn)行時(shí)序路徑分析。多周期約束可以調(diào)整建立時(shí)間和保持時(shí)間檢查的起始時(shí)鐘沿到目標(biāo)時(shí)鐘沿所需的時(shí)鐘周期數(shù),多周期約束可以設(shè)置在單個(gè)路徑上,多個(gè)路徑上,甚至兩個(gè)時(shí)鐘之間,使用set_multicycle_path命令實(shí)現(xiàn)。
set_multicycle_path <path_multiplier> [-setup|-hold] [-start|-end] [-from <startpoints>] [-to <endpoints>] [-through <pins|cells|nets>]
- <path_multiplier> 用于設(shè)置修改約束路徑分析的時(shí)鐘周期數(shù),取值必須是正整數(shù)。一般情況下setup/recovery分析是<path_multiplier>默認(rèn)為1,hold/removal分析時(shí)<path_multiplier>默認(rèn)為0,因此進(jìn)行多周期約束就是改變<path_multiplier>默認(rèn)參數(shù);
- -setup和-hold用于指定約束命令所針對(duì)的是路徑的建立時(shí)間分析(-setup)還是保持時(shí)間分析(-hold);
- -start和-end用于指定約束命令的<path_multiplier>參數(shù)是以源時(shí)鐘(-start)還是以目標(biāo)時(shí)鐘(-end)作為參考時(shí)鐘;
- -from指定約束路徑的起始節(jié)點(diǎn)<startpoints>,可與to同時(shí)指定,若只指定form則表示覆蓋所有從起始節(jié)點(diǎn)開始的路徑;
- -to指定約束路徑的終止節(jié)點(diǎn)<endpoints>,可與form同時(shí)指定,若只指定to則表示覆蓋所有到終止節(jié)點(diǎn)結(jié)束的路徑;
- -through指定約束路徑所經(jīng)過的節(jié)點(diǎn)<pins|cells|nets>,可選項(xiàng)。
????????單周期約束就是按照單周期關(guān)系來分析數(shù)據(jù)路徑,即數(shù)據(jù)的發(fā)起沿和捕獲沿是最鄰近的一對(duì)時(shí)鐘沿,如下圖所示。
- 建立時(shí)間關(guān)系:以第一個(gè)發(fā)送沿為基準(zhǔn),再向后尋找距此發(fā)送沿最近的一個(gè)捕獲沿,并將兩者的setup定為1個(gè)周期;
- 保持時(shí)間關(guān)系:確保當(dāng)前發(fā)送沿推出的數(shù)據(jù)不被上一個(gè)捕獲沿給捕獲,即hold1(Source clock中的4ns發(fā)射的數(shù)據(jù)不能被Destination clock中的4ns處捕獲);確保下一個(gè)發(fā)送沿推出的數(shù)據(jù)不被當(dāng)前捕獲沿給捕獲,即hold2(Source clock中的8ns發(fā)射的數(shù)據(jù)不能被Destination clock中的8ns處為捕獲)。
- 因此previous capture與current launch 構(gòu)成一組檢查;current capture與next launch 構(gòu)成一組檢查。對(duì)于兩條保持時(shí)間的檢查,時(shí)序報(bào)告最終只會(huì)給出裕量最小的一條。一旦確定建立時(shí)間路徑,保持時(shí)間路徑會(huì)自動(dòng)根據(jù)規(guī)則做調(diào)整。
?????????保持(hold)時(shí)間關(guān)與建立(setup)時(shí)間關(guān)系可通過如下公式進(jìn)行換算:
保持時(shí)間時(shí)鐘周期數(shù)=建立時(shí)間<path_multiplier>參數(shù) —1 —?保持時(shí)間<path_multiplier>參數(shù)
? ? ? ? 由于建立時(shí)間的默認(rèn)<path_multiplier>參數(shù)為1,保持時(shí)間的默認(rèn)<path_multiplier>參數(shù)為0,則默認(rèn)的保持時(shí)間的時(shí)鐘周期數(shù)就是1-1-0=0.
?總結(jié) -end 和 -start 選項(xiàng)如何影響有效的啟動(dòng)和捕獲邊沿:
分析路徑 | 源時(shí)鐘(start) 時(shí)鐘發(fā)射沿移動(dòng)方向 | 目標(biāo)時(shí)鐘(end) 時(shí)鐘發(fā)射沿移動(dòng)方向 |
建立時(shí)間 | 向左移動(dòng) | 向右移動(dòng)(默認(rèn)) |
保持時(shí)間 | 向右移動(dòng)(默認(rèn)) | 向左移動(dòng) |
????????對(duì)于源時(shí)鐘和目標(biāo)時(shí)鐘同頻同相的時(shí)序路徑分析,可以不指定-start和-end;對(duì)于非同頻同相的源時(shí)鐘和目標(biāo)時(shí)鐘,則需要指定-start和-end。set_multicycle_path命令的-setup選項(xiàng)不僅修改建立時(shí)間關(guān)系,也會(huì)影響保持時(shí)間關(guān)系。如果要將hold關(guān)系恢復(fù)到原來的位置,則需要使用-hold進(jìn)行額外的設(shè)置。
2.2 同頻同相時(shí)鐘的多周期約束
? ? ? ? 同頻同相時(shí)希望第一個(gè)發(fā)送沿推出數(shù)據(jù),經(jīng)過N各周期才被被第二個(gè)寄存器的捕獲沿給捕獲。最常見的就是,時(shí)鐘使能控制數(shù)據(jù)捕獲的情形。
????????靜態(tài)時(shí)序分析 (STA) 工具解析的默認(rèn)建立和保持關(guān)系如下圖
2.2.1 setup=2、hold相應(yīng)移動(dòng)
????????下圖表明目標(biāo)時(shí)鐘的第一個(gè)邊沿是無效的,只有目標(biāo)時(shí)鐘的第二個(gè)邊沿將捕獲一個(gè)新數(shù)據(jù),即?將建立時(shí)間關(guān)系的時(shí)鐘沿從默認(rèn)的時(shí)鐘發(fā)射沿后的第一個(gè)時(shí)鐘周期,修改為時(shí)鐘發(fā)射沿后的第二個(gè)時(shí)鐘周期。
set_multicycle_path 2 -setup -from [get_pins data0_reg/C] -to [get_pins data1_reg/D]
????????當(dāng)修改建立時(shí)間關(guān)系時(shí),保持時(shí)間關(guān)系也會(huì)隨著發(fā)射沿和捕獲沿的變化而修改。 將建立檢查移至第二個(gè)捕獲沿后,保持檢查會(huì)自動(dòng)移至第一個(gè)捕獲沿(即建立檢查之前的一個(gè)時(shí)鐘周期)。
2.2.2 setup=2、hold=1
? ? ? ? 在上一個(gè)例子中進(jìn)行多周期約束后保持時(shí)間的時(shí)鐘啟動(dòng)沿和捕獲沿為了滿足一個(gè)時(shí)鐘周期差的關(guān)系而隨之調(diào)整,而實(shí)際上保持時(shí)間關(guān)系通常維持多周期約束前的默認(rèn)狀態(tài)即可。為了達(dá)到一個(gè)時(shí)鐘周期差的保持時(shí)間要求可能會(huì)造成過約束,因此可以使用-hold值為1的多周期約束語句將保持時(shí)間的捕獲時(shí)鐘調(diào)整回默認(rèn)狀態(tài)。
set_multicycle_path 2 -setup -from [get_pins data0_reg/C] -to [get_pins data1_reg/D]
set_multicycle_path 1 -hold -from [get_pins data0_reg/C] -to [get_pins data1_reg/D]
2.2.3 setup=5、hold相應(yīng)移動(dòng)
? ? ? ? 將時(shí)鐘使能信號(hào)每5個(gè)時(shí)鐘周期拉高一次,即setup路徑乘數(shù)被設(shè)置為5
set_multicycle_path 5 -setup -from [get_pins data0_reg/C] -to [get_pins data1_reg/D]
? ? ? ? 多周期約束后,建立時(shí)間的時(shí)鐘沿從CLK1的第一個(gè)時(shí)鐘周期調(diào)整到了第五個(gè)時(shí)鐘周期,保存時(shí)間的鎖存沿也從CLK2向右移動(dòng)了4個(gè)時(shí)鐘周期。
2.2.4 setup=5、hold=4
? ? ? ? 在setup=5、hold相應(yīng)移動(dòng)基礎(chǔ)上調(diào)整保持時(shí)間的捕獲沿回到默認(rèn)的與時(shí)鐘啟動(dòng)沿對(duì)齊的位置,同時(shí)使用使用-setup、-hold語句:
set_multicycle_path 5 -setup -from [get_pins data0_reg/C] -to [get_pins data1_reg/D]
set_multicycle_path 4 -hold -from [get_pins data0_reg/C] -to [get_pins data1_reg/D]
? ? ? ? ?將hold的值設(shè)定為4,保持時(shí)間的啟動(dòng)沿和鎖存沿又保持對(duì)其,由于時(shí)鐘波形的對(duì)稱性,這兩條多周期約束最終所實(shí)現(xiàn)的保持時(shí)間關(guān)系也等效與下圖波形。
?
? ? ? ? 因此對(duì)于啟動(dòng)時(shí)鐘和捕獲時(shí)鐘為相同時(shí)鐘或時(shí)鐘波形相對(duì)固定的情況,如果想要多周期約束后保持時(shí)間關(guān)系仍然維持默認(rèn)狀態(tài),-setup的多周期約束設(shè)定值為N,?則-hold的多周期約束設(shè)定值為N-1,即
set_multicycle_path N -setup -from [get_pins data0_reg/C] -to [get_pins data1_reg/D]
set_multicycle_path N-1 -hold -from [get_pins data0_reg/C] -to [get_pins data1_reg/D]
2.3 同頻異相時(shí)鐘的多周期約束
????????同頻異相就是值時(shí)序分析中的源時(shí)鐘和目標(biāo)時(shí)鐘的頻率相同,但存在一定的相位差。
? ? ? ? ?如上圖,假設(shè)CLK1和CLK2相同頻率,CLK2相對(duì)CLK1有一定的相移(0.3ns)。在以CLK1為源時(shí)鐘,CLK2為目標(biāo)時(shí)鐘的時(shí)序路徑分析中,默認(rèn)情況下時(shí)序工具會(huì)尋找與CLK1相鄰最近的CLK2時(shí)鐘上升沿,并以CLK1與CLK2相對(duì)時(shí)間最短(時(shí)序要求最高,即最壞情況)的一組時(shí)鐘沿的時(shí)序路徑進(jìn)行分析。
? ? ? ? 默認(rèn)情況下時(shí)序工具解析的建立時(shí)間和保持時(shí)間關(guān)系如下圖,保持時(shí)間-3.7ns,建立時(shí)間0.3ns。
????????建立時(shí)間無法達(dá)到時(shí)序收斂,保持時(shí)間過于寬松,因此需要進(jìn)行多周期約束。
set_multicycle_path 2 -setup -from [get_clock CLK1] -to [get_clock CLK2]
2.4 慢時(shí)鐘域到快時(shí)鐘域的多周期約束
????????源時(shí)鐘CLK1是慢時(shí)鐘,目標(biāo)時(shí)鐘CLK2是快時(shí)鐘。
????????假設(shè)目標(biāo)時(shí)鐘CLK2是源時(shí)鐘CLK1的三倍頻,且目的寄存器對(duì)應(yīng)的使能信號(hào)每隔3個(gè)時(shí)鐘周期拉高一次,此時(shí)的時(shí)序約束過緊。
?????????可以設(shè)置setup為3個(gè)時(shí)鐘周期,這里的時(shí)鐘周期移動(dòng)是相對(duì)于目標(biāo)時(shí)鐘(快時(shí)鐘),所以約束必須指定-end。
set_multicycle_path 3 -setup -end -from [get_clock CLK1] -to [get_clock CLK2]
? ? ? ? 多周期約束后的建立時(shí)間關(guān)系的發(fā)射沿和保存時(shí)間關(guān)系的捕獲沿都右移了兩個(gè)時(shí)鐘周期。?
? ? ? ? ?而實(shí)際上保持時(shí)間的捕獲沿并不需要右移兩個(gè)時(shí)鐘周期,這可能會(huì)倒是過約束,因此讓保持時(shí)間的捕獲沿退到默認(rèn)的與時(shí)鐘啟動(dòng)沿對(duì)其的位置。
set_multicycle_path 3 -setup -end -from [get_clocks CLK1] -to [get_clocks CLK2]
set_multicycle_path 2 -hold -end -from [get_clocks CLK1] -to [get_clocks CLK2]
? ? ? ? 綜上,在慢時(shí)鐘域到快時(shí)鐘域且包含時(shí)鐘使能的多周期約束中,若希望多周期約束后保持時(shí)間仍為默認(rèn)狀態(tài),帶-setup的多周期約束值設(shè)為N時(shí),則帶-hold的多周期約束值設(shè)為N-1。
set_multicycle_path N -setup -end -from [get_clocks CLK1] -to [get_clocks CLK2]
set_multicycle_path N-1 -hold -end -from [get_clocks CLK1] -to [get_clocks CLK2]
2.5 快時(shí)鐘域到慢時(shí)鐘域的多周期約束
? ? ? ? 源時(shí)鐘CLK1是快時(shí)鐘,目標(biāo)時(shí)鐘CLK2是慢時(shí)鐘。
????????假設(shè)目標(biāo)時(shí)鐘CLK2是源時(shí)鐘CLK1的三倍頻,且目的寄存器對(duì)應(yīng)的使能信號(hào)每隔3個(gè)時(shí)鐘周期拉高一次,此時(shí)的時(shí)序約束過緊。??
? ? ? ? 進(jìn)行多周期約束,由于時(shí)鐘周期移動(dòng)所針對(duì)的是源時(shí)鐘,因此使用-start選項(xiàng)。
set_multicycle_path 3 -setup -start -from [get_clocks CLK1] -to [get_clocks CLK2]
set_multicycle_path 2 -hold -from [get_clocks CLK1] -to [get_clocks CLK2]
? ? ? ? ?綜上,在快時(shí)鐘域到慢時(shí)鐘域的多周期約束中,若希望多周期約束后保持時(shí)間仍為默認(rèn)狀態(tài),帶-setup的多周期約束值設(shè)為N時(shí),則帶-hold的多周期約束值設(shè)為N-1。
set_multicycle_path N -setup -start -from [get_clocks CLK1] -to [get_clocks CLK2]
set_multicycle_path N-1 -hold -from [get_clocks CLK1] -to [get_clocks CLK2]
? ? ? ? 無論是使用-setup -start還是-setup -end進(jìn)行約束,都是<path_mutiplier>參數(shù)值越大,建立時(shí)間關(guān)系的時(shí)鐘啟動(dòng)沿和捕獲沿的距離相隔就越遠(yuǎn)(時(shí)序要求更松);?<path_mutiplier>參數(shù)值越小,建立時(shí)間關(guān)系的時(shí)鐘啟動(dòng)沿和捕獲沿的距離相隔就越近(時(shí)序要求更緊);?使用-hold?-start還是-hold -end進(jìn)行約束與此類似。
三、虛假路徑約束
? ? ? ? 虛假路徑指該路徑是非功能路徑或沒有任何時(shí)序要求的路徑。
????????虛假路徑約束后,時(shí)序工具將不再為被約束路徑做時(shí)序分析;而多周期約束后,時(shí)序工具仍會(huì)在放寬時(shí)序要求的前提下進(jìn)行時(shí)序努力和分析。
? ? ? ? 虛假路徑約束的語法為:
set_false_path [-setup] [-hold] [-from <startpoints>] [-to <endpoints>] [-through <pins|cells|nets>]
- -setup和-hold用于指定約束命令所針對(duì)的是路徑的建立時(shí)間分析還是保持時(shí)間分析;
- -from指定約束路徑的起始節(jié)點(diǎn)<startpoints>,可與to同時(shí)指定,若只指定form、to、through的一個(gè)則表示覆蓋所有經(jīng)過指定節(jié)點(diǎn)的路徑都為虛假路徑;
- -to指定約束路徑的終止節(jié)點(diǎn)<endpoints>;
- through指定約束路徑所經(jīng)過的節(jié)點(diǎn)<pins|cells|nets>,可選項(xiàng),可同時(shí)使用多個(gè)through但有先后順序。
? ? ? ? 常見的虛假路徑包括:
- 已經(jīng)做過同步處理的跨時(shí)鐘域路徑;
- 上電后只做一次初始化寫入的寄存器路徑;
- 復(fù)位或測(cè)試邏輯的路徑;
- 實(shí)際不存在的時(shí)序路徑 。
????????下圖為非功能路徑,由于兩個(gè)多路復(fù)用器均由相同的選擇信號(hào)驅(qū)動(dòng),因此從Q到D的路徑不存在,應(yīng)定義為錯(cuò)誤路徑。
? ? ? ? 將覆蓋到所有以reset信號(hào)起始的路徑約束為虛假路徑:
set_false_path -from [get_port reset] -to [all_registers]
? ? ? ? ?將兩個(gè)異步時(shí)鐘域之間的時(shí)序路徑約束為虛假路徑:
set_false_path -from [get_clocks CLKA] -to [get_clocks CLKB]
????????這個(gè)約束僅覆蓋從CLKA到CLKB的所有時(shí)序路徑,但不包含CLKB到CLKA的時(shí)序路徑,要包含所有的時(shí)序路徑需要在兩個(gè)時(shí)鐘方向都進(jìn)行約束:
set_false_path -from [get_clocks CLKA] -to [get_clocks CLKB]
set_false_path -from [get_clocks CLKB] -to [get_clocks CLKA]
? ? ? ? 這種情況個(gè)更適合用set_clock_groups約束對(duì)兩個(gè)或多個(gè)互斥時(shí)鐘進(jìn)行約束,以忽略它們之間的時(shí)序路徑:
set_clock_groups -group CLKA -group -CLKB
四、最大/最小延時(shí)約束
? ? ? ? 最大延時(shí)約束將覆蓋默認(rèn)的建立時(shí)間分析的最大路徑延時(shí)值;最小延時(shí)約束將覆蓋默認(rèn)的保持時(shí)間分析的最小路徑延時(shí)值。
????????最大延時(shí)約束和最小延時(shí)約束通常不建議用于約束輸入或輸出引腳與內(nèi)部寄存器之間(pin2reg、reg2pin)的路徑延時(shí),而對(duì)于一些異步信號(hào)之間的路徑,可以使用最大延時(shí)約束和最小延時(shí)約束。
? ? ? ? 最大延時(shí)約束和最小延時(shí)約束命令如下:
set_max_delay <delay> [-datapath_only] [-from <startpoints>] [-to <endpoints>] [-through <pins|cells|nets>]
set_min_delay <delay> [-from <startpoints>] [-to <endpoints>] [-through <pins|cells|nets>]
- -from指定約束路徑的起始節(jié)點(diǎn)<startpoints>
- -to指定約束路徑的終止節(jié)點(diǎn)<endpoints>
- -through指定約束路徑所經(jīng)過的節(jié)點(diǎn)<pins|cells|nets>
????????默認(rèn)情況下,時(shí)序裕量的計(jì)算包含時(shí)鐘偏斜(Clock Skew)。如果不希望包含時(shí)鐘偏斜,可以使用-datapath_only選項(xiàng)將其移除。只有set_max_delay命令支持-datapath_only選項(xiàng),并且需要-from選項(xiàng)。
????????帶或不帶 -datapath_only選項(xiàng) 的 set_max_delay 的路徑延遲計(jì)算的常見行為:
- 當(dāng)路徑在輸入端口上啟動(dòng)并且在端口上指定了set_input_delay時(shí),輸入延遲將包含在路徑延遲計(jì)算中;
- 當(dāng)路徑在輸出端口上結(jié)束并且在端口上指定了set_output_delay時(shí),輸出延遲包括在路徑延遲計(jì)算中;
- 當(dāng)路徑結(jié)束于時(shí)序單元的數(shù)據(jù)引腳上時(shí),該數(shù)據(jù)引腳setup時(shí)間包括在該路徑延遲計(jì)算中。
參考文獻(xiàn):
《FPGA時(shí)序約束與分析》
《正點(diǎn)原子FPGA靜態(tài)時(shí)序分析與時(shí)序約束》?
《Intel Quartus Prime Standard Edition用戶指南: Timing Analyzer》
《Vivado Design Suite User Guide: Using Constraints(UG903)》
《Vivado Design Suite 用戶指南: 設(shè)計(jì)分析與收斂技巧 (UG906)》
????????