在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 53993|回复: 130

标准单元的lib文件问题请教

[复制链接]
发表于 2007-5-10 20:48:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
不知道哪位大侠能告诉一下一个标准单元怎样产生它的lib时序文件?查表形式的,多谢!
发表于 2008-10-24 01:26:53 | 显示全部楼层
从原理上说就是仿真!
有专门的timing建模工具, SYNOPSYS的nanochar, MAGMA: siliconsmart等。
发表于 2008-10-24 10:01:57 | 显示全部楼层
跑hspice仿真得到的时间坐标点。
发表于 2008-11-20 21:55:34 | 显示全部楼层
给出工具需要的环境文件,工具会调用hspice作时间点的仿真
发表于 2009-11-5 00:24:55 | 显示全部楼层
不会,帮你顶
发表于 2009-11-5 09:31:44 | 显示全部楼层
1# daisyniu

小弟最近在搞库的设计,就小卖弄一番。
支持数字设计从前到后的库文件有四个,(由于各个软件可能有所差距,但基本都是这个流程)
1 支持数字代码仿真的(RTL ,GETALEVEL) 仿真库 只流出逻辑功能。是VERILOG格式的文件。
2  支持综合河绕线的特征库,也就是你说的。.LIB文件还有它的另一种格式db。 包库单元的timing power
举个最简单的例子 inverter  (是小弟自己仿的,没有版权问题哈哈,格式打的有点乱,但没什么答错)
cell (INVX1) {
        cell_footprint : "inv";
        area : 36.000000;
        cell_leakage_power : 6.883686e+01;
        driver_waveform_rise : "preDrv";
        driver_waveform_fall : "preDrv";
        leakage_power () {
            when : "A";
            value : "60.524918";
        }
        leakage_power () {
            when : "!A";
            value : "68.836860";
        }
        pin (A) {
            direction : "input";
            fall_capacitance : 0.007333;
            capacitance : 0.007786;
            rise_capacitance : 0.008239;
            related_power_pin : "VDD";
            related_ground_pin : "VSS";
        }
        pin (Y) {
            direction : "output";
            function : "(!A)";
            max_capacitance : 0.510000;
            related_power_pin : "VDD";
            related_ground_pin : "VSS";
            internal_power () {
                related_pin : "A";
                rise_power ("power_outputs_1") {
                    index_1("0.05, 0.1, 0.3, 0.8, 1.3, 1.9, 2.6");
                    index_2("0.0006, 0.03, 0.06, 0.15, 0.27, 0.39, 0.51");
                    values("0.254319, 0.695850, 1.152080, 2.512420, 4.294844, 6.094335, 7.896585", \
                        "0.289450, 0.710463, 1.153869, 2.503155, 4.302557, 6.099658, 7.891133", \
                        "0.437754, 0.819135, 1.236313, 2.546785, 4.327767, 6.133937, 7.898646", \
                        "0.837157, 1.180914, 1.559811, 2.792441, 4.516422, 6.269635, 8.044737", \
                        "1.248170, 1.557446, 1.930525, 3.118238, 4.758248, 6.517784, 8.234349", \
                        "1.743280, 2.024085, 2.373404, 3.511365, 5.152186, 6.805071, 8.539038", \
                        "2.327271, 2.591932, 2.913556, 4.026608, 5.591567, 7.233989, 8.929239");
                }
                fall_power ("power_outputs_1") {
                    index_1("0.05, 0.1, 0.3, 0.8, 1.3, 1.9, 2.6");
                    index_2("0.0006, 0.03, 0.06, 0.15, 0.27, 0.39, 0.51");
                    values("-0.021296, -0.465502, -0.918542, -2.279565, -4.094547, -5.909395, -7.724514", \
                        "-0.000474, -0.455724, -0.912439, -2.276201, -4.092328, -5.908217, -7.723061", \
                        "0.124219, -0.378840, -0.852475, -2.239661, -4.068120, -5.889716, -7.708357", \
                        "0.478242, -0.095800, -0.613386, -2.067723, -3.938360, -5.787659, -7.622225", \
                        "0.848504, 0.231653, -0.322639, -1.835767, -3.756996, -5.632379, -7.485418", \
                        "1.289978, 0.642853, 0.059043, -1.524256, -3.493835, -5.397324, -7.285909", \
                        "1.811660, 1.136455, 0.528835, -1.121855, -3.146458, -5.092143, -7.002062");
                }
            }
            timing () {
                related_pin : "A";
                timing_type : "combinational";
                timing_sense : "negative_unate";
                cell_rise ("del_1_7_7") {
                    index_1("0.05, 0.1, 0.3, 0.8, 1.3, 1.9, 2.6");
                    index_2("0.0006, 0.03, 0.06, 0.15, 0.27, 0.39, 0.51");
                    values("0.041655, 0.149068, 0.259106, 0.588057, 1.027194, 1.468615, 1.898271", \
                        "0.055050, 0.162089, 0.270380, 0.598754, 1.039356, 1.474996, 1.906438", \
                        "0.102817, 0.226885, 0.330080, 0.648825, 1.083088, 1.514482, 1.954191", \
                        "0.202343, 0.374218, 0.492854, 0.807739, 1.225901, 1.653876, 2.083392", \
                        "0.290028, 0.502749, 0.640916, 0.981749, 1.384694, 1.806762, 2.228624", \
                        "0.391202, 0.639209, 0.798825, 1.167432, 1.593610, 2.002591, 2.420398", \
                        "0.506121, 0.789499, 0.970355, 1.381008, 1.827925, 2.238070, 2.647038");
                }
                rise_transition ("del_1_7_7") {
                    index_1("0.05, 0.1, 0.3, 0.8, 1.3, 1.9, 2.6");
                    index_2("0.0006, 0.03, 0.06, 0.15, 0.27, 0.39, 0.51");
                    values("0.047021, 0.239973, 0.438896, 1.039798, 1.844292, 2.643735, 3.441225", \
                        "0.055844, 0.240605, 0.439361, 1.041302, 1.857212, 2.645319, 3.441486", \
                        "0.085223, 0.255069, 0.439881, 1.041496, 1.844818, 2.646372, 3.431012", \
                        "0.145142, 0.343906, 0.507713, 1.043236, 1.834608, 2.644172, 3.438481", \
                        "0.192471, 0.432941, 0.603081, 1.099123, 1.838810, 2.632967, 3.437682", \
                        "0.241912, 0.522857, 0.708094, 1.205986, 1.892293, 2.638102, 3.431937", \
                        "0.297992, 0.620705, 0.829197, 1.350876, 1.998727, 2.701299, 3.440202");
                }
                cell_fall ("del_1_7_7") {
                    index_1("0.05, 0.1, 0.3, 0.8, 1.3, 1.9, 2.6");
                    index_2("0.0006, 0.03, 0.06, 0.15, 0.27, 0.39, 0.51");
                    values("0.025535, 0.088298, 0.149744, 0.333347, 0.578671, 0.827603, 1.070358", \
                        "0.026285, 0.096613, 0.157268, 0.340454, 0.586848, 0.835001, 1.077033", \
                        "0.015404, 0.118380, 0.191115, 0.373674, 0.618450, 0.860113, 1.104428", \
                        "-0.031309, 0.117655, 0.221184, 0.456107, 0.706208, 0.946457, 1.187433", \
                        "-0.084908, 0.092863, 0.217301, 0.496610, 0.790525, 1.040290, 1.278535", \
                        "-0.153492, 0.051110, 0.193891, 0.515770, 0.849002, 1.132146, 1.389593", \
                        "-0.235375, -0.006119, 0.155007, 0.517431, 0.887198, 1.207372, 1.487569");
                }
                fall_transition ("del_1_7_7") {
                    index_1("0.05, 0.1, 0.3, 0.8, 1.3, 1.9, 2.6");
                    index_2("0.0006, 0.03, 0.06, 0.15, 0.27, 0.39, 0.51");
                    values("0.026391, 0.118601, 0.223242, 0.518587, 0.920661, 1.332443, 1.755931", \
                        "0.035080, 0.120530, 0.218497, 0.518991, 0.935947, 1.345306, 1.756794", \
                        "0.065459, 0.173604, 0.251847, 0.519612, 0.938812, 1.321431, 1.722147", \
                        "0.130288, 0.291369, 0.387792, 0.632052, 0.951191, 1.322414, 1.721280", \
                        "0.181670, 0.382960, 0.509092, 0.784371, 1.079924, 1.391854, 1.742341", \
                        "0.238376, 0.485579, 0.626648, 0.930713, 1.263549, 1.566592, 1.866306", \
                        "0.304986, 0.595136, 0.755951, 1.109439, 1.464282, 1.790993, 2.093136");
                }
            }
        }
        pg_pin (VDD) {
            voltage_name : "VDD";
            pg_type : "primary_power";
        }
        pg_pin (VSS) {
            voltage_name : "VSS";
            pg_type : "primary_ground";
        }
    }
