第三讲:标准单元库解析
各位同学,今天我们来聊聊标准单元库。这东西听起来有点枯燥,但说实话,它是整个数字芯片设计的基石。你想想看,我们做版图设计,天天跟标准单元打交道,但你真的了解它们吗?
我个人习惯,拿到一个新工艺,第一件事就是打开标准单元库,看看里面到底有什么。不是走马观花地看,而是仔细琢磨每个单元的尺寸、结构、驱动能力。为什么?因为后面所有的面积优化、时序收敛,都建立在对标准单元库的深刻理解上。
标准单元的结构
标准单元,说白了就是一堆固定高度的晶体管。它们被设计成统一的高度,这样在布局时才能像拼积木一样整齐排列。我见过不少新手,一上来就问「为什么单元高度是固定的?」——嗯,这个问题问得好。
标准单元的高度通常由工艺节点决定。比如在28nm工艺下,单元高度可能是0.9μm或者1.0μm。这个高度包含了PMOS和NMOS的扩散区、栅极、以及必要的电源轨(VDD和VSS)。
核心要点:标准单元的高度是固定的,但宽度可以变化。宽度决定了单元的驱动能力。
每个标准单元内部,晶体管被精心排列。PMOS在上半部分,NMOS在下半部分。中间是栅极多晶硅。电源轨在顶部和底部。这样的布局,让相邻单元可以共享电源轨,节省面积。
我曾经在一个项目中,遇到一个奇怪的问题:两个单元明明功能相同,但面积却差了一倍。后来仔细看版图才发现,其中一个单元内部走线绕了个大弯,白白浪费了空间。从那以后,我每次选单元都会先看版图结构。
驱动能力与面积权衡
驱动能力,就是单元能输出多大电流。驱动能力越强,单元就能驱动更长的互连线或更多的负载。但代价是什么?面积更大,功耗更高。
标准单元库通常提供多种驱动强度的版本。比如一个反相器,可能有INV_X1、INV_X2、INV_X4、INV_X8等等。X后面的数字越大,驱动能力越强。
| 单元名称 | 驱动强度 | 面积(μm²) | 典型延迟(ps) |
|---|---|---|---|
| INV_X1 | 1x | 0.56 | 15 |
| INV_X2 | 2x | 0.84 | 12 |
| INV_X4 | 4x | 1.40 | 9 |
| INV_X8 | 8x | 2.52 | 7 |
你看这个表格,INV_X8的面积是INV_X1的4.5倍,但延迟只减少了一半多一点。这就是权衡。我在项目中经常看到有人无脑用大驱动单元,结果面积爆炸,功耗也上去了。其实很多时候,用两个X2并联,效果比一个X4更好,面积还更小。
我的经验:在关键路径上,优先使用中等驱动强度的单元。只有在驱动长线或大负载时,才考虑大驱动单元。别一上来就用X8,那是最后的手段。
库文件解读:.lib 和 .lef
标准单元库通常包含两类文件:.lib(Liberty格式)和 .lef(Library Exchange Format)。这两个文件,一个管时序,一个管版图。
.lib 文件
.lib 文件包含了单元的时序信息。比如延迟、转换时间、功耗等。这些数据是通过SPICE仿真得到的,存储在查找表中。
举个例子,一个反相器的延迟,取决于输入转换时间和输出负载电容。.lib 文件里会有一个二维查找表:
cell (INV_X1) {
pin (A) {
direction : input;
capacitance : 0.002;
}
pin (Y) {
direction : output;
function : "(!A)";
timing () {
related_pin : "A";
timing_sense : negative_unate;
cell_rise (delay_template_7x7) {
index_1 ("0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1.0");
index_2 ("0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1.0");
values ( \
"0.012, 0.015, 0.020, 0.028, 0.040, 0.065, 0.100", \
"0.014, 0.017, 0.022, 0.030, 0.042, 0.067, 0.102", \
...
);
}
}
}
}
这段代码看着复杂,其实逻辑很简单。index_1是输入转换时间,index_2是输出负载电容。values就是对应的延迟值。STA工具就是靠这个表来计算路径延迟的。
注意:.lib 文件里的延迟数据,是在特定工艺角(如TT、SS、FF)下仿真得到的。不同工艺角下的延迟差异可能达到2-3倍。做时序分析时,一定要覆盖所有工艺角。
.lef 文件
.lef 文件描述了单元的物理信息。包括单元尺寸、引脚位置、金属层、阻挡层等。这些信息是布局布线工具需要的。
MACRO INV_X1
CLASS CORE ;
FOREIGN INV_X1 ;
ORIGIN 0 0 ;
SIZE 0.56 BY 1.40 ;
SYMMETRY X Y ;
SITE core ;
PIN A
DIRECTION INPUT ;
USE SIGNAL ;
PORT
LAYER M1 ;
RECT 0.10 0.60 0.20 0.80 ;
END
END A
PIN Y
DIRECTION OUTPUT ;
USE SIGNAL ;
PORT
LAYER M1 ;
RECT 0.36 0.60 0.46 0.80 ;
END
END Y
OBS
LAYER M1 ;
RECT 0.00 0.00 0.56 1.40 ;
END
END INV_X1
你看,这个反相器的尺寸是0.56μm宽,1.40μm高。引脚A和Y都在M1层,有具体的坐标位置。OBS区域表示这个单元占用了哪些金属层,其他单元不能在这里布线。
我记得有一次,一个同事在布局时发现单元之间总是有DRC错误。查了半天,原来是.lef文件里的OBS区域定义有误,导致布线工具以为那里可以走线。从那以后,我每次拿到新的库,都会先检查.lef文件的完整性。
单元延迟模型
单元延迟模型,就是描述延迟与输入转换时间、输出负载之间关系的数学模型。常见的模型有NLDM(Non-Linear Delay Model)和CCS(Composite Current Source)模型。
NLDM模型:这是最传统的模型。它用查找表存储延迟和输出转换时间。优点是简单,缺点是精度有限,特别是在低电压下。
CCS模型:这是较新的模型。它用电流源来描述单元的输出行为。精度更高,但计算量也更大。
在实际项目中,我建议优先使用CCS模型,特别是对于先进工艺(28nm以下)。NLDM在45nm以上工艺还能用,到了7nm、5nm,误差就太大了。
关键点:延迟模型的选择直接影响时序分析的精度。在关键路径上,一定要用高精度模型。非关键路径可以用NLDM,节省运行时间。
好了,关于标准单元库,今天就讲到这里。记住一句话:标准单元库是你的工具箱,了解每个工具的用途和限制,才能用好它们。
可可精品资料库