時序約束選項

一、timing時序
1、佔空比不爲50%(單沿觸發,佔空比對綜合無影響;雙沿觸發,佔空比對綜合有影響)
(1)通過-wave_form改變佔空比;例如 create_clock -period 2 -wave_form {0 0.6} [get_ports CLK]
在這裏插入圖片描述
(2)通過-wave_form改變初始相位,但是不推薦
create_clock -period 2 -wave_form {0.4 1.4} [get_ports CLK]
在這裏插入圖片描述
(3)複雜時鐘
create_clock -period 1.6 -wave_form {0 0.4 0.6 1.4} [get_ports CLK]
在這裏插入圖片描述
在這裏插入圖片描述
Tff2_setup=0.03ns,則寄存器最大延遲爲:Tmax<=0.6-0.03=0.57ns

2、輸入時鐘的其他約束
(1)輸入時鐘有不同沿觸發
在這裏插入圖片描述
create_clock -period 2 [get_ports CLK]

set_input_delay -max 0.3 -clock CLK -clock_fall [get_ports A]
FF1由下降沿觸發,FF2由上升沿觸發,所以:
在這裏插入圖片描述
Tmax<=1ns-0.3ns-Tsetup
(2)輸入路徑有多個
在這裏插入圖片描述
create_clock -period 2 [get_ports CLK]

set_input_delay -max 0.3 -clock CLK -clock_fall [get_ports A]

set_input_delay -max 1.2 -clock CLK -add_delay [get_ports A];#一定要加上-add_delay,不然第二個延遲信息會覆蓋第一個延遲信息
若Tsetup=0.14
在這裏插入圖片描述
Tmax1<=1-0.3-0.14=0.56
Tmax2<=2-1.2-0.14=0.66

(3)driving cell 對輸入路徑的影響
在這裏插入圖片描述
set_input_delay -max 0.6 -clock CLK [get_ports A]

set_driving_cell -lib_cell NAND2_3 [get_ports A]
產生transition延遲
在這裏插入圖片描述
(4)輸出時鐘的約束
在這裏插入圖片描述
create_clock -period 4 [get_ports CLK]

set_output_delay -max 2.5 CLK [get_ports B]

set_output_delay -max 0.7 CLK -clock_fall -add_delay [get_ports B]
在這裏插入圖片描述
T1max <= 4-2.5-0.1=2.4ns

T2max <= 2-0.7=1.3ns

二、多個時鐘同步電路
同步時鐘:一個時鐘源產生的時鐘或者分頻產生所有需要的時鐘
下面我們來對多時鐘同步設計的時序路徑進行約束,多時鐘電路的模型如下所示:
在這裏插入圖片描述
我們要綜合的模塊的時鐘是CLKC,但是前後模塊的時鐘不一定是CLKC,但是前後模塊的時鐘跟CLKC是來源於同一個時鐘的,比如說經過鎖相環分頻或者倍頻,這裏拿分頻來舉例,比如說CLKA、 CLKB、CLKC、CLKD、CLKE都是由同一個時鐘CLK經過分頻得來,如下圖所示:
在這裏插入圖片描述
在我們要綜合的電路中,只有一個時鐘端口CLKC,即只有CLKC時鐘驅動要綜合電路中的寄存器。其他的時鐘CLKA,CLKB,CLKD和CLKE在我們要綜合的電路中並沒有對應的時鐘端口。因此,它們並不驅動要綜合電路中的任何寄存器。它們主要用於爲輸入/輸出端口延時作約束,可能會出現一個端口有多個約束的情況。
下面我們根據上面的例子作多時鐘的同步設計約束,也就是爲下面的電路類型做約束:
在這裏插入圖片描述
CLKC在要綜合的設計中有對應的輸入端口,其定義與單時鐘時一樣,即:
create_clock -period 20 [get_ports CLKC]

