DC學習(時序分析和命令)

關於objects
1、分類
在這裏插入圖片描述
2、包括六類:Design、clock、port、net(模塊與模塊之間的互連線)、cell(例化的模塊)、pin(cell裏面的引腳)
在這裏插入圖片描述
3、design可以轉換爲cell
4、當objects名字相同時:
在這裏插入圖片描述
加在net上,5個單位的電容會覆蓋原電容值;加在port上,5個單位電容與原電容值x並聯,總電容值爲(5+x)個單元
set_load 5 [get_net sum]:加載在net上

相關命令:
1、get_:返回一組objects;使用echo返回objects的句柄
set_load 5 [get_ports addr_bus * ] * 是模式匹配裏多個的意思,以addr_bus開頭的n個port
set_load 6 [get_ports "Y??M Z
"] ?是模式匹配裏匹配前面字符0個或者1個的意思
如果不存在,返回empty_collection
2、all_*:
all_inputs

all_outputs

all_clocks

all_registers
3、 remove_from_collection
remove_from_collection [all_inputs] [get_ports CLK] #從所有inputs裏去除CLK

add_to_collection $pci_ports [get_ports CTRL] #在pci_ports裏添加CTRL
4、query_objects $pci_ports

query_objects $foo #得到集合的具體objects  
5、sizeof_collection $pci_ports(大小)
6、echo
set foo [get_ports p*]
echo $foo #返回集合的句柄值
7、過濾器
filter_collection [get_cells ] "ref_name = ~AN "

get_cells *-filter “don’t_touch == true”
8、index_collection $pci_ports number
相當於求數組的某個number值

objects的屬性:
在這裏插入圖片描述
基本時序約束:
1、分類:時鐘的約束(寄存器與寄存器之間)、輸入延時的約束、輸出延時的約束
在這裏插入圖片描述
2、時序約束對電路的要求:

  • 綜合工具現在不能很好地支持異步電路,甚至不支持異步電路;
  • single clock,single cycle,單個時鐘,單延觸發,不要一會posedge,一會negdege

3、路徑:

  • 起點:輸入端口(input port)、觸發器或寄存器的時鐘引腳
  • 輸出端口:輸出端口、時序器件的除時鐘引腳外的所有輸入引腳
    在這裏插入圖片描述
    具有四條路徑:
  • 從輸入端口A到FF1的D端口
  • 從時鐘clk到FF2的D端口
  • 從時鐘clk到FF2的輸出端口
  • 從輸入端口A到FF2的輸出端口

路徑的特性是存在延時,也就是說,路徑1、2、3、4都存在有延時,延時最長的一條路徑稱爲關鍵路徑。
滿足建立時間的約束:爲了滿足FF2建立時間的要求,數據從FF1的clk端口到達FF2的D端口+FF2的建立時間不能超過時鐘週期,也就是說(觸發器的翻轉時間/轉換延時、寄存器與寄存器之間的組合邏輯延時、連線延時這些種延時)不能過大。
滿足保持時間的約束:也就是數據經過上面的延時(觸發器的翻轉時間/轉換延時、寄存器與寄存器之間的組合邏輯延時、連線延時)之後到達FF2的D端的時間,不能小於某個值。也就是說,這些延時也不能太小。
(在0ns的時候,觸發器有效沿到來,FF1和FF2都要更新下數據,FF1準備鎖存高電平,FF2準備鎖存低電平;由於FF1反應很快,電路延時很小,FF1寄存住的高電平很快就會傳到FF2的D端口,高電平就會沖掉FF2要鎖存的低電平(也就是FF2的D端口低電平還沒有穩定,違反了保持時間),也就是說會導致低電平對FF2的保持時間不能得到滿足,導致FF2更新數據失敗,要鎖存住的低電平可能就產生亞穩態)

所以,保持時間的分析比建立時間的分析提前一個時鐘週期沿,也就是說在0ns時候傳輸數據,建立時間是在下一個時鐘上升沿(20ns時刻)進行檢查FF2的D端口數據是否穩定(若不穩定,就違反了建立時間),而保持時間是在發送數據的同一時刻(也就是0ns時刻)檢查FF2的D端口數據是否穩定(如果不穩定,就違反了保持時間)

時鐘約束
寄存器與寄存器間的延時小於時鐘週期減去建立時間,即: path delay <= Clock Period - Tsetup
定義時鐘週期的命令爲:create_clock。例如:create_clock -period 10 [get_ports clk] 
定義時鐘時,必須定義時鐘週期(-period)和時鐘源(端口或引腳)也可以加上一些可選項(option)來定義時鐘的佔空因數(duty cycle),偏移(offset/skew)和時鐘名( clock name)等(一旦定義好時鐘,可以通過report_clock命令來查看所定義的時鐘以及其屬性,如果我們需要使用時鐘的兩個沿(上升沿和下降沿),時鐘的佔空因數將影響時序的約束)
需要再添加其他的時鐘屬性,在添加之前,需要知道時鐘的偏移(skew)、抖動(jitter)、轉換時間(transition)、延時(latency)這幾個概念或者這幾個時鐘的屬性。
路徑1:輸入端口A到寄存器D端的約束
之前討論前後使用的是同一個時鐘CLK,如果使用不同時鐘,那麼約束就不同了。
在這裏插入圖片描述
在這裏插入圖片描述
如果Tn較大(Tn+Tsetup>Tclk-(Tclk-q+Tm)),那麼DC就會進行優化,使Tn減少,如果Tn還是過大,DC就會報錯。因此我們要進行輸入端口的約束,告訴外部電路的延時是多少,以便DC約束輸入的組合邏輯。
如果我們已知輸入端口的外部延遲(假設爲4 ns,包括翻轉延時和外部的邏輯延時),就很容易計算出留給綜合電路輸入端到寄存器N的最大允許延遲。
在這裏插入圖片描述
DC中,用set_input_delay命令約束輸入路徑的延遲
set_input_delay -max 4 -clock CLK [get_ports A]
在這條命令中,外部邏輯用了4 ns,對於時鐘週期爲10 ns的電路,內部邏輯的最大延遲爲10 - 4 - Tsetup = 6

在這裏插入圖片描述
輸入端口延時的約束爲

creat_clock -period 20 [get_ports CLK]

set_input_delay -max 7.4 -clock CLK [get_ports A]
在這裏插入圖片描述
當有抖動和偏移的時候(假設不確定時間爲U),如果觸發器U1的建立時間爲1ns,外部輸入延時爲D(包括前級寄存器翻轉和組合邏輯的延時),則N邏輯允許的最大延遲S爲:

20-D-U-1=S
在這裏插入圖片描述
可以用下面命令對除時鐘以外的所有輸入端口設置約束:
set_input_delay -max 3.5 -clock CLK [romove_from_collection [all_inputs] [get_ports CLK]];#表示從所有輸入端口中除掉時鐘CLK

路徑3:寄存器到輸出端口的約束
在這裏插入圖片描述
在這裏插入圖片描述
clk時鐘上升沿通過內部電路的寄存器FF2發送數據經要綜合的電路S,到達輸出端口B,在下一個時鐘的上升沿被到達外部寄存器的FF2接收。他們之間的時序關係如下圖。
在這裏插入圖片描述
當我們已知外部電路的延遲(假設爲5.4ns),就可以很容易計算出留給要綜合電路輸出端口的最大延遲
在這裏插入圖片描述
set_output_delay -max 5.4 -clock CLK [get_ports B]
內部邏輯最大延遲爲:Tclk_q+Ts=Tclk-5.4

實際情況
進行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 4 -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]

