www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > > ZYNQ


時(shí)序異常

英文名為Timing Exception,可以認(rèn)為是時(shí)序例外或時(shí)序異?!袄狻被颉爱惓!笔侵高@部分時(shí)序的分析與大多數(shù)常規(guī)時(shí)序分析不同。下表給出了Vivado支持的時(shí)序異常命令及功能:

Vivado不支持即時(shí)分析有矛盾的時(shí)序異常,需要運(yùn)行report_exceptions進(jìn)行完整的分析,報(bào)告所有時(shí)序異常。多周期路徑的情況有很多,比較復(fù)雜,本文介紹其余三種時(shí)序異常的相關(guān)知識(shí)。

虛假路徑false path

某些在拓?fù)浣Y(jié)構(gòu)上看存在于設(shè)計(jì)中的路徑,但是沒有工作或者不需要被計(jì)時(shí),便被稱作虛假路徑。虛假路徑在時(shí)序分析過程中應(yīng)該被忽略不計(jì)。下面這些情況都屬于虛假路徑:

在有雙同步器邏輯的地方有時(shí)鐘域交叉

可能只在上電時(shí)寫入一次的寄存器

復(fù)位或測(cè)試邏輯

異步分布式RAM的寫端口于異步讀時(shí)鐘之間的路徑

舉個(gè)具體的例子加深對(duì)虛假路徑的理解,如下圖:

兩個(gè)多路選擇器MUX控制兩個(gè)寄存器間的數(shù)據(jù)傳輸,但是兩個(gè)MUX采用同一個(gè)選擇信號(hào)。仔細(xì)分析會(huì)發(fā)現(xiàn),無論如何Q端數(shù)據(jù)都無法傳遞到D端。雖然結(jié)構(gòu)圖上看起來Q和D之間存在一條路徑,但是沒有起到任何功能,因此應(yīng)該定義為虛假路徑。

為何要在時(shí)序分析中移除掉虛假路徑?理由如下:

減少運(yùn)行時(shí)間:工具不需要為這些虛假路徑計(jì)時(shí)和做優(yōu)化,可以減少很多運(yùn)行時(shí)間。

增加結(jié)果質(zhì)量:移除虛假路徑可以極大增加結(jié)果質(zhì)量QOR(Quality of Results)。綜合、布局和優(yōu)化設(shè)計(jì)的質(zhì)量很大程度上受到時(shí)序問題的影響,因?yàn)楣ぞ呖倳?huì)嘗試解決這些問題,包含虛假路徑會(huì)導(dǎo)致不理想的結(jié)果(比如工具將過多注意力放在解決虛假路徑的時(shí)序違背上,而忽視了真正需要解決的問題)。

虛假路徑由set_false_path命令定義,該命令模板如下:

set_false_path [-setup] [-hold] [-from] [-to] [-through]

幾個(gè)節(jié)點(diǎn)列表選項(xiàng)的含義如下:

-from:一組合法的起點(diǎn)列表,包括時(shí)鐘對(duì)象、時(shí)序元素的時(shí)鐘管腳、輸入主端口或雙向主端口。

-to:一組合法的終點(diǎn)列表,包括時(shí)鐘對(duì)象、時(shí)序元素的數(shù)據(jù)輸入管腳、輸出主端口或雙向主端口。

-through:一組合法的管腳或端口,注意節(jié)點(diǎn)的順序很重要。如果約束中僅使用了-through,沒有使用-from和-to選項(xiàng),Vivado會(huì)從時(shí)序分析中移除所有通過該列表的路徑,使用時(shí)要特別小心。

下面給出幾個(gè)定義虛假路徑的例子:

#-through的順序表示路徑穿過節(jié)點(diǎn)的順序,因此下面是兩條不同的約束

set_false_path -through cell1/pin1 -through cell2/pin2

set_false_path -through cell2/pin2 -through cell1/pin1

#上圖中的虛假路徑應(yīng)該用下面這條命令約束

set_false_path -through [get_pins MUX1/a0] -through [get_pins MUX2/a1]

#使用-through而不用-from和-to的好處是可以確保所有通過此節(jié)點(diǎn)的路徑都會(huì)被移除,而不用考慮起點(diǎn)和終點(diǎn)

#移除復(fù)位端口到所有寄存器間的時(shí)序路徑

set_false_path -from [get_port reset] -to [all_registers]

#禁用兩個(gè)異步時(shí)鐘域間的時(shí)序路徑,從CLKA到CLKB

set_false_path -from [get_clocks CLKA] -to [get_clocks CLKB]

#注意,上述命令并沒有禁用從CLKB到CLKA的路徑,還需要補(bǔ)充如下約束

set_false_path -from [get_clocks CLKB] -to [get_clocks CLKA]

