Verilog中的specify block和timing check

在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值。

相關文章
相關標籤/搜索