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

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


時序異常

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

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

虛假路徑false path

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

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

可能只在上電時寫入一次的寄存器

復(fù)位或測試邏輯

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

舉個具體的例子加深對虛假路徑的理解,如下圖:

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

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

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

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

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

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

幾個節(jié)點列表選項的含義如下:

-from:一組合法的起點列表,包括時鐘對象、時序元素的時鐘管腳、輸入主端口或雙向主端口。

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

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

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

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

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é)點的路徑都會被移除,而不用考慮起點和終點

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

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

#禁用兩個異步時鐘域間的時序路徑,從CLKA到CLKB

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

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

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

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

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

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

set_false_path -from [get_cells] -to [get_cells]

個例分析

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

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

set_case_analysis

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

第一個例子如下圖,clock_sel是一個時鐘選擇器,通過選擇管腳s對兩個輸入時鐘clk_1和clk_2進行選擇輸出:

如果我們只希望分析一種個例,比如只分析選擇clk_2時的情況。通過將 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}

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

默認(rèn)情況下,Vivado會假設(shè)輸出時鐘的最壞可能情況,即1分頻(相當(dāng)于不分頻,此時頻率最高)。然而如果設(shè)計中根本不會出現(xiàn)DIV取1的情況,這就成了過度約束。為了更合理地約束設(shè)計,我們可以對DIV[2:0]總線進行個例分析約束,比如可能出現(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)建立時間(或恢復(fù)時間)需求;最小延遲約束set_min_delay用于改寫路徑的默認(rèn)保持時間(或移除時間)。兩條約束命令的語法模板如下:

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

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

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

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

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

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

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

禁用Timing Arcs

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

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

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

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

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

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

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

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

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

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

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

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

set_disable_timing -to O

#指定對象的所有以WCLK管腳為起點的時序弧都被禁用

set_disable_timing -from WCLK

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

set_disable_timing

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


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