從最后一個(gè)例子可知,我們需要雙向地禁用時(shí)序路徑,但是如果設(shè)計(jì)中有多個(gè)異步時(shí)鐘域,編寫起來就非常麻煩。不知道您是否還記得第31篇中講過的時(shí)鐘約束方法,這種情況最好其實(shí)應(yīng)該使用set_clock_groups設(shè)置不同的異步時(shí)鐘組。

上面還說到了異步分布式RAM的情況,這里也舉一個(gè)約束例子。假設(shè)一個(gè)異步雙口分布式RAM,其寫操作于RAM時(shí)鐘同步,但是讀操作是異步的,這種情況下應(yīng)該在寫和讀時(shí)鐘間設(shè)置一個(gè)虛假路徑。約束如下:

#在RAM前的寫寄存器和RAM后的讀寄存器間設(shè)置虛假路徑

set_false_path -from [get_cells] -to [get_cells]

個(gè)例分析

設(shè)計(jì)中,某些信號(hào)在特定模式中為常數(shù)值,比如:(1).某些測(cè)試信號(hào)不會(huì)變換,直接連接在VSS或VDD上;(2).某些信號(hào)上電后便不再發(fā)生變化;(3).如果設(shè)計(jì)有多種功能模式,某些信號(hào)在部分模式下為活躍狀態(tài),但在其它模式下為不活躍狀態(tài)。這些情況便屬于“個(gè)例分析”。

我們必須告訴靜態(tài)時(shí)序分析引擎,哪些信號(hào)為常數(shù)值,從而減少分析范圍、運(yùn)行時(shí)間和內(nèi)部占用率,并且不必報(bào)告那些不工作的和不相關(guān)的路徑。通常,設(shè)計(jì)者使用set_case_analysis命令將信號(hào)(管腳和端口)申明為不活躍狀態(tài)。該命令的語法如下 :

set_case_analysis

參數(shù)值value可以是0、1、zero、one、rise、rising、fall或falling。作用對(duì)象可以是端口(port)、子單元(英文名為leaf cell)的管腳或?qū)哟文K的管腳。下面舉兩個(gè)例子加強(qiáng)對(duì)這種時(shí)序異常的理解。

第一個(gè)例子如下圖,clock_sel是一個(gè)時(shí)鐘選擇器,通過選擇管腳s對(duì)兩個(gè)輸入時(shí)鐘clk_1和clk_2進(jìn)行選擇輸出:

如果我們只希望分析一種個(gè)例,比如只分析選擇clk_2時(shí)的情況。通過將 s管腳設(shè)置為常數(shù)即可只把clk_2傳遞到輸出端口o。約束如下:

set_clock -name -clk_1 -period 10.0 [get_pins clock_sel/I0]

set_clock -name -clk_2 -period 15.0 [get_pins clock_sel/I1]

set_case_analysis 1 {get_pins clock_sel/S}

對(duì)某一管腳設(shè)置了個(gè)例分析,會(huì)導(dǎo)致禁用經(jīng)過該管腳的路徑上的時(shí)序分析,也不會(huì)報(bào)告相關(guān)信息。第二個(gè)例子如下圖,BUFG_GT有一個(gè)動(dòng)態(tài)時(shí)鐘分頻控制管腳DIV[2:0],由其它邏輯驅(qū)動(dòng)而不是直接連接到VCC/GND:

默認(rèn)情況下,Vivado會(huì)假設(shè)輸出時(shí)鐘的最壞可能情況,即1分頻(相當(dāng)于不分頻,此時(shí)頻率最高)。然而如果設(shè)計(jì)中根本不會(huì)出現(xiàn)DIV取1的情況,這就成了過度約束。為了更合理地約束設(shè)計(jì),我們可以對(duì)DIV[2:0]總線進(jìn)行個(gè)例分析約束,比如可能出現(xiàn)的最差情況為DIV取3,約束如下:

set_case_analysis 0 {get_pins bufg_gt_pclk/DIV[0]}

set_case_analysis 1 {get_pins bufg_gt_pclk/DIV[1]}

set_case_analysis 0 {get_pins bufg_gt_pclk/DIV[2]}

最小/最大延遲

最大延遲約束set_max_delay用于改寫路徑的默認(rèn)建立時(shí)間(或恢復(fù)時(shí)間)需求;最小延遲約束set_min_delay用于改寫路徑的默認(rèn)保持時(shí)間(或移除時(shí)間)。兩條約束命令的語法模板如下:

set_max_delay[-datapath_only] [-from] [-to] [-through]

set_min_delay[-from] [-to] [-through]

-from、-to和-through和虛假路徑中的用法相同。set_max_delay命令中如果添加了-datapath_only,那么計(jì)算裕量時(shí)便不會(huì)考慮時(shí)鐘斜率。使用最小/最大延遲約束要注意如下三點(diǎn):

