本文如果有錯,歡迎留言更正;此外,轉載請標明出處 http://www.cnblogs.com/IClearner/ ,作者:IC_learner
時序約束可以很復雜,這里我們先介紹基本的時序路徑約束,復雜的時序約束我們將在后面進行介紹。
在本節的主要內容如下所示:
·時序路徑和關鍵路徑的介紹
·建立時間、保持時間簡述
·時鍾的約束(寄存器-寄存器之間的路徑約束)
·輸入延時的約束
·輸出延時的約束
·組合邏輯的約束
·結合設計規格進行實戰
RTL代碼描述了電路的時序邏輯和組合邏輯,即RTL代碼體現了電路的寄存器結構和數目、電路的拓撲結構、寄存器之間的組合邏輯功能以及寄存器與I/O端口之間的組合邏輯功能。但代碼中並不包括電路的時間(路徑的延時)和電路面積(門數)。綜合工具現在不能很好地支持異步電路,甚至不支持異步電路,因此時序路徑的約束主要是針對同步電路的,關於異步的電路的約束,后面也會進行相關的說明。
1、時序路徑與關鍵路徑
我們來看一下同步電路,常見的結構如下所示:
中間是我們設計的模塊(芯片),對於同步電路,為了使電路能正常工作,即電路在我們規定的工作頻率和工作環境下能功能正確地工作,我們需要對設計中的所有時序路徑進行約束。那么時序路徑是什么呢?下面進行解說:
時序路徑是一個點到點的數據通路, 數據沿着時序路徑進行傳遞。每條時序路徑有一個起點(Startpoint)和一個終點(Endpoint)。
起點定義為:
· 輸入端口;
· 觸發器或寄存器的時鍾引腳。
終點定義為:
· 輸出端口;
· 時序器件的除時鍾引腳外的所有輸人引腳。
這樣, 時序路徑可以是輸入端口到寄存器、 寄存器到寄存器、 寄存器到輸出端口、 輸入端口到輸出端口。如下面這個電路中:
就有4條路徑:
1:從輸入端口A到FF1的D端;
2:從FF1的CLK端到FF2的D端;
3:從FF2的CLK端到輸出端口out1;
4:從輸入端口A到輸出端口out1。
好看一點的圖如下:
路徑的特性是存在延時,也就是說,路徑1、2、3、4都存在有延時,延時最長的一條路徑稱為關鍵路徑。一般情況下,路徑1、2、3是最常見的,路徑4比較少見。
2、常見的時序路徑約束
①建立時間、保存時間和亞穩態
在進行約束的時候,先了解觸發器的三個概念:建立時間、保持時間以及亞穩態。這里只是簡單地介紹一下,關於建立時間和保持時間的深入介紹,請查看我的博文:http://www.cnblogs.com/IClearner/p/6443539.html,關於亞穩態的深入介紹,請查看我的博文:http://www.cnblogs.com/IClearner/p/6475943.html
建立時間:時鍾有效沿到來之前的某段時間內,數據必須穩定,否則觸發器鎖存不住數據,這段時間成為建立時間,用Tsetup或者Tsu表示。
保持時間:時鍾有效沿到來之后的某段時間內,數據也必須穩定,否則觸發器鎖存不住數據,這段時間成為保持時間,用Thold或者Th表示。
如下圖所示:
在第二個時鍾上升沿的時候,要鎖存住輸入端D的高電平,D1是滿足了建立時間和保持時間的情況;而D2則是建立時間沒有滿足,因此不能成功鎖存住輸入的高電平;D3保持時間不滿足,也不能成功鎖存輸入的高電平。
亞穩態:每個觸發器都有其規定的建立(setup)和保持(hold)時間參數,該參數存放在由半導體廠商所提供的工藝庫中。假如觸發器由時鍾的上升沿觸發,在這個時間參數內,輸入信號是不允許發生變化的。否則在信號的建立或保持時間中對其采樣,得到的結果是不可預知的,有可能是0或者1,即亞穩態。
有了這三個概念之后,我們可以對路徑進行約束了。約束就是為了滿足寄存器的建立時間(和保持時間),我們先對模塊內的路徑進行約束,也就是下面電路框圖中的中間部分:
對於中間的部分路徑,可以用前面的那個路徑圖來描述:
也就是主要約束這些類型的路徑,本小節主要講的就是這些路徑的約束。
②路徑2(寄存器到寄存器之間的路徑)的約束:
我們先從寄存器到寄存器之間的路徑2開始;前面說到了,為什么要約束時序路徑,是為了滿足寄存器的建立時間和保持時間。對於路徑2,數據從FF1的D端口傳輸到FF2的D端口,主要需要經歷觸發器的翻轉時間/轉換延時、寄存器與寄存器之間的組合邏輯延時、連線延時這些種延時。因為數據是隨着時鍾的節拍一拍一拍往后傳的,因此這里的寄存器與寄存器之間的路徑約束,就是對時鍾的建模,或者是說對時鍾的約束。下面進行說明:
為了滿足FF2建立時間的要求,也就是數據經過上面的延時(觸發器的翻轉時間/轉換延時、寄存器與寄存器之間的組合邏輯延時、連線延時)之后到達FF2的D端的時間再加上FF2的建立時間,需要要小於時鍾周期;也就是說,你的那些延時不能過大,延時一旦過大,數據可能就不滿足建立時間的關系,甚至還更新不了。舉個例子說:
現在的節拍(0ns這一時刻)到來后,數據(比如說是一個高電平)從FF1的D端傳來,經過組合邏輯,在下一個節拍(20ns這一時刻)的時候傳到FF2的D端,更新FF2的數據(0ns時,FF2保存的是低電平),如紅色箭頭所示;但是由於延時太大,下一個節拍到來了(20ns到了),這個高電平還在還在組合邏輯那里,如綠色箭頭所示,就導致了FF2的D端數據不能得到更新,或者不滿足建立時間,由此可能引起鎖存錯誤。當對時鍾進行建模之后,拍長也就決定了,也就是那些延時(觸發器的翻轉時間/轉換延時、寄存器與寄存器之間的組合邏輯延時、連線延時)最大是多少也就知道了,通過對時鍾進行建模,也就是通過對寄存器與寄存之間的路徑進行約束,DC就知道了這條路徑運行的最大延時,就會選擇合適的單元來滿足這些延時的約束,如果DC選來選去,發現最牛逼的單元得到的電路延時還是很大,無法滿足FF2的建立時間要求,DC就會報錯。這個時候,你就要進行修改設計了(比如修改約束或者修改代碼)。
為了滿足FF2的保持時間,也就是數據經過上面的延時(觸發器的翻轉時間/轉換延時、寄存器與寄存器之間的組合邏輯延時、連線延時)之后到達FF2的D端的時間,不能小於某個值。也就是說,這些延時也不能太小。舉個極端的例子說,在0ns的時候,觸發器有效沿到來,FF1和FF2都要更新下數據,FF1准備鎖存高電平,FF2准備鎖存低電平;由於FF1反應很快,電路延時很小,FF1寄存住的高電平很快就會傳到FF2的D端口,高電平就會沖掉FF2要鎖存的低電平(也就是FF2的D端口低電平還沒有穩定,違反了保持時間),也就是說會導致低電平對FF2的保持時間不能得到滿足,導致FF2更新數據失敗,要鎖存住的低電平可能就產生亞穩態。因此就有傳輸延時需要大於FF2的保持時間。此外,我們由此也可以知道,保持時間的分析比建立時間的分析提前一個時鍾周期沿,也就是說在0ns時候傳輸數據,建立時間是在下一個時鍾上升沿(20ns時刻)進行檢查FF2的D端口數據是否穩定(若不穩定,就違反了建立時間),而保持時間是在發送數據的同一時刻(也就是0ns時刻)檢查FF2的D端口數據是否穩定(如果不穩定,就違反了保持時間);關於保持時間的分析比建立時間的分析提前一個時鍾周期沿這一點需要注意。
然而,保持時間一般是能夠滿足的,也就是傳輸延時一般是大於觸發器的保持時間的,即使滿足不了,在后端版圖設計的時候,也可以有修改措施(比如路徑加緩沖器增加延時)。因此我們在約束的時候,我們一般不關注保持時間,而是注重建立時間。
經過上面一大堆的廢話,相信大家已經對這個約束過程有一定的了解了,下面進行概括一下,並進行時鍾建模。
通過上面的講解,我們知道,一般情況下,如果寄存器和寄存器之間組合電路的延遲大於Clock_cycle-Tsu(Clock_cycle是時鍾周期,Tsu是觸發器的建立時間),電路的功能會不正確,將不能正常工作。如果已知電路的時鍾工作頻率,就知道了寄存器和寄存器之間組合電路的最大時延,如下圖所示:
圖中路徑X的最大時延應滿足下列關系:
Tclk-Q是FF2的從引腳CLK到引腳Q的延時,Tsetup是FF3的建立時間,這兩個參數都由工藝庫提供。總結完成之后,下面對時鍾進行建模,也就是寄存器到寄存器之間的路徑進行約束,時鍾的建模是比較復雜的,因此先一步一步地講解,最后給出約束腳本。
定義時鍾時鍾的命令為:create_clock。假設時鍾周期為10ns,定義時鍾的命令就是:
create_clock -period 10 [get_ports clk]
對於的時鍾波形為:
定義時鍾時(虛擬時鍾除外,虛擬時鍾在后面說),我們必須定義時鍾周期(也就是-period這個選項)和時鍾源(端口或引腳)(也就是設計中的clk),也可以加上一些可選項(option)來定義時鍾的占空因數(duty cycle),偏移(offset/skew)和時鍾名( clock name),我們可以通過man create_clock 來查看命令的相關選項。
一旦定義了時鍾,對於寄存器之間的路徑,我們已經做了約束。我們可以用report_clock命令來查看所定義的時鍾以及其屬性。如果我們需要使用時鍾的兩個沿(上升沿和下降沿),時鍾的占空因數將影響時序的約束。
然而單單定義一個時鍾周期進行約束寄存器與寄存器之間的路徑很顯然是過於理想的,需要再添加其他的時鍾屬性,在添加之前,需要知道時鍾的偏移(skew)、抖動(jitter)、轉換時間(transition)、延時(latency)這幾個概念或者這幾個時鍾的屬性,這些屬性請查看我的另一篇博文:
http://www.cnblogs.com/IClearner/p/6440488.html
該博文詳細介紹了時鍾的建模,也就是路徑2的約束。
③路徑1(輸入端口到寄存器D端)的約束:
這里討論的是模塊前后使用的是同一個時鍾CLK,如下圖所示,至於使用不同的時鍾(比如前面的模塊是ClkA而不是Clk,那么約束就不一樣了)放在后面說。
在上圖中,在Clk時鍾上升沿,通過外部電路的寄存器FF1發送數據經過輸人端口A傳輸到要綜合的電路,在下一個時鍾的上升沿被內部寄存器FF2接收。它們之間的時序關系如下圖所示:
對於我們要綜合的模塊,DC綜合輸入的組合邏輯,也就是上面的電路N,得到它的延時是Tn,但是這個Tn是否滿足的要求(比如說滿足觸發器的建立時間)呢?在進行約束之前,DC是不知道的,因此我們通過約束這條路徑,也就是告訴DC外部的延時(包括寄存器翻轉延時和組合邏輯、線網的傳輸延時)是多少,比如說是Tclk-q+Tm,在約束了時鍾之后,DC就會計算這條路徑留給電路N的延時是多少,也就是Tclk-q+Tm。然后DC就拿Tclk -(Tclk-q+Tm)和Tn+Tsetup相比較,看Tclk -(Tclk-q+Tm)是否比Tn+Tsetup大,也就是看綜合得到的電路N的延時Tn是不是過大,如果Tn太大,大於Tclk -(Tclk-q+Tm),那么DC就會進行優化,以減少延時。如果延時還是太大,DC就會報錯。因此我們要進行輸入端口的約束,告訴外部電路的延時是多少,以便DC約束輸入的組合邏輯。
如果我們已知輸入端口的外部電路的延遲(假設為4 ns,包括翻轉延時和外部的邏輯延時),就可以很容易地計算出留給綜合電路輸入端到寄存器N的最大允許延遲:
DC中,用get_input_delay命令約束輸人路徑的延遲:
set_input_delay -max 4 -clock CLK [get_ports A]
我們指定外部邏輯用了多少時間,DC計算還有多少時間留給內部邏輯。在這條命令中,外部邏輯用了4 ns,對於時鍾周期為10 ns的電路,內部邏輯的最大延遲為10 - 4 - Tsetup = 6 。
例如,對於下面的電路:
輸入端口延時的約束如下所示:
create_clock -period 20 [get-ports Clk]
set_input_delay -max 7.4 -clock Clk [get-ports A]
對應的時序關系圖如下所示:
如果觸發器U1的建立時間為1ns,則N邏輯允許的最大延遲為:
20 - 7 .4 - 1 = 11 .6 ns
換言之:如果N邏輯允許的最大邏輯為11.6ns,那么可以得到外部輸入最大的延時就是20-11.6-1=7.4ns.
上面是沒有考慮不確定因素情況,當考慮不確定因素時,則有:
當有抖動和偏移的時候(假設不確定時間為U),如果觸發器U1的建立時間為1ns,外部輸入延時為D(包括前級寄存器翻轉和組合邏輯的延時),則N邏輯允許的最大延遲S為:
20-D-U-1=S,同樣可以得到外部輸入的延時為:20-U-1-S=D
當輸入的組合邏輯有多個輸入端口時,如下圖所示:
則可以用下面命令對除時鍾以外的所有輸人端口設置約束:
set_input_delay 3.5 -clock Clk -max [remove_from_collection [all_ inputs ] [get_ports Clk] ]
remove_from_collection [all_inputs] [get_ports Clk]”;#命令表示從所有的輸入端口中除掉時鍾Clk。
如果要移掉多個時鍾,用下面的命令:
Remove_from_collection [all_inputs] [get_ports "Clk1 Clk2"]
④路徑3(寄存器到輸出端口)的約束:
在了解了路徑1的約束直接之后,路徑3的約束就變得容易理解了,路徑3與外部輸出電路的的電路圖如下所示:
clk時鍾上升沿通過內部電路的寄存器FF2發送數據經要綜合的電路S,到達輸出端口B,在下一個時鍾的上升沿被到達外部寄存器的FF2接收。他們之間的時序關系如下圖所示,我們要要約束的的組合路徑電路S的延時,要DC計算它的延時是否能夠滿足時序關系,就要告訴DC外部輸出的延時大概是多少:
當我們已知外部電路的延遲(假設為5.4 ns),就可以很容易地計算出留給要綜合電路輸出端口的最大延遲,如下圖所示:
DC中,用set_output_delay命令約束輸出路徑的延遲,對於上面的電路圖,有:
set_output_delay -max 5. 4 -clock Clk [get_ports B]
我們指定外部邏輯用了多少時間,DC將會計算還有多少時間留給內部邏輯。舉個例子說,對於下面的這個電路模型:
寄存器到輸出端口的時序路徑約束為:
create_clock -period 20 [get_ports Clk]
set_output_delay -max 7.0 -clock Clk [get_ports B]
對應的時序關系圖如下所示:
如果U3的Tclk-q = 1. 0ns,則S邏輯允許的最大延遲為:
20 - 7 .0 - 1=12 ns,也就是說如果S邏輯到最終的延時大於12ns,那么這條時序路徑就會違規,DC就會報錯。
上面是沒有考慮抖動和偏移的,內部延時為S(包括clk-q和組合邏輯延時),外部輸出延時為X(包括外部組合邏輯和后級寄存器的建立時間),時鍾周期為T,那么就有:
T-S=X,知道了最大的內部延時S,就可以算出輸出外部允許的最大延時X
當考慮抖動偏移等組成的uncertainty因素時,假設不確定時間為Y,那么就有:
T-Y-S=X,因此外部輸出延時X,可以直接得到,也可以通過內部延時間S(和不確定時間Y)接計算得出X。
在這里說一下關於輸入路徑延時和輸出路徑延時的一些實際情況。 進行SOC設計時,由於電路比較大,需要對設計進行划分,在一個設計團隊中,每個設計者負責一個或幾個模塊。設計者往往並不知道每個模塊的外部輸入延遲和/或外部輸出的建立要求(這些要求或許在設計規格書里面寫有,或許沒有,當沒有的時候設計者就不知道了),如下圖所示:
這時,我們可以通過建立時間預算(Time Budget),為輸入/輸出端口設置時序的約束,也就是先預置這些延時,大家先商量好(或者設計規格書聲明好)。但是預置多少才合適呢?就有下面的基本原則了:
DC要求我們對所有的時間路徑作約束,而不應該在綜合時還留有未加約束的路徑。我們可以假設輸人和輸出的內部電路僅僅用了時鍾周期的40%。如果設計中所有的模塊都按這種假定設置對輸人/輸出進行約束,將還有20%時鍾周期的時間作為富余量( Margin),富余量中包括寄存器FF1的延遲和FF2的建立時間,即:富余量=20%時鍾周期 - Tclk-q - Tsetup,如下圖所示:
舉個例子說,對於前面的電路,就要按照這么一個比例進行設置:
對應的約束為:
create_clock -period 10 [get-ports CLK]
set_input_delay -max 6 -clock CLK [all_inputs]
remove_input_delay [get ports CLK] ;#時鍾不需要輸入延遲的約束
set_output_delay -max 6 -clock CLK [all-outputs]
如果設計中的模塊以寄存器的輸出進行划分,時間預算將變得較簡單,如下圖所示:
時間預算的約束為:
create_clock -period 10 [get-ports CLK]
set_input_delay -max $Tclk-q -clock CLK [all_inputs]
remove_input_delay [get ports CLK] ;#時鍾不需要輸入延遲的約束
set_output_delay -max [expr 10-$Tclk-q] -clock CLK [all-outputs]
⑤路徑4的約束
路徑4是組合邏輯的路徑,組合邏輯的約束可能需要虛擬時鍾的概念。組合邏輯可能有兩種中情況,一種是前面電路中的路徑4:
模塊里面有輸入端口到輸出端口的組合邏輯外,也有時序邏輯,也就是模塊里面有時鍾,那么就可以對於路徑4,就下面的電路模型進行約束:
組合邏輯部分F的延時Tf就等於時鍾周期T-Tinput_delay-Toutput_delay,時鍾周期減去兩端,就得到了中間的延時約束了,對於上面的模型,可以這樣約束為:
set_input_delay 0.4 -clock CLK -add_delay [get_ports B]
set_output_delay 0.2 -clock CLK -add_delay [get_ports D]
set_max_delay $CLK_PERIOD -from [get_ports B] -to [get_ports D]
當然,最后一句的約束可有可無。對於多時鍾的同步約束,只需要修改相應的延時和時鍾就可以了,可以參考前面的多時鍾同步時序約束那里。
當考慮有不確定因素時,假設F的延時是F,外部輸入延時為E(clk-q+組合邏輯延時),外部輸出延時為G(組合邏輯延時+后級寄存器建立時間),不確定時間為U,時間周期為T,則有(最大頻率下):
T - F -E-U = G
另外一種是純的組合邏輯,模塊內部沒有時鍾:
這種時鍾需要用到虛擬時鍾的概念,后面介紹有虛擬時鍾的約束時,再進行說明。
3、實戰
首先設計的模塊如下所示:
設計(約束)規格書如下所示:
(時鍾的定義)
(寄存器建立時間定義)
(輸入輸出端口的延時定義)
(組合邏輯的定義)
上面的規格定義用來給我們進行時序約束使用,現在實踐開始。
·創建.synopsys_dc.setup文件,設置好DC的啟動環境
-->common_setup.tcl文件:
由於這里有物理庫,因此可以使用DC的拓撲模式進行啟動。
-->dc_setup.tcl文件:
-->.synopsys_dc.setup文件:
-------------------------------------這一步時間不夠下可以忽略------------------
·啟動DC,查看target_library的信息
-->啟動的時候,我們使用管道開關,把DC的啟動信息保存到start_report.log里面(dc_shell -topo是DC的啟動命令,啟動時產生的信息,通過 | tee -i 流入start_report.log文件中):
(我們也可以通過啟動gui界面進行輸入命令,也可以在shell中輸入命令)
-->由於我們僅僅是需要查看target_library庫的信息,因此我們只需要讀入庫:read_db sc_max.db
-->然后我們查看與這個庫相關聯的工藝庫:list_libs,結果為:
我們可以看到,sc_max.db是target_library的的文件名稱,而target_library的庫名字是cb13fs120_tsmc_max
-->接着我們查看庫信息:
這里我們使用重定向的命令,將報告的結果保存到哦lib.rpt這個文件中。redirect是重定向的命令,-file是將命令產生信息保存到文件中,lib.rpt是要保存信息到文件,后面的{}中存放的是要執行的命令。
然后在終端讀取相應庫的單位信息,時序單位為ns,電容單位為pf
------------------------------------------------------------------------------------------------
·創建約束
在完成啟動文件的書寫之后,我就需要根據設計規格書,進行書寫約束了
-->時鍾的約束(寄存器和寄存器之間的路徑約束):
1.時鍾頻率為333.33MHz,因此時鍾周期就是3ns:
create_clock -period 3.0 [get_ports clk]
2.時鍾源到時鍾端口的(最大)延時即source latency是0.7ns
set_clock_latency -source -max 0.7 [get_clocks clk]
3.時鍾端口到寄存器的時鍾端口延時即network latency為0.3ns有0.03ns的時鍾偏移:
set_clock_latency -max 0.3 [get_clocks clk]
4.時鍾周期有0.04ns的抖動
5.需要為時鍾周期留0.05ns的建立時間余量
這里我們就要設置不確定因素了,由於設計規格聲明是對建立時間留余量,因此我們主要考慮建立時間的不確定因素:
首先是時鍾偏移為±30ps,則有可能是前級時鍾往后移30ps,同時本級時鍾往前移30ps,對於建立時間偏移的不確定因素為30+30 =60ps;
然后是時鍾抖動,前級的時鍾抖動影響不到本級,因此只需要考慮本級的時鍾抖動,由於是考慮建立時間,因此考慮本級時鍾往前抖40ps,即對於建立時間抖動的不確定因素為40ps;
最后是要留50ps的建立時間不確定余量;
因此對於建立時間,總的不確定時間為60+40+50=150ps=0.15ns:
set_clock_uncertainty -setup 0.15 [get_clocks clk]
6.時鍾轉換時間為0.12ns:
set_clock_transition 0.12 [get_clocks clk]
-->輸入延遲約束(輸入路徑的約束):
1.規定模塊內data1和data2端口的邏輯S延時最大為2.2ns,並沒有直接告訴外部邏輯的延時,因此我們需要計算:
外部最大的延時為:clock period - clock uncertainty - delay of S - register setup time = 3.0 - 0.15 - 2.2 - 0.2 = 0.45ns, 因此有:
set_input_delay -max 0.45 -clock clk [get_ports data*]
2.對於sel端口,由於明顯地、直接說了從外部數據發送端(指的是F3的clk)到sel端口的latest(最大)絕對延時是1.4ns,也就是說,這個絕對延時包括了時鍾的latency延時,而input_delay是不包括的,input_delay是相對時鍾的前級邏輯延時,是不包括時鍾的latency,那么就需要減去時鍾的latency(包括source 和 network):
1.4ns-(700ps + 300ps) = 0.4ns,那么就有:
set_input_delay -max 0.4 -clock clk [get_ports sel]
-->輸出延時約束(輸出路徑的約束):
1.直接告訴了在out1的外部組合邏輯的最大延時為0.42ns,后級觸發器的建立時間為0.08ns,也就是外部延時為0.42+0.08=0.5ns:
set_output_delay -max 0.5 -clock clk [get_ports out1]
2.內部延時為810ns,應用前面的公式:時鍾周期-內部延時(翻轉與內部組合邏輯延時)-不確定時間=外部延時(外部組合邏輯+后級寄存器的建立時間),於是有:3-0.81-0.15=2.04ns,於是有:
set_output_delay -max 2.04 -clock clk [get_ports out2]
3.意思是外部延時只有后級寄存器的建立時間要求:
set_output_delay -max 0.4 -clock clk [get_ports out3]
-->組合邏輯的約束:
根據前面的公式可以得到:
3-0.15-輸入延時-2.45=輸出延時,於是可以得到:
輸入延時+輸出延時 = 0.4ns
由於設計規格沒有規定這個比例,因此只要滿足輸入輸出延時的關系滿足上面的式子都可以,如果綜合后有違規,我們后面可以再適當調整一下,設置為:
set_input_delay -max 0.3 -clock clk [get_ports Cin*]
set_output_delay -max 0.1 -clock clk [get_ports Cout]
-->檢查語法:
·啟動DC
(·讀入設計前的檢查)
·讀入設計(和查看設計)
這里和流程一樣。主要是read、current_design 、link、check_design,這里就不具體演示了。
·應用約束和查看約束
-->直接執行source scripts/MY_DESIGN.con進行應用約束
-->查看有沒有缺失或者沖突的關鍵約束:
check_timing,返回值為1,表示執行成功。
-->驗證時鍾是否約束正確:
report_clock
report_clock -skew
report_port -verbose
-->保存約束好的設計:
write -format ddc -hier -out unmapped/MY_DESIGN.ddc
·綜合
(簡單的步驟跟流程一樣)
·綜合后檢查(與優化)
(簡單的步驟跟流程一樣)
·保存綜合后的設計
(簡單的步驟跟流程一樣)