Timing Check Tasks
  
    
    
     
   
   Formal Definition
  
   Timing Check Tasks are for verification of timing properties of 
   designs and for reporting timing violations. 
  
   Simplified Syntax
  
   $setup (data_event, 
   reference_event, limit[, notifier]) ; 
  
   $skew (reference_event, 
   data_event, limit[,notifier]) ; 
  
   $hold (reference_event, 
   data_event, limit[,notifier]) ; 
  
   $recovery (reference_event, 
   data_event, limit, [notifier]) ; 
  
   $setuphold (reference_event, 
   data_event, setup_limit, hold_limit, [notifier])
    ; 
  
   $width (reference_event, 
   limit, threshold [,notifier]) ; 
  
   $period (reference_event, limit[,notifier])
    ; 
  
   $nochange (reference_event, 
   data_event, start_edge_offset, end_edge_offset [,notifier])
    ; 
  
   Description
  
   Timing check tasks are invoked every time critical events occur 
   within given time limits. See the table below with descriptions of 
   all arguments: 
  
    
    
     | 
       
       Argument  | 
     
       
       Description  | 
     
       
       Type  | 
     
    
     | 
       
       Reference_event  | 
     
       
       The transition at a control signal that establishes the reference 
       time for tracking timing violations on the data_event  | 
     
       
       Module input or inout that is scalar or vector net  | 
     
    
     | 
       
       Data_event  | 
     
       
       The signal change that initiates the timing check and is monitored 
       for violations.  | 
     
       
       Module input or inout that is scalar or vector net  | 
     
    
     | 
       
       Limit  | 
     
       
       A time limit used to detect timing violations on the data_event  | 
     
       
       Constant expression or specparam  | 
     
    
     | 
       
       Threshold  | 
     
       
       The largest pulse width that is ignored by the timing check $width  | 
     
       
       Constant expression or specparam  | 
     
    
     | 
       
       Setup_limit  | 
     
       
       A time limit used to detect timing violations on the data_event for $setup.  | 
     
       
       Constant expression or specparam  | 
     
    
     | 
       
       Hold_limit  | 
     
       
       A time limit used to detect timing violations on the data_event for $hold.  | 
     
       
       Constant expression or specparam  | 
     
    
     | 
       
       Notifier  | 
     
       
       An optional argument that "notifies" the simulator when a 
       timing violation occurs  | 
     
       
       Register  | 
     
    
  
   $setup checks setup time. 
   When modeling synchronous circuits, flip-flops need time to force a 
   correct value. Data cannot change within the setup time because 
   flip-flops cannot detect the new value. If data changes within a 
   given time limit, $setup 
   reports a timing violation. If a data event and reference event occur 
   at the same time there is no violation. The $setup 
   first checks timing data then records a new data value. The formula 
   to report a timing violation is as shown below: 
  
   (time of reference event) - (time of data event) < limit 
  
   Notice that the limit argument has to be a positive number. 
  
   $skew checks the following: 
  
   (time of data event) - (time of reference event) > limit 
  
   $skew can be used to check 
   synchronicity of clocks inside a circuit. If different clocks are 
   used in a design and are synchronized, $skew 
   will report a timing violation when the active edge of one of them 
   occurs outside the time limit allowed for the other clock to occur. 
  
   When the data event and the reference event occur at the same time, $skew 
   will not report a timing violation. 
  
   $hold will report a timing 
   violation if the following formula is true: 
  
   (time of data event) - (time of reference event) < limit 
  
   $hold simply checks that 
   data is stable in the specified interval of time after the edge of 
   the clock. In flip-flops, data should remain stable for a given time 
   after the active edge of the clock to allow for propagation of data. 
  
   Also, a violation will be reported if the data event and the 
   reference event occur at the same time. 
  
   $recovery responds when the 
   following formula is true: 
  
   (time of data event) - (time of reference event) < limit 
  
   The 'reference_event' must be an edge-triggered event: posedge or 
   negedge. A timing violation occurs if the time interval between an 
   edge-triggered reference event and a data event exceeds the 'limit'. 
   If a reference event and data event occur at the same time, a timing 
   violation is reported. If a 'reference_event' argument is specified 
   without edge specification, an error is reported. 
  
   $setuphold checks setup and 
   hold timing violations. This task combines the functionality of $setup 
   and $hold in one task. The 
   following formula has to be applied: 
  
   setup_limit + hold_limit > 0 
  
   'reference_event' have to be one of the following: 
  
   - 
   
    $hold lower bound event 
    - 
   
    $setup upper bound event 
     
  
   'data_event' have to be one of the following: 
  
   - 
   
    $hold upper bound event 
    - 
   
    $setup lower bound event 
     
  
   In $width both limit and 
   threshold have to be positive numbers. The 'reference_event' must be 
   the edge specification, otherwise an error will be reported. The 
   'data_event' is not specified directly, but by default means 
   'reference_event' with opposite edge. A timing violation occurs with 
   the following formula: 
  
   threshold < (time of data event) - (time of reference event) < limit 
  
   $width reports when width of 
   the active-edge is too small. In FF case it is very important to 
   ensure that the width of an active-edge is sufficient and FF will 
   work properly. 
  
   The $period checks that a 
   period of signal is sufficiently long. The reference_event has to be 
   an edge specification. The data_event is not specified directly and 
   by default, is the same as a reference_event. The $period 
   reports a timing violation when the following formula comes true: 
  
   (time of data event) - (time of reference event) < limit 
  
   The $nochange checks if the 
   data signal is stable in an interval of start_edge_offset and 
   end_edge_offset. If the signal has changed, a timing violation is 
   reported. The reference_event argument can be posedge or negedge but 
   the edge control specifiers are disallowed. 
  
   Examples
  Example 1 
  
   module setup (data1, data2, q); 
   input data1, data2; 
   output q; 
   and (q, data1, data2); 
   specify 
   specparam tsetup = 7, delay 
   = 10 ; 
   (data1 => q) = 10 ; 
   $setup(data1, posedge 
   data2, tsetup); 
   endspecify 
   endmodule 
  Example 2 
  
   module two_clocks (clk1, 
   clk2, q); 
   input clk1, clk2; 
   output q; 
   specify 
     specparam tskew = 7; 
     $skew(posedge 
   clk1, posedge clk2, tskew); 
   endspecify 
   endmodule 
  Example 3 
  
   module hold (data1, data2, q); 
   input data1, data2; 
   output q; 
   and (q, data1, data2); 
   specify 
   specparam thold = 7, delay = 
   10 ; 
   (data1 => q) = 10 ; 
   $hold(posedge data2, data1, thold); 
   endspecify 
   endmodule 
  Example 4 
  
   module recovery (in1, out1); 
   input in1 ; 
   output out1 ; 
   assign out1 = in1 ? 1'b1 :
    1'bz ; 
   specify 
     specparam trecovery = 10; 
     $recovery(posedge 
   in1, out1, trecovery); 
   endspecify 
   endmodule 
  Example 5 
  
   module setuphold (data1, 
   data2, q); 
   input data1, data2; 
   output q; 
   and (q, data1, data2); 
   specify 
   specparam tsetup = 7, 
   thold = 7, 
   delay = 10 ; 
   (data1 => q) = 10 ; 
   $setuphold(posedge data2, 
   data1, tsetup, thold); 
   endspecify 
   endmodule 
  Example 6 
  
   module width (data1, data2, q); 
   input data1, data2; 
   output q; 
   and (q, data1, data2); 
   specify 
   specparam twidth = 10, 
   delay = 10 ; 
   (data2 => q) = 10 ; 
   $width(posedge data2, twidth); 
   endspecify 
   endmodule 
  Example 7 
  
   module dff (clk, q); 
   input clk; 
   output q; 
   buf (q, clk); 
   specify 
     specparam tperiod = 
   100 ; 
     $period(posedge 
   clk, tperiod); 
   endspecify 
   endmodule 
  Example 8 
  
   module nochange (data1, 
   data2, q); 
   input data1, data2; 
   output q; 
   and (q, data1, data2); 
   specify 
   specparam tstart = -5, 
   tend = 5 ; 
   $nochange(posedge data2, 
   data1, tstart, tend); 
   endspecify 
   endmodule 
  
   Important Notes
  
  
    
 
    |