路徑上僅設(shè)置最大延遲約束(不使用-datapath_only選項(xiàng)),不會(huì)修改該路徑上的最小延遲需求,保持時(shí)間檢查仍采用默認(rèn)值,相反也成立。但如果加入了-datapath_only,就會(huì)導(dǎo)致該路徑上的保持時(shí)間需求被忽略。

通常輸入端口到第一級(jí)寄存器間的約束用set_input_delay命令;最后一級(jí)寄存器到輸出端口之間的約束用set_output_delay命令(詳情見第32篇)。但輸入端口到輸出端口之間的純組合邏輯路徑可以用set_max_delay和set_min_delay命令進(jìn)行約束(通常稱為in-to-out I/O路徑)。

某些異步信號(hào)間沒有時(shí)鐘關(guān)系,但是需要最大延遲約束。比如我們通常用set_clock_groups劃分兩個(gè)異步時(shí)鐘域,但有時(shí)我們需要確保兩個(gè)時(shí)鐘域之間的路徑延遲不要太高。這種情況下,我們就要用set_max_delay和set_false_path的命令組合(因?yàn)閟et_clock_groups的優(yōu)先級(jí)更高,會(huì)取代set_max_delay,因此不能和其一塊使用)。

另外在約束最小延遲和最大延遲時(shí),如果-from和-to中的節(jié)點(diǎn)選擇不合理,會(huì)出現(xiàn)路徑分割(Path Segmentation)現(xiàn)象。第34篇給出了路徑分割的具體實(shí)例及說明。

禁用Timing Arcs

最后再介紹一種時(shí)序異常的特例:Timing Arcs,字面翻譯為時(shí)序弧,之所以沒有單獨(dú)列為一種時(shí)序異常,是因?yàn)樗c其它時(shí)序異常有著千絲萬縷的關(guān)系。其實(shí)很多情況下計(jì)時(shí)器為了處理一些特殊情況會(huì)自動(dòng)禁用某些時(shí)序弧,比如:

組合邏輯反饋環(huán)不能被正確地計(jì)時(shí)(因此也不推薦使用),計(jì)時(shí)器會(huì)通過禁用環(huán)內(nèi)的某條時(shí)序弧來打破環(huán)路。

據(jù)前文所述,默認(rèn)情況下MUX的所有輸入數(shù)據(jù)都會(huì)傳遞端口,但是個(gè)例分析時(shí)將MUX的選擇信號(hào)設(shè)為常數(shù)值,此時(shí)僅有一個(gè)數(shù)據(jù)輸入端口會(huì)傳遞到輸出端口。其實(shí)這正是由計(jì)時(shí)器打斷了其它數(shù)據(jù)端口到輸出端口間的時(shí)序弧實(shí)現(xiàn)的。

Vivado提供了set_disable_timing命令,可以人為打斷一個(gè)單元輸入端口到輸出端口之間的時(shí)序弧??紤]如下應(yīng)用情況:

比如對(duì)于上面第一個(gè)例子的情況,可以人工設(shè)定打斷組合反饋環(huán)中的哪條時(shí)序弧,而不是讓工具自動(dòng)完成。

假設(shè)有多個(gè)時(shí)鐘同時(shí)到達(dá)LUT的輸入管腳,但是只能有一個(gè)時(shí)鐘傳遞到LUT的輸出端口。此時(shí)需要打斷與其它時(shí)鐘相關(guān)的時(shí)序弧。

當(dāng)禁用了時(shí)序弧后,通過該時(shí)序弧的所有時(shí)序路徑都不會(huì)在時(shí)序分析中報(bào)告。因此使用時(shí)要額外小心,避免禁用了必要的時(shí)序弧,導(dǎo)致隱藏的時(shí)序違背或時(shí)序問題使設(shè)計(jì)在硬件中不能正常工作。set_disable_timing的語法及示例如下:

#語法,-from和-to只能設(shè)置為庫(kù)單元的管腳名稱(不是設(shè)計(jì)管腳名稱)

set_disable_timing [-from] [-to] [-quiet] [-verbose]

#禁用所有基于LUTRAM的異步FIFO的WCLK到O之間的時(shí)序弧

set_disable_timing -from WCLK -to O [get_cells inst_fifo_gen/ gdm.dm/gpr1.dout_i_reg[*]]

#指定對(duì)象的所有以O(shè)管腳為終點(diǎn)的時(shí)序弧都被禁用

set_disable_timing -to O

#指定對(duì)象的所有以WCLK管腳為起點(diǎn)的時(shí)序弧都被禁用

set_disable_timing -from WCLK

#指定對(duì)象內(nèi)的所有時(shí)序弧都被禁用

set_disable_timing

使用report_disable_timing命令可以查看所有自動(dòng)禁用和手動(dòng)禁用了的時(shí)序弧。注意這個(gè)列表可能會(huì)非常大,最好加上-file選項(xiàng)保存結(jié)果到文件中查看。


本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
關(guān)閉