曾经看过一个帖子,有人问K库的痛点在哪里?部分回帖提到了lib的验证,怎么验证我们做出来的库。lib验证是单元库建库不可缺少的一环,关系到整个单元库的质量。
SiliconSmart
提供了一套完善的单元库验证流程,主要包括三块内容:compare_library
比较两套lib
文件的差异;qualify_library
验证lib
文件的质量;hdl(
verilog)
验证。
这篇推文着重介绍compare_library。
既然compare_library是单元库质量验证中的一个必要环节,那么什么时候需要用到?Comparelibrary在re-characterization中应用最为广泛,用来验证我们re-char出来的lib跟referencelib相比,结构是否一致,有无attribute丢失,table数值是否有较大的差异等等。
Compare library的基本命令很简单:
compare_library -reference reference.lib -test test.lib
以上命令会比较test.lib与reference.lib的结构是否匹配,包括group,attributes,whens,但是这个命令不会比较table的数值。比较的结果会存放在当前工作目录下的compare_library文件夹下。可以使用-output_dir这个option来指定不同的存放路径。
那么如果需要比较table的数值呢?其实很简单,加一个-value的option就可以:
compare_library -reference reference.lib -test test.lib -value
运行结束后会得到一个summary,你可以从summary.log里查看相应的结果。
如果你想看更加细节的数据,比如所有points
的比较结果,这些数据放在.csv
文件里,你可以进去查看。每一种meas
类型都有对应的.csv
文件,如delay
,slew
,energy
,setup
,hold
等等。默认只列出比较结果为f
AIl
的点,如果需要所有点的比较结果,可以使用-all_points
这个option
。建议加上-tsv
这个option
,能使数据排列更整齐易读。
下面介绍几个常见并且非常好用的compare_library的option。
-compare_values
指定哪些group的数值需要做比较,比如我们要比较ccst,lvf这两个group的数值在reference.lib和test.lib之间的差异,命令就可以这么下:
compare_library -reference reference.lib -test test.lib-value -compare_value {ccst lvf}
-compare_template_name
默认是不比较templates的,可以通过打开-compare_template_name来比较templates:
compare_library -reference reference.lib -test test.lib-value -compare_values (ccst) -compare_template_name
-ignore
通过使用这个option来人为控制某些不需要比较的group或者attribute,如不需要比较“timing” group和“driver”相关的attribute:
compare_library -reference reference.lib -test test.lib-value -cells {INVX2} -ignore{timing *driver*}
-interpolation
当reference.lib和test.lib的index里的数值不一样的时候,我们还能不能做compare了?使用-interpolation就可以。-interpolation有三个数值,分别是0,1,2。0代表不做内插计算,只有在table的size完全一致,并且数值的偏差小于某一个确定的tolerance的情况下才会做比较;1代表只做线性内插计算,不做外插计算;2代表即会做内插计算又会做外插计算。
compare_library -reference reference.lib -test test.lib-value -interpolation 1
SiS里有一个参数compare_library_interpolation的作用跟这个option类似,一旦用了-interpolation这个option,那么compare_library_interpolation会自动失效。
这里还要注意一点,-interpolation只针对1D,2D的table,3D的table不支持,也就是说如果要做3D的table的数值比较,两个lib的index必须要相同。
-user_defined
SiS默认是不比较user_defined相关的attribute的,必须打开-user_definedoption才能比较。这里需要提醒大家的是,ECSM相关的group目前是被当作user_defined的,因此如果要比较ECSM相关的内容,不要忘了打开-user_defined这个option。
compare_library -reference reference.lib -test test.lib -user_defined
-ee_cells
如果两个lib里有几个cell类似,但是名字不同,能比较吗?可以,用-ee_cells列出需要配对比较的cell的名字:
compare_library -reference reference.lib -test test.lib -ee_cells {AND2X1 ANDP2X1}
-tolerance_guide
这个option也比较好用,它能告诉你设置不同的tolerance,比较出来的结果的不同通过率(pass-rates),让用户对趋势有个大致的了解。
compare_library -reference reference.lib -test test.lib -value-tolerance_guide
支持GUI
Compare_library是支持GUI的,关于GUI的用法,后面打算专门推文详细介绍。
如何设置tolerance?
首先,可以使用-tolerance开关来查看当前默认的tolerance:
compare_library -tolerance
如果需要调整当前的tolerance,可以使用set_config_opt命令,如:
set_config_opt delay_absolute_tolerance 0.0005 (单位是lib里对应的单位)
set_config_opt delay_relative_tolerance 0.02 (2%)
如果两个lib的误差超过了设定的tolerance,那么就会报出来。
几点建议
- 对于第一次使用compare_library,建议分成两步来做,先比较结构,再比较数值。在比较数值之前,将结构等基础问题解决好,然后再做数值上的比较。
- 对于数值的比较,建议设置合理的tolerance,不要太紧也不能太松。比如constraints,如果设置1ps的tolerance,显然就太紧了,因为constraint很难有这么高的匹配度。但是对于delay/slew,设置1ns,显然又太松了,因为delay/slew的量测很简单直接,一般设置1~5ps比较合理。
- 要注意tolerance的单位,tolerance的单位是跟着lib走的,在设置tolerance之前必须弄清楚你的lib的单位,这点很重要。
- 要注意,CCS,ECSM,LVF默认是不比较的,怎么让工具比较,上面已经提到了。
最后,祝小伙伴们使用愉快!
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
欢迎关注公众号【单元库特征化及建库技术】,ID:libchar