由於CLKA,CLKD和CLKE在要綜合的設計中沒有對應的輸入端口,因此需要使用虛擬(virtual)時鐘。虛擬時鐘在設計裏並不驅動觸發任何的寄存器,它主要用於說明相對於時鐘的I/O端口延遲,DC將根據這些約束,決定設計中最嚴格的約束。建立虛擬時鐘的格式如下:
在這裏插入圖片描述
(上面定義了名字爲VCLK的虛擬時鐘,週期爲20ns。因爲虛擬時鐘不驅動設計中的任何寄存器,設計中沒有其對應的輸入端口。所以定義中沒有源端口或引腳。由於虛擬時鐘沒有對應的時鐘端口,我們必須給它一個名字。與一般時鐘一樣,虛擬時鐘是DC的內存裏已定義的時鐘物體(設計對象),它(們)不驅動(觸發)當前設計中的任何寄存器。用作爲輸入/輸出端口設置延遲)
1、輸入延遲時鐘
在這裏插入圖片描述
對應約束爲:
在這裏插入圖片描述
2、輸出延遲時鐘
在這裏插入圖片描述
創建的虛擬時鐘爲:
create_clock -period [expr 1000/750.0] -name CLKD ;#

create_clock -period 1.0 -name CLKE

create_clock -period 2.0 [get_ports CLKC]
對應的約束爲:
set_output_delay -max 0.1 -clock CLKD [get_ports OUT1]

set_output_delay -max 0.47 -clock CLKE [get_ports OUT1]
所以:Tcdmax <= T(最短上升沿差) - 0.1 = 0.67 - 0.1 =0.57

Tcemax <=T(最短上升沿差) - 0.47 = 1 - 0.47 = 0.53

3、分頻時鐘約束
在這裏插入圖片描述
經過二分頻後從寄存器FF2的輸出端口Q輸出的時鐘,但DC並不知道這是你的時鐘信號,需要添加相應的約束,如下所示:
 create_generated_clock -divide_by 2 -name CLK -source [get_ports CLK] [get_pins FF1/Q] ;#第一個中括號代表分頻的源時鐘,第二個中括號代表輸出分頻的引腳。

三、異步設計路徑和邏輯上不存在的路徑的時序約束(時序例外)
(1)異步設計的路徑約束
在這裏插入圖片描述
上圖中,一共用4個時鐘源,有5種不同的時鐘;我們要綜合電路使用的是時鐘CLKC,時鐘源是OSC3,前後模塊的時鐘各不一樣,因此是異步電路。

進行異步電路設計時,設計者要注意會產生亞穩態,導致某些寄存器的輸出爲不定態。爲了避免產生亞穩態問題,可以考慮在設計中使用雙時鐘、不易到亞穩態的觸發器(double-clocking,metastable-hard Flip-Flops),或使用雙端口(dual-port)的FIFO等等。

對於穿越異步邊界的任何路徑,我們必須禁止對這些路徑做時序綜合。由於不同時鐘源的時鐘之間相位關係是不確定的,一直在變,對跨時鐘域的路徑作時間約束是毫無意義的,可用set_false_path命令爲跨時鐘域的路徑作約束(其實是解除時序路徑的約束)
在這裏插入圖片描述

#Make sure register-register paths meet timing

create_clock  -period  20  [get_ports CLKA]

create_clock  -period  10  [get_ports CLKB]

#Don't optimize logic crossing clock domains

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

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

