學習目标:
- 定義時序特例
- 時序特例的合法起點和終點
- 報告忽略的時序特例的指令
- 給定多周期路徑和規範,應用多周期路徑限制
時序特例
什麼是時序特例?
跟default預設情況下檢查不同的檢查設定都可以歸為timing exception。
timing constraint幾大塊:
- 時鐘定義和時鐘之間的關系。(design部分提供)
- timing exception(不是所有的path都在一個cycle裡面進行檢查。但是時序例外必須是真實情況的反應,自己不要随便加)
- IO constraint端口信号限制。
- 靜态信号、長值信号(長時間是某個值的信号)(有的也歸在timing exception)
時序特例是改變預設單時鐘檢查的constraint。
//定義時鐘,設定輸入輸出端口延時,工具預設是單周期檢查
Create_clock
Set_input_delay
Set_output_delay
timing exception相關指令:
set_false_path
/*
false_path,對某個點定義後,不對它進行時序檢查
不去進行時序檢查 情況:
(1)design加入某個設計,但是晶片不需要這個功能。
(2)功能也用,但是優先級不高,晶片真正功能上用不到,可能是用來測試、監督信号。
(3)信号在整個晶片生命周期中,近乎是靜态值。比如,在上電時動一下,或者,實作某一個功能應用時動一下(可以設定但是不推薦使用false,安全起見,設定為multicycle)
*/
set_multicycle_path
/*
multicycle path多周期path,資料路徑延時比較大,一個周期跑不到,或者功能實作不需要一個周期跑到
信号太長,一個周期傳不過去。
情況:
從設計上來說:
(1)一些運算器data path特别長,功能不一定要一定在一個周期上做完,可以幾個周期。
(2)信号切換不頻繁,類似靜态信号,長時間處于某個電平。
從後端便利性來說:
(3)從寫constraint便利性考慮,減少constraint的複雜
*/
set_max_delay
/*
定義兩個點之間的絕對延時。
(1)跨時鐘域。異步邏輯,不會進行時序檢查。一些設計中兩個domin雖然異步,但是信号之間的傳輸延遲不能超過幾個cycle,有時序要求。
(2)存在一個balance,好幾個信号,在一定範圍内同時到達。
*/
set_min_delay
/*
定義兩點之間的絕對的最小延時
*/
//set_max_delay和set_min_delay一般成對出現。
report_exceptions //看看exception constraint
reset_path //重置timing path
//這些指令的文法:
//從那個點開始到那個點結束的限制
option有:
-from //起始點
-to //到哪裡
-through //經過哪個點
-rise_from
-fall_from
時序例外的合法起點和終點
時序例外要從有效的startpoint開始到有效的endpoint結束。否則constraint會被ignore 。
起點startpoint:
- Input Ports
- Clock Pins of Registers
終點endpoint:
- Output Ports
- register除了clock pin的其他端口(reset pin、set pin、En pin<使能端口>、data pin)
減少時序例外的數量
以下各項分别代表多少個例外?
set false path -from Q2 reg[*]/CP
set false path -from g2_reg[*]/CP -to 93_reg[*]/D //*代替任意字元
set false path -from g2 reg[1]/CP-to reg[1]/D
// .
// .
// .
set false path-from Q2 reg[32]/CP -to reg[32]/D
set false path -from clk2 -to clk3 //clock2 domin到clock3 domin這條路徑設定為false
/*
這四個指令是等效的。
判斷那個指令更好:
越精細化定位到startpoint和endpoint越好,太寬泛不好,有可能把其他不該false的路徑false了。
*/
使用 -through 選項
–through 選項需要更多 CPU 用于大型設計
除非必要,否則不要使用 –through
(工具計算起點終點花費時間多,而且沒有人能保證through某個點的時候,把endpoint和startpoint寫全部考慮清楚,容易誤傷真實要檢查的點)
當有一個引腳時使用 set_disable_timing 而不是 –through
Set_false_path –through U1/A
Set_disable_timing U1/A
//disable timing arc,時序檢查資訊傳不過這個邏輯,經過這個點的邏輯都被打斷了
時序例外檢查
report_exceptions –ignored //工具ignore的constraint報出來,看看哪裡出問題做檢查
check_timing
/*
option很多,有些時序沒有clock也會報出來,有clock,但是沒有timing path叫做unconstraint_endpoint,是因為加了timing exception路徑被打斷了,沒法構成有效的時序路徑
*/
時序例外的優先級
- 同一指令優先級,越具體設定,優先級越高。
- 不同指令優先級,false大于multicycle。
僅應用所需的時序例外
Set_false_path –to FF2/D –setup //兩條path都受影響
Set_false_path –from FF0/CP –to FF2/D -hold //1-2保留了,0-2影響
多周期路徑
加法器
時鐘周期10ns,需要60ns計算時間。單cycle跑不了,需要六個cycle。
時序限制,用multicycle。
加了multicycle,指令:
create_clock –period 10 [get_ports CLK]
set_multicycle_path –setup 6 –to [get_pins “C_reg[*]/D”]
設定六倍的cycle,推六個cycle在周期60處做時序檢查setup檢查
hold怎麼去進行檢查?
hold也會跟着走,少一個cycle
create_clock –period 10 [get_ports CLK]
set_multicycle_path –setup 6 –to [get_pins “C_reg[*]/D”]
Set_multicycle_path –hold 5 –to [get_pins “C_reg[*]/D”
//multicycle設定成對出現
對應不同的hold check情況:
(1)資料很短,信号變化很快,但是傳輸路徑長。
(2)資料很慢,經過長時間傳到被采集的地方 。