让 我讲这个挺麻烦,要费很多唇舌,我把仿真是设置的模版给大家看下就明白个大概
* Generated by Liberty NCX vB-2008.12
cell_footprint : inv ;
area : 36.0000000 ;
cell_leakage_power : 17.7624700 ;
pin A {
  direction : input ;
}
pin Y {
  direction : output ;
  function : (!A) ;
  max_capacitance : 0.5100000 ;
  ncx_internal_power_rise_input_transition_time_index : 0 ;
  ncx_internal_power_fall_input_transition_time_index : 0 ;
  ncx_internal_power_rise_total_output_net_capacitance_index : 0 ;
  ncx_internal_power_fall_total_output_net_capacitance_index : 0 ;
  ncx_rise_input_net_transition_index : 0 ;
  ncx_fall_input_net_transition_index : 0 ;
  ncx_rise_total_output_net_capacitance_index : 0 ;
  ncx_fall_total_output_net_capacitance_index : 0 ;
}
pg_pin VDD {
  voltage_name : VDD ;
  pg_type : primary_power ;
}
pg_pin VSS {
  voltage_name : VSS ;
  pg_type : primary_ground ;
}
发表于 2009-11-5 09:50:47 | 显示全部楼层
本帖最后由 tianxiong_14 于 2009-11-5 09:55 编辑

