在ASIC設計中,有兩種HDL construct來描述delay信息:函數
1)Distributed delays:經過specify event通過gates和nets的time,來描述delay;設計
對於net和gate都有三種delay信息: 1)rise delay 2)fall delay 3)transition to high-impedance value3d
只有一種delay時,全部change都使用這種delay,兩個delay值時,才分爲rise/fallorm
每一種delay信息又分爲:min:typical:max三種。blog
gate和net的model例子:ci
可是trireg類型的變量通常建模cap的信號:第三個delay信息表示他storage的信號值再也不保證的時間;rem
2)Module path delays:經過描述event從source(input/inout port)到destination(output/inout port)的time,來描述delay;input
使用specify......endspecify來進行描述。it
在specify block中通常有三種信息:io
1)various paths across the module;
2)Assign delays to those paths;
3)Perform timing check;
path的declaration包括三類:
1)simple path declaration;
2)edge sensitive path declaration; 加 posedge/negedge
表示FF的有效沿是posedge,從in到out是一個positive的polarity,rise delay是10, fall delay是8。
3)state dependent path declaration; 加if/ifnone
4)Edge-sensitive state-dependent paths
「 *>」表示 full conection, 「 =>」表示parallel conection
對於會改變polarity的 path,能夠經過+/-來進行描述,不然按unknown polarity分析(rise edge可能引發fall edge/rise/edge/no transition)。
"+"表示positive polarity, rise 可能引發rise edge或no transition
"-"表示positive polarity, rise 可能引發fall edge或no transition
Specifying transiiton delay on module path
按rise---fall---to-z的三種來區分,每一種delay信息能夠再細分min/typ/max
前三者用","區分,後三者用":"區分
在delay path中,有一些是到同一個output的,這是選擇最近有效的一路來計算,若是仍是有多條
同時有效,選擇delay較小的那一條path。
當Y從0變爲1時,若是A transition more recently,那麼選擇6的delay,不然選擇5的delay;
若是A和B都有效,那麼選擇5的delay;
對於module path delay和distributed delay都存在的狀況,選擇二者之間大的那一個值。
對於path的distination必須是的單一driver的,因此一些wire類型的信號,必須變爲gate輸出的signal
TIming Check,在給定的timing limit內,保證critical event occur;
能夠分爲兩大類:
1)檢查stability time window----------$setup, $hold, $setuphold, $recovery, $removal, $recrem
2)檢查two event之間的time----------$skew, $width, $period, $nochange
注意這些timing check並非task,specify內也不容許有task;
全部的這些timing check都有兩個基準時間點:reference event和data event;
兩個時間評估點:timestamp event和timecheck event;
不報violation,必須保證data event在正確的time window下發生
$setup check: $setup(data_event, reference_event, time_check_limit,notifier)
保證timestamp的時間在time window以內,不然會報violation
當limit設置爲0時,表示這個檢查永遠不會報violation
$hold check: $hold(reference_event, data_event, time_check_limit,notifier)
當limit設置爲0時,表示這個檢查永遠不會報violation
$setuphold check: $setuphold(reference_event, data_event, setup_time_check_limit,hold_time_check_limit,notifier)
$skew(reference_event, data_event, time_check_limit, notifier)
$width(reference_event, time_check_limit, threshold)
reference必須是一個trigger的event,另外一個edge做爲data event,二者時間間隔大於threshold(防止glitch),小於limit。
$setuphold的完整定義:支持negtive timing
notifier做爲一個reg類型變量,在timing check invoke的地方聲明,
當檢測到timing violation時,notifier經過FF的行爲,打印violation信息,並propagate X to the output。
在timing check過程當中,data和reference clock的delay copysignal會被建立,
用戶能夠顯式的定義,delayed_reference或者delayed_data。
dclk在setup爲負值時,表示clk延時7個cycle,在dclk以前D再也不變化,就不會出現violation。
dD在hold爲正值時,表示D延時13個cycle,若是dD發生在CLK以後,則不會出現violation。
在多個$setuphold的函數中,選擇大的一個賦值。
在作後仿的過程當中,默認選擇sdf中的delay值,以後選擇specify中的delay值。