时序分析基本概念介绍——时序库Lib,除了这些你还想知道什么?

描述

今天主要介绍的时序概念是时序库lib,全称liberty library format(以• lib结尾),

用于描述物理单元的时序和功耗信息的重要库文件。lib库是最基本的时序库,通常文件很大,分为两个部分,

第一部分定义了物理单元库的基本属性,它包括:

1)单元库名称,文件版本,产生日期及单元的PVT环境等。

2)定义电压,电流,电容,时间等基本单位。

3 ) 定义电路传输时间和信号转换时间的电压百分比。

我们来看一个基本的lib时序库:

library(xxx18) {                                     #库名称

  delay_model : table_lookup;               #采用查表延时模型计算延时

  revision : 1.0;                                     #库的版本

  date : "Sat Mar  2 15:37:50 2012";     #库的创建时间

  time_unit : "1ns";                                #定义时间基本单位  

  voltage_unit : "1V";                             #定义电压基本单位

  current_unit : "1uA";                           #定义电流基本单位

  pulling_resistance_unit : "1kohm";     #定义电阻基本单位

  leakage_power_unit : "1pW";             #定义功耗基本单位

  capacitive_load_unit (1.0,pf);             #定义负载基本单位

  nom_process     : 1;                         #定义时序库工艺

  nom_temperature : -40;                   #定义时序库温度

  nom_voltage     : 0.72;                     #定义时序库电压

  operating_conditions(fast) {           #定义互连线模型

    process : 1;

    temperature : -40;

    voltage : 0.72;

    tree_type   : balanced_tree

  }

  /* threshold definitions */

  slew_lower_threshold_pct_fall : 10.0;       #定义信号转换模型

  slew_upper_threshold_pct_fall : 90.0;

  slew_lower_threshold_pct_rise : 10.0;

  slew_upper_threshold_pct_rise : 90.0;

  input_threshold_pct_fall      : 50.0;             #定义延迟模型

  input_threshold_pct_rise      : 50.0;

  output_threshold_pct_fall     : 50.0;             

  output_threshold_pct_rise     : 50.0;

第二部分是每个单元的具体信息,包括单元的延迟时间,泄漏功耗,内部功耗等。它们以lookup table的形式来表示,这里一个非常重要的概念就是lookup table,它是一种三维数据查找表,整个lib文件都是通过该种查找方式来得到所需要的信息。例如延迟时间作为输出信号负载(output load)和输入信号转换时间(input transition)的函数列表。

我们来看一个look up table的查找方式:

lu_table_template(delay_template_2x2){

variable_1:total_output_net_capacitance;

variable_2:input_net_transition;

index 1("1000.0,1001.0");

index _2( " 1000.0, 1001.0" ) ;

}

rise_transition (delay_template_2x2) {

index_l( "0.01,0.4532" ) ;

index_2( "0.01,1.2" );

values ("0 .131455 , 0.131036 " , \

"4.19211,4.13413") ;

}

上诉语句定义了一个名字叫为delay_template_2x2的lookup table,可以理解为一个模板,有两个变量variable_1和variable_2组成。variable_1代表total_output_net_capacitance,variable_2代表input_net_transition。每个变量是两个断点组成。lookup table的名字是任意的,而变量可以是一个,两个或三个,每个断点的数量一般没有限制。

lookup table的第二部分则描述了具体哪个功能调用了上述模板,rise_transition描述的是单元输出信号的上升时间。它调用的就是由lu_table_template 定义的名为delay_template_2x2的模板。rise_transiton 中 index_1和 index_2是与上升时间相关的两个变量,如果想知道它们分别代表哪个一个变量就需要到delay_template_2x2的模板中查找,这里我们知道index_1代表输出pin的连线负载电容,index_2代表输入信号transition。

values与index可以表达为value=f(index_1,index_2)。当输出端线负载为0. 01,输入斜率为0. 01时,输出上升时间为0.131455。当输出线负载为0.01,输人斜率为1 .2时,输出上升时间为0.13036。同理,当输出端线负载为0.4532,输入斜率分别为0.01和1.2 时,对应另外两个上升时间。如下图所示:

时序库

接着在cell描述部分,我们会看到以下内容:

cell (BUFX1) {

  cell_footprint : buf;           #定义引脚名称,进行优化时具有相同引脚名称的单元才可以交换

  area : 13.305600;           #定义单元面积大小

  pin(A) {              

    direction : input;           #定义端口A为输入端口

    capacitance : 0.002357;    #定义端口A的电容

  }

  pin(Y) {

    direction : output;       #定义端口Y为输出端口

    capacitance : 0.0;       #定义端口Y的电容

    function : "A";               #定义端口Y是同A的操作

    internal_power() {       #定义单元内部功耗

      related_pin : "A";       #定义相关输入信号

      rise_power(energy_template_5x5) {     #定义端口Y上升所消耗的功耗

        index_1 ("0.025, 0.08, 0.3, 0.7, 1.2");

        index_2 ("0.00035, 0.021, 0.0385, 0.084, 0.147");

        values ( \

          "0.013041, 0.010646, 0.010132, 0.008511, 0.006121", \

          "0.015728, 0.012869, 0.012227, 0.010567, 0.008178", \

          "0.023086, 0.020760, 0.019879, 0.017596, 0.014946", \

文件太长,只截取部分,rise_power的 index_1和index_2的内容可以在文件前面的lookup table模板中查找得到,该cell的剩余其他时序和功耗参数也是类似描述,不一一解释了。


打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分