另一種純組合邏輯:
用到虛擬時鐘的概念,create_clock -name VCLK -period 2 ;#指定一個虛擬時鐘名稱
當輸入延時不同時,第二個輸入延時命令會覆蓋第一個輸入延時命令
在這裏插入圖片描述
使用DC的步驟:
1、啓動DC

list_designs ;#打開當前設計

remove_design -hierarchy;#移除設計

2、讀verilog(analyze - elaborate)

analyze -format verilog ./rtl/TOP.v

elaborate architecture verilog TOP

3、檢查設計

link

check_design

4、輸入約束條件

  • 在添加約束之前,使用reset_design清除前面存留的約束
  • 添加時鐘頻率:create_clock -period 2 [get_ports Clk]
  • 添加輸入端口延時
    在這裏插入圖片描述
  • 添加輸出端口延時
    在這裏插入圖片描述
    (若寫的是腳本約束,檢查語法命令:shell腳本下 dcprocheck ./script/file.con)

5、檢查所有路徑是否約束
check_timing
//出現error則有路徑沒有約束完

6、編譯
compile

7、綜合後的檢查(檢查不通過的需要優化,這裏只作爲一般流程,沒有進行優化)
report_constraint -all (查看是否違規)

report_timing (查看時序報告)

report_area (查看面積情況)

時鐘的約束:
1、時鐘樹
全局時鐘在芯片中的體現形式是時鐘樹(是個由許多緩衝單元(buffer cell)平衡搭建的時鐘網狀結構)