如果設計中的所有時鐘都是異步的,可用下面命令爲跨時鐘域的路徑做約束:
在這裏插入圖片描述
(2)邏輯上不存在的路徑的約束
在這裏插入圖片描述
當選擇信號是0的時候,前面的MUX打開的是A1,後面MUX打開的是B2,因此數據的通路就是A1B2(數據從A1流到B2);當選擇信號是1的時候,前面的MUX打開的是B1,後面MUX打開的是A2,因此數據的通路就是B1A2。由此可以看到,選擇信號無論是1還是0,前面的MUX的A1引腳和後面的MUX的A2引腳之間是沒有數據流通的,也就是該邏輯通路並不存在。同樣,前面的MUX的B1引腳和後面的MUX的B2引腳之間的邏輯通路也不存在。因此這兩條數據通路就是邏輯上不存在的路徑,比如從點A1到點A2之間有一條物理上的連接路徑,但是點A1輸入信號並不通過這條路徑傳輸到A2;這種物理上存在連接關係,但是邏輯不存在的路徑稱爲邏輯僞路徑,在DC中,僞路徑“false path”稱爲時序例外(timing exceptions):
通過以下約束禁止對這兩路信號進行優化

set_false_path -from [get_clocks A1] -to [get_clocks A2]

set_false_path -from [get_clocks B1] -to [get_clocks B2]

四、多時鐘週期的約束
(1)建立時間
如下圖所示加法器電路,時鐘clk的週期定義爲10ns,按設計規格,加法器的延遲約爲6個時鐘週期:
在這裏插入圖片描述
對於多時鐘週期的建立時間約束,可以使用下面命令進行修改:

create_clock -period 10 [get_ports CLK]

set_multicycle_path -setup 6 -to [get_pins C_reg[*]/D]

注意這條命令是要知道多時鐘週期的終點寄存器的(注意:這條命令設置了所有的前級寄存器時鐘端口到C_reg寄存器的D端口路徑都是多時鐘週期路徑,而set_multicycle_path6-setup -from A_reg/Clk -to [get_pins C_reg[*]/D],則是僅僅現在從A寄存器的時鐘端口到C_reg寄存D端口的這一條路徑而已),通過這條命令,就告訴DC將僅僅在第6個上升沿,即60 ns作建立的分析(也就是間隔6個時鐘週期後再做建立時間分析)。這時,加法器的最大允許延遲是:
在這裏插入圖片描述
在這裏插入圖片描述
(2)保持時間
對於保持時間的約束,我們是不是默認就OK了呢?在前面的建立時間和保持時間的概念中,我們知道默認的保持分析時間在建立分析的前一週期,(此處應該有鏈接)也就是說,在這個多時鐘週期的加法器中,DC將在50 ns這個時刻分析電路有無違反保持要求,要求加法器的最小延時是(注意這是默認的情況下的所做的時序要求):
在這裏插入圖片描述
在這裏插入圖片描述
五、綜合產生的文件
在這裏插入圖片描述
也就是說,DC一般完成綜合後,主要生成.ddc、.def、.v和.sdc,.sdf格式的文件(當然還有各種報告和log)
(1).sdc文件(標準延時約束文件):
在這裏插入圖片描述
裏面都是一些約束,用來給後端的佈局佈線提供參考
(2).def文件:DFT、形式驗證可能用到
在這裏插入圖片描述
裏面包含的是一些掃描鏈的佈局信息,需要注意的是,必須在生成ddc網表文件之前生成.def(也就先生成.def文件),以便將def文件包含在ddc文件中。
(3).sdf、.v文件:標準延時格式和網表格式文件,用於後仿真。
在這裏插入圖片描述
設計中有冗餘的端口(包括內部端口,又稱層次引腳)。如果我們將設計展開(flatten), DC可能把它們優化掉,即去掉這些端口。但是如果我們不展開設計,將得到下面的結果:
在這裏插入圖片描述
相關文件生成:
經過處理之後的網表就可以生成了,除了了網表之外,我們還可以生成時序、面積報告等,相關命令如下所示:
在這裏插入圖片描述
最後,進行網表處理和生成文件的綜合命令如下所示:
在這裏插入圖片描述
如果設計中有多端口連線,應該在編譯過程中將它們去掉。去掉多端口連線使用下面的命令:

set_fix_multiple_port_nets -all -buffer_constants [get_designs *]

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