文章目錄
- sdc:基本的時序路徑限制
-
- 1、概念
-
- 時序路徑
- 關鍵路徑
- 路徑限制
-
- 1、路徑2(寄存器到寄存器的路徑)限制
- 2、路徑1(輸入到寄存器D端)的限制
- 3、路徑3(寄存器到輸出端口)的限制
- 4、路徑4(輸入到輸出)的限制
-
- **(1)路徑4:輸入到輸出**
- **(2) 純組合邏輯,内部沒有時鐘**
- 2、實戰
-
- 設計(限制)規格書:
- .synopsys_dc.setup檔案,設定DC啟動環境
-
- common_setup.tcl
- dc_setup.tcl
- .synopsys_dc.setup
- 啟動DC,檢視 target_library資訊
- 書寫限制
-
- 時鐘限制
- 輸入延遲限制(輸入路徑限制)
- 輸出延時限制(輸入路徑限制)
- 組合邏輯限制
- 其他流程
本文整理自: 數字IC之路-SDC篇(一)
sdc:基本的時序路徑限制
1、概念
時序路徑
信号可以連續穿過,不必等待其他觸發條件的路徑。沿着時序路徑,信号僅僅在通過電路元器件時有延時。
時序路徑是一個點到點的資料通路,資料沿着時序路徑進行傳輸。每條時序路徑有一個起點(startpoint)和一個終點(endpoint)
起點定義:
- 輸入端口
- 觸發器或寄存器的時鐘引腳
終點定義:
- 時序器件的除時鐘引腳外的所有輸入引腳
- 輸出端口
時序路徑類型
- 輸入端口到寄存器(A -> FF1/D)
- 寄存器到寄存器 ( FF1/clk -> FF2/D)
- 寄存器到輸出端口 ( FF2/clk -> Z)
- 輸入端口到輸出端口 ( A -> Z )
關鍵路徑
路徑都存在延時,延時最長的一條路徑稱為關鍵路徑。一般路徑4比較少見
路徑限制
1、路徑2(寄存器到寄存器的路徑)限制
為什麼要限制時序路徑?
- 為了滿足寄存器的建立時間和保持時間
路徑2的時序路徑延時:觸發器的翻轉時間/轉換延時、寄存器與寄存器之間的組合邏輯延時、連線延時等
要滿足FF2建立時間的要求
需滿足:時序路徑延時+FF2的setup time,要小于時鐘周期。
當對時鐘進行模組化(即對寄存器與寄存器之間的路徑進行限制),時鐘周期、時序路徑延時就确定了,DC就會選擇合适的單元來滿足這些延時的限制。若選擇最合适的單元,電路的延時還是很大,無法滿足FF2建立時間的要求,DC就會報錯,發生setup violation。
要滿足FF3保持時間的要求
需滿足:時序路徑延時 ≥ FF2的保持時間(保證FF1的資料傳輸到FF2時,FF2的前一時刻的資料已經捕獲到,不會被覆寫導緻出錯)
保持時間的分析比建立時間的分析提前一個時鐘邊沿(建立時間是在下一個時鐘沿到來時限制,保持時間是在這個時鐘沿下第一個觸發器的資料不會太快傳輸到第二個觸發器,使得第二個觸發器的資料維持時間太短,沒有被采樣到)
保持時間一般能夠滿足,若不滿足,在後端版圖設計的時候修改:加buffer增大延時
create_clock -period 10 [get_ports clk]
# 定義時鐘(虛拟時鐘後面詳述)必須定義周期 period 和時鐘源(端口或引腳,上面的clk)
# 可選項:duty cycle(占空比),offset/skew(偏移),clock name(時鐘名)
# 檢視所定義的時鐘屬性
report_clock
限制寄存器到寄存器之間的路徑,還要添加偏移(skew)、抖動(jitter)、轉換時間(transition)、延時(latency)
2、路徑1(輸入到寄存器D端)的限制
前提:子產品前後使用的同一個時鐘CLK
要滿足時序要求,即要求:Tclk - (Tclk-q+Tm) ≥ Tn + Tsetup (即建立時間裕量要≥0)
示例
如果已知外部電路的延遲(假設為4),則可限制内部組合邏輯電路允許的最大延時
create_clock -period 20 [get_ports Clk]
set_input_delay -max 7.4 -clock CLK [get_ports A]
即組合邏輯N允許的最大延遲為:20 - 7.4 - 1(setup time) = 11.6ns
反之也可以通過确定内部組合邏輯N的延遲,推出外部輸入的最大延時
當有clock skew 和 clock jitter 的時候
假設不确定時間為Tuncertainty,觸發器U1的建立時間Tsetup,外部輸入延時Texternal_delay(包括前級寄存器翻轉群組合邏輯的延時),則N邏輯允許的最大延遲 Tinternal_delay 為:
Tinternal_delay = Tclk_period - Tuncertainty - Tsetup - Texternal_delay
當輸入的組合邏輯有多個輸入端口時
對時鐘以外的所有輸入端口設定限制
set_input_dealy 3.5 -clock Clk -max [remove_from_collection [all_inputs][get_ports Clk]]
# 從所有的輸入端口中除掉時鐘Clk
#remove_from_collection [all_inputs][get_ports Clk]
# 若要移除多個時鐘
remove_from_collection [all_inputs][get_ports "Clk1 Clk2"]
3、路徑3(寄存器到輸出端口)的限制
clk時鐘上升沿通過内部電路的寄存器FF2發送資料經過要綜合的電路S,再經過輸出口B 在下一個時鐘的上升沿被到達外部寄存器的FF3接收.
要限制組合邏輯S的延時,則要告訴DC外部輸出延時
示例
create_clock -period 20 [get_ports Clk]
set_output_delay -max 7 -clock Clk [get_ports B]
若U3的Tclk-q=1ns,則S邏輯允許的最大延時為:20 - 7 - 1 = 12ns
考慮 skew 和 jitter
内部延時S(包括 clk-q 和 組合邏輯延時),外部輸出延時X(包括外部組合邏輯和後一級寄存器的建立時間),時鐘周期T,uncertainty時間為Y,則
X = T - Y - S
實際SOC設計
各子產品分部分設計,需要建立時間預算(Time Budget),為輸入、輸出端口預置一個商量好的延時
延時預置規則:
- DC要求對所有的時間路徑做限制,而不應該在綜合時還留有未加限制的路徑
- 可以預設輸入/輸出的内部電路僅僅用了時間周期的40%。
- 若設計中的所有子產品都是按照這種假定設定對輸入 和 輸出進行限制,這還有 20% 時鐘周期作為裕量(margin)。裕量包括寄存器FF1的延遲和FF2的建立時間:margin = 20%時鐘周期 - Tclk-q - Tsetup
示例
# contrains
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]
4、路徑4(輸入到輸出)的限制
路徑4是組合邏輯的路徑,組合邏輯的限制可能需要虛拟時鐘。有兩種情況
(1)路徑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];#這句可有可無
考慮uncertainty
假設F的延時是F,外部輸入延時為E(clk-q + 組合邏輯延時),外部輸出延時為 G (組合邏輯延時 + 後級寄存器建立時間 ),不确定時間為 U,時間周期為 T(最大頻率下):
F = T - G -E - U
(2) 純組合邏輯,内部沒有時鐘
要用到虛拟時鐘
2、實戰
設計(限制)規格書:
時鐘定義
寄存器建立時間定義
輸入輸出端口延時定義
組合邏輯定義
.synopsys_dc.setup檔案,設定DC啟動環境
common_setup.tcl
dc_setup.tcl
.synopsys_dc.setup
啟動DC,檢視 target_library資訊
$ dc_shell -topo | tee -i star_report.log
# dc_shell -topo:DC的啟動指令
#啟動時産生的資訊,通過 |tee -i流入 start_report.log 檔案中
# 讀入庫
read_db sc_max.db
# 檢視庫相關聯的工藝庫
list_libs
# 檢視庫資訊
redirect -file lib.rpt { report_lib 上面的庫檔案對應的庫名稱 }
# 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]
# 确立clock_uncertainty
# 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_clock 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.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不包括時鐘的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.out2的内部延時為810ns:時鐘周期-内部延時(翻轉與内部組合邏輯延時)- 不确定時間=外部延時(外部組合邏輯+後級寄存器的建立時間),即 3-0.81-0.15=2.04ns
set_output_dealy -max 2.04 -clock clk [get_ports out2]
# 3.out3外部延時隻有後級寄存器的建立時間要求
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
- 讀入設計
- 檢視設計(check_design)
- 應用限制和檢視限制
- 應用限制: source scripts/MY_DESIGN.con
- 檢視是否有缺失或沖突的關鍵限制:check_timging
- 傳回1,表示執行成功
- 驗證時鐘是否限制正确
report_clock report_clock -skew report_port -verbose
- 儲存限制好的時鐘
write -format ddc -hier -out unmapped/MY_DESIGN.ddc
- 綜合
- 綜合後檢查與優化
- 儲存綜合後的設計
詳細可檢視原文