在這裏插入圖片描述
2、時鐘屬性
(1)時鐘偏移(skew):時鐘分支信號在到達寄存器的時鐘端口過程中,都存在有線網等延時,由於延時,到達寄存器時鐘端口的時鐘信號存在有相位差,也就是不能保證每一個沿都對齊,這種差異稱爲時鐘偏移(clock skew),也叫時鐘偏斜。時鐘的偏移如下圖所示:此外,時鐘skew與時鐘頻率並沒有直接關係,skew與時鐘線的長度及被時鐘線驅動的時序單元的負載電容、個數有關。
在這裏插入圖片描述
(2)時鐘抖動(jitter):相對於理想時鐘沿實際時鐘存在不隨時間積累的、時而超前、時而滯後的偏移稱爲時鐘抖動,簡稱抖動
在這裏插入圖片描述
時鐘的抖動可以分爲隨機抖動(Random Jitter,簡稱Rj)和固有抖動(Deterministic jitter):

  • 隨機抖動的來源爲熱噪聲、Shot Noise和Flick Noise,與電子器件和半導體器件的電子和空穴特性有關,比如ECL工藝的PLL比TTL和CMOS工藝的PLL有更小的隨機抖動;
  • 固定抖動的來源爲:開關電源噪聲、串擾、電磁干擾等等,與電路的設計有關,可以通過優化設計來改善,比如選擇合適的電源濾波方案、合理的PCB佈局和佈線。

時鐘的偏移和時鐘的抖動都影響着時鐘網絡分枝的延遲差異(相位差異),在Design Compiler裏面,我們用時鐘的不確定性(uncertainty)來表示這兩種情況的影響。

(3)時鐘的轉換時間(transition):時鐘的上升沿跳變到下降沿或者時鐘下降沿跳變到上升沿的時間,這個時間並不是如左下圖所示那樣完全沒有跳變時鐘的,而是像右下圖那樣,時鐘沿的跳變時間就是時鐘的轉換時間
在這裏插入圖片描述
時鐘的轉換時間與與單元的延時時間(也就是器件特性)還有電容負載有關

(4)時鐘的延時(latency) :時鐘從時鐘源(比如說晶振)出發到達觸發器時鐘端口的延時,稱爲時鐘的延時,包含時鐘源延遲(source latency)和時鐘網絡的延遲(network latency)
在這裏插入圖片描述
時鐘源延遲(clock source latency),也稱爲插入延遲(insertion delay),是時鐘信號從其實際時鐘原點到設計中時鐘定義點(時鐘的輸入引腳)的傳輸時間,上圖是3ns
時鐘網絡的延遲( clock network latency)是時鐘信號從其定義的點(端口或引腳)到寄存器時鐘引腳的傳輸,經過緩衝器和連線產生的延遲(latency),上圖是1ns

時鐘約束命令
create_clock、set_clock_uncertainty、set_clock_latency、set_clock_transition分別進行時鐘的週期、偏移、延時、轉換約束。

1、時鐘偏差的建模
set_clock_uncertainty:對時鐘的偏移與抖動進行建模,也就是對時鐘的偏差進行建模。

 create_clock -period 10 [get_ports  CLK]

 set_ clock_ uncertainty  -setup  0.5  [get_clocks CLK]

在這裏插入圖片描述
在默認的情況下,“set-clock_uncertainty”命令如果不加開關選項“-setup”或“-hold”,那麼該命令給時鐘賦予相同的建立和保持偏差值。
除此之外,還可以對時鐘的上升沿和下降沿進行偏差建模,比如上升沿的偏差是0.2ns,下降沿的偏差是0.5ns,則有:
在這裏插入圖片描述
set_ clock_ uncertainty -rise 0.2 -fall 0.5 [get_clocks CLK]

2、時鐘轉換時間的建模
由於時鐘並不是理想的方波,用set_ clock_ transition來模擬時鐘的轉換(transition)時間。默認的上升轉換時間爲從電壓的20%上升至80%的時間,下降的轉換時間爲從電壓的80%下降至20%的時間。如果set_clock_transition命令中不加開關選項“-setup”或“-hold" ,那麼該命令給時鐘賦予相同的上升和下降轉換時間。一般情況下,我們只約束最大的轉換時間,如最大轉換時間是0.2ns,那麼就加上-max選項:
set_clock_transition -max 0.2 [get_clocks CLK]

3、時鐘延遲的建模
一般情況下,我們把時鐘源延遲(source latency)和時鐘網絡的延遲(network latency)分開來,因爲時鐘源延時需要建模,是因爲DC是真的不知道這延時是多大,但是對於時鐘網絡的延遲,DC在佈局佈線前不知道,但是在佈局佈線後就可以計算出來時鐘網絡的延時了,因此在佈局佈線之後進行綜合時,就沒有必要對時鐘網絡進行延時,因此就要把這兩個延時分開來進行約束。
佈局佈線之前:時鐘週期爲10ns,時鐘源到芯片的時鐘端口時間是3ns,時鐘端口都內部觸發器的時間是1ns,如下圖所示
在這裏插入圖片描述

create_clock  -period  10  [get-ports CLK]

set_clock_latency  -source  3  [get_clocks CLK]

set_clock_latency 1  [get_clocks CLK]

佈局佈線之後:就可以計算實際的線網延時,就要使用

set_propagated_clock  [ get_clocks CLK] 

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