db格式是用dc读入.lib文件然后输出db格式就成了。
这个过程叫特征化。我附件中是这种文件格式的一个userguide有参考价值,
3是用于后端绕线的物理库,encounter用的是lef格式 astro用的不同。
可以用abgen抽取lef, 它是版图的抽象库,astro使用milkyway抽取。
4最后是就是版图库了。
还有一个dc用的symble库,因为可以用系统默认,也可以不做。是用shematic导出edif格式,然后转成sdb格式。
不详细说了。

另外说下,特征化的.lib文件虽然都是lookup table,但有不同的模型。
除了90nm以上的都使用的是nldm(非线性延迟模型) nlpm(非线性功耗模型)。后来开始闹分裂,有了CCS ECMS等,但都一样是电流模型。不说那么多了。
这种东西光概念和工具就够讲的,我没水平出书,大家有问题可以问。

基本流程:
1 原理图 版图
2 寄生参数提取
3 特征化
4 物理库提取
5 仿真库制作
6 symble库编译
7 测试验证,搞定剩下维护。

lcrm1.pdf.rar

2.37 MB, 下载次数: 1599 , 下载积分: 资产 -2 信元, 下载支出 2 信元

发表于 2009-11-5 21:42:17 | 显示全部楼层
7# tianxiong_14
1)请讲讲特征化的过程,是否有相关的资料?
2)ecsm和ccs的区别是什么?
谢谢
发表于 2009-11-6 10:08:35 | 显示全部楼层
8# yale9301
ecsm和ccs的区别                                                                
cadence Synopsys 的区别,
官方有详细的定义说明两个有什么不同,其实你会发现连出来的数据都机会一样,还硬说原理不同,很牵强,,,不过是为了让自己工具有个一席之地,,,就像我要要用cadence的pearl抽个sdf非要用tlf格式,,,其实和lib格式只是格式不同,,,,
不用管它,,,,,你到是可以了解下nldm nlpm和ccs的不同,,,但有个不同是大家都能明白的就是ccs可以做noise模型。。。你可以在网上搜下,,,我目前在公司里,上传不便,,有空再发个资料,,,不过这方面中文资料几乎为0 。

  ncx_internal_power_rise_input_transition_time_index : 0 ;
  ncx_internal_power_fall_input_transition_time_index : 0 ;
  ncx_internal_power_rise_total_output_net_capacitance_index : 0 ;
  ncx_internal_power_fall_total_output_net_capacitance_index : 0 ;
  ncx_rise_input_net_transition_index : 0 ;
  ncx_fall_input_net_transition_index : 0 ;
  ncx_rise_total_output_net_capacitance_index : 0 ;
  ncx_fall_total_output_net_capacitance_index : 0 ;
上面是我昨天发的一个inverter 给的ncx设置。软件会根据我的设置,找到我设置的index其实就是一组slew 一组load 。
power的我不说了,后四个是仿真时序的四个项,,,
表明我要仿真的inverter的四个特性,,
rise transition
fall  transition
cell rise
cell fall
这都是基本的概念,也不用多说了,,软件会根据这些,再调用我设置好的slew ,load,,省成仿真的脚本文件,发给hspice, 然后从仿真结果里抽出来,打成表格。
你也可以自己用hspice 写个sp仿真,效果一样,软件只是把重复劳动省掉乐。 但原理是不表的,,,,,
要是数字基础不好,又不会hspice的,改天我再发个资料吧。
这个是最简单的inverter  像ff的,还要仿setup holdon 。不明白的哥们说话,哪里不懂补哪里,这东西简单但是涉及的东西很多。
发表于 2009-11-8 13:46:20 | 显示全部楼层
学习了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-25 06:10 , Processed in 0.023924 second(s), 9 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表