積體電路設計

時序約束(timing constraint / SDC)

想像你把一個包裹交給快遞員,叮囑一句「這個必須 9:00 整準時送到」。你並沒有告訴他走哪條路——你只是定下了截止時間,找出一條能趕上的路線是他的事。時序約束正是這樣一種指令,只不過它面向的是你的晶片設計工具。你告訴工具時脈跳得多快、截止時間是多少,工具就自己去推算出能踩點完成的閘電路和連線。

你要宣告的最重要的一件事是時脈週期——比如「這個時脈跑在 1 GHz,所以一個訊號大約有 1 奈秒的時間,從一個暫存器走到下一個」。僅憑這一句話,工具就能為設計中的各條路徑推出一份時序預算。然後它會兩次倚重這份預算:邏輯合成靠它來挑選更快或更小的閘,好讓邏輯裝進預算之內;靜態時序分析則在事後靠它來核查,確保沒有訊號來得太晚(建立 setup)——或者同樣糟糕,來得太早(保持 hold)。沒有約束,工具就沒有可瞄準的截止時間,「這塊晶片夠快嗎?」也就成了一個無從回答的問題。

除了時脈本身,你還要描述你這個模組之外的世界——在訊號到達你的輸入端之前,週期裡已經有多少被上游邏輯用掉了(輸入延遲 input delay),以及在你的輸出之後,下游那塊晶片還需要多少時間(輸出延遲 output delay)——並且為那些不按常理出牌的路徑劃出例外:一條在邏輯上根本不會傳播、壓根不該參與時序檢查的偽路徑(false path),或者一條你有意允許它用兩個甚至更多時脈週期才完成的多週期路徑(multicycle path)。在實務上,這一切都寫在 SDC(Synopsys Design Constraints,新思設計約束)裡——一種以 Tcl 為基礎的文字格式,幾乎每家廠商的工具都能讀它,於是當你的設計在一個個工具之間流轉時,同樣的意圖也得以一路保留下來。

# 1 GHz clock on port clk; data_in already consumes 0.3 ns upstream before it arrives
create_clock -name clk -period 1.0 [get_ports clk]
set_input_delay 0.3 -clock clk [get_ports data_in]

一段最小的 SDC 片段——先定義一個 1 ns 的時脈,再宣告在輸入到達之前,週期裡有多少時間花在了模組之外。

人們常把「SDC」當作「時序約束」的同義詞,但兩者並不完全是一回事:SDC 是檔案格式(誕生於新思 Synopsys),而時序約束是底層的意圖——也就是時脈與預算——只是恰好被這個檔案編碼了下來。同樣的意圖也可以用某個工具自家的命令來表達;SDC 的好處只是讓它能在工具之間通用。

又稱
SDCSDC constraintsclock constrainttiming budget时序约束時序約束