[SV]Verilog系统任务及应用实例 ---- 時序检查任务及应用案例(Timing check tasks and example)

                      Verilog系统任务及应用案例(一)

                                   ---時序檢查任务及应用案例(Timing check tasks)

 

       引言:時序檢查(Timing Check)是數字驗證中的主要任務之一,Verilog系统Timing Check任务在指定块中使用,以执行常见的定时检查。本文將歸納常用的Timing Check任務。

 

一、Verilog Timing Check Task

 1.1、Timing check task list

No.                                                                      Task原型                     注釋
1$setup(data_event, reference_event, limit [ , notifier ] );checks setup time
2$hold(reference_event, data_event, limit [ , notifier ] ); 
3$setuphold(reference_event, data_event, setup_limit, hold_limit [ , notifier ]); 
4$period(reference_event, limit [ , notifier ] ); 
5$width(reference_event, limit [ , treshold [ , notifier ]] ); 
6$skew(reference_event, data_event, limit [ , notifier ] ); 
7$recovery(reference_event, data_event, limit [ , notifier ] ); 
8$nochange(reference_event, data_event, start_edge_offset, end_edge_offset [ , notifier ] );  
9$removal(reference_event, data_event, limit [ , notifier ] 
10$recrem(control_event, data_event, recovery_limit, removal_limit [ , notifier ]  
11$timeskew(reference_event, data_event, limit [ , notifier ] [ , event_based_flag ] [ , remain_active_flag ]; 
12$fullskew(reference_event, data_event, limit [ , notifier ] [ , event_based_flag ] [ , remain_active_flag ]; 

 

 1.2、參數解釋

參數       含義類型
reference_eventThe transition at a control signal that establishes the reference time for tracking timing violations on the data_eventModule input or inout that is scalar or vector net
data_eventThe signal change that initiates the timing check and is monitored for violations.Module input or inout that is scalar or vector net
limitA time limit used to detect timing violations on the data_eventConstant expression or specparam
thresholdThe largest pulse width that is ignored by the timing check $widthConstant expression or specparam
setup_limitA time limit used to detect timing violations on the data_event for $setupConstant expression or specparam
hold_limitA time limit used to detect timing violations on the data_event for $holdConstant expression or specparam
notifierAn optional argument that "notifies" the simulator when a timing violation occursRegister

 

 1.3、Task詳解

TaskDescriptionComment
$setupchecks 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,$setupreports a timing violation.

The formula to report a timing violation is as shown:

(time of reference event) - (time of data event) < limit

If a data event and reference event occur at the same time there is no violation. The $setupfirst checks timing data then records a new data value.

$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.
$skew(time of data event) - (time of reference event) > limit

$skewcan be used to check synchronicity of clocks inside a circuit. If different clocks are used in a design and are synchronized,$skewwill 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.

$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

 
$period

The $period reports a timing violation when the following formula comes true:

(time of data event) - (time of reference event) < limit

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.
$nochangechecks 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. 
   
   
   
   
   

 

二、 時序檢查Task使用案例

 2.1、$setup() 使用案例

module setup_exp (data1, data2, q);
  input data1, data2;
  output q;
  and(q, data1, data2);

  specify
    specparam tsetup = 7, delay = 10 ;
    (data1 => q) = 10 ;
    $setup(data1, posedgedata2, tsetup);
  endspecify

endmodule

 

 2.2、$skew() 使用案例

module skew_exp(clk1, clk2, q);
  input clk1, clk2;
  output q;

  specify
    specparam tskew = 7;
    $skew(posedge clk1, posedge clk2, tskew);
  endspecify

endmodule

 

 2.3、$hold() 使用案例

module hold_exp(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

 

 2.4、$recovery() 使用案例

module recovery_exp(in1, out1);
  input in1;
  output out1;

  assign out1 = in1? 1'b1 : 1'bz;

  specify
    specparam trecovery = 10;
    $recovery(posedgein1, out1, trecovery);
  endspecify

endmodule

 

 2.5、$setuphold()使用案例

module setuphold_exp(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

 

 2.6、$width()使用案例

module width_exp (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

 

 2.7、$period()使用案例

module period_exp(clk, q);
  input clk;
  output q;

  buf(q, clk);

  specify
    specparam tperiod = 100 ;
    $period(posedgeclk, tperiod);
  endspecify

endmodule

 

 2.8、nochange()使用案例

module nochange_exp(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

 

 

三、參考資料

 3.1、Link

 3.2、Link

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

元直数字电路验证

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值