Tcl與Design Compiler (六)——基本的時序路徑約束

原文地址:http://www.cnblogs.com/IClearner/p/6624722.html

作者: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

 

·綜合

(簡單的步驟跟流程一樣)

·綜合後檢查(與優化)

(簡單的步驟跟流程一樣)

 

·保存綜合後的設計

(簡單的步驟跟流程一樣)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章