第三章:库文件语法——Liberty语法基础、关键字与保留字、数据类型与表达式、注释与包含文件
好,咱们进入第三章。这一章是基本功,说白了就是学怎么“读”和“写”Liberty文件。你想想看,一个.lib文件动辄几万行,要是连语法都看不懂,后面建模、定制根本无从下手。我个人习惯是,拿到一个新库文件,先扫一眼它的语法结构,心里就有底了。
3.1 Liberty语法基础:它其实很像C语言
Liberty语法,嗯,第一眼看上去有点像C语言,但更简单。它没有复杂的指针、结构体,核心就是“定义”和“赋值”。
一个典型的.lib文件,结构是这样的:
library (my_library) {
delay_model : "table_lookup";
...
cell (AND2) {
pin (A) {
direction : input;
capacitance : 0.01;
}
pin (Y) {
direction : output;
function : "A & B";
timing () {
...
}
}
}
}
看到了吗?library、cell、pin这些是关键字,后面跟括号里的名字,然后用花括号{}把属性包起来。每个属性用冒号:赋值,最后用分号;结束。这个结构非常规整,我刚开始学的时候,觉得它比Verilog还容易上手。
3.2 关键字与保留字:这些词你不能乱用
Liberty里有一批“特权词”,叫关键字或保留字。你不能拿它们当cell名、pin名或者属性名。比如你不能定义一个叫cell的cell,也不能定义一个叫input的pin。
常用的关键字我列一下,你心里有个数:
| 类别 | 关键字举例 |
|---|---|
| 顶层定义 | library, cell, pin, bus |
| 属性定义 | direction, function, timing, capacitance |
| 值类型 | input, output, inout, internal |
| 其他 | table, index, values, when |
3.3 数据类型与表达式:数字、字符串和布尔运算
Liberty的数据类型不多,就三种:数字、字符串和布尔值。但别小看它们,组合起来能表达非常复杂的时序信息。
3.3.1 数字类型
数字可以是整数,也可以是浮点数。单位呢?默认是国际单位制,比如电容是法拉(F),时间是秒(s)。但实际库文件里,你看到的都是0.01、1.5e-11这种,因为芯片里的值太小了。
capacitance : 0.01; // 0.01 pF(实际是皮法,但工具会自动换算)
rise_time : 1.5e-11; // 15 ps
3.3.2 字符串类型
字符串用双引号包起来,主要用来描述功能表达式和模型名字。
function : "A & B"; // 与门功能
timing_sense : "positive_unate"; // 时序方向
3.3.3 布尔表达式
这个最常用,也最容易出错。布尔表达式支持&(与)、|(或)、!(非)这些操作符。你想想看,一个复杂的组合逻辑,比如AOI(与或非)门,它的功能表达式可能长这样:
function : "!( (A & B) | (C & D) )";
嗯,这里要注意,括号一定要配对。我见过有人写漏了一个右括号,工具直接报“expression syntax error”。
3.4 注释与包含文件:让库文件更好维护
库文件大了以后,没有注释简直没法看。Liberty支持两种注释风格,和C语言一模一样。
3.4.1 注释
- 单行注释: 用
//开头,直到行尾。 - 多行注释: 用
/* ... */包起来。
// 这是一个单行注释,说明下面这个cell是2输入与非门
cell (NAND2) {
/*
这是一个多行注释
可以写好几行说明文字
比如这个cell的用途、工艺版本等等
*/
pin (Y) {
function : "!(A & B)";
}
}
我个人习惯,在每个cell定义前面加一段注释,写明它的逻辑功能、驱动能力、以及适用的场景。这样半年后回来再看,自己还能看懂。
3.4.2 包含文件
库文件也可以像C语言那样,用#include把其他文件的内容包含进来。这个功能特别有用,比如你可以把所有的工艺参数(电压、温度)单独写一个文件,然后在每个库文件里引用它。
#include "tech_params.lib"
#include "common_timing.lib"
#include把它包含到每个库文件中。这样如果工艺变了,只需要改一个文件,不用每个.lib都改一遍。省时省力,还不容易出错。
3.5 本章小结
这一章的内容,说白了就是让你能“看懂”和“写对”Liberty文件。语法不难,但细节很多。关键字别乱用,表达式别写错,注释别偷懒,包含文件要会用。这些都是基本功,但也是后面所有高级技巧的基础。
下一章,咱们会深入讲“时序弧”和“状态依赖”,那才是真正体现建模水平的地方。到时候我会分享一些我在实际项目中遇到的“诡异”时序问题,保证让你大开眼界。