3、RTL设计与综合库:综合库的分类与设置

好,咱们今天聊聊综合库。这东西听起来有点枯燥,但说实话,它是整个综合流程的基石。你想想看,没有库,工具连门电路长什么样都不知道,怎么帮你做综合?

我在刚接触DC那会儿,就吃过库没设对的亏。那次综合出来的网表面积大得离谱,查了半天,原来是链接库指向了一个老版本的库文件。嗯,从那以后,我对库的设置就格外小心了。

综合库的分类

DC里用到的库,主要分这么几类。每一类都有自己的活要干,别搞混了。

1. 目标库(Target Library)

目标库,说白了就是DC最终要映射到的工艺库。你希望综合出来的网表用哪个工艺厂的单元,就把那个库设成目标库。比如你用台积电的28nm工艺,目标库就是tsmc28的库。

我个人习惯:目标库只设一个,就是最终要流片用的那个工艺库。设多了反而容易出问题,DC不知道该优先用哪个。

2. 链接库(Link Library)

链接库是用来解析设计中引用的所有单元的。它包含目标库,还包含一些其他的库,比如IO库、存储器编译器生成的库、第三方IP的库等等。

举个例子,你的设计里例化了一个SRAM,这个SRAM的库就要加到链接库里。否则DC会报错,说找不到这个模块。

注意:链接库一定要包含目标库。我见过有人忘了加,结果综合出来的网表里全是空的黑盒子。

3. 符号库(Symbol Library)

符号库,这玩意儿主要是给图形界面看的。你在DC的GUI里看原理图时,每个门电路显示成什么样子,就是符号库决定的。它不影响综合结果,但调试时挺有用。

说实话,我现在基本不用GUI,都是命令行操作。所以符号库对我来说,可有可无。但如果你是新手,喜欢看图形,那还是设上吧。

4. 综合库(Synthetic Library)

综合库,也叫DesignWare库。它包含了DC内置的一些可综合的运算单元,比如加法器、乘法器、比较器等等。这些是Synopsys自己提供的,跟工艺无关。

你写代码时用了一个“+”,DC就会从综合库里选一个合适的加法器实现。所以这个库必须设,不然DC连基本的运算都做不了。

库文件的格式

库文件主要有两种格式:.db和.lib。它们的关系,说白了就是编译前后的关系。

格式 说明 特点
.lib 文本格式的库文件 可读性好,可以用文本编辑器打开查看。但文件很大,DC读取慢。
.db 二进制格式的库文件 DC直接读取的格式,读取速度快,文件体积小。但人眼没法直接看。

你从工艺厂拿到的通常是.lib文件。DC不能直接用,得先用read_libcompile_library命令把它转成.db文件。不过现在很多工艺厂直接提供.db文件,省了这一步。

小技巧:如果你想知道某个.lib文件里都有哪些单元,可以用report_lib命令查看。我曾经用这个命令查过一个库,发现里面居然没有基本的与非门,吓得我赶紧联系了工艺厂。

设置库搜索路径

库文件放哪儿都行,但DC得知道去哪儿找。这就需要设置搜索路径。

设置搜索路径用set_search_path命令。比如:

set_search_path [list . /home/design/libs /tools/synopsys/dw/syn_verilog]

这个命令告诉DC,去当前目录、/home/design/libs和/tools/synopsys/dw/syn_verilog这三个地方找库文件。

然后,设置目标库和链接库:

set target_library "tsmc28.db"
set link_library [list "*" $target_library "sram_compiler.db" "io_lib.db"]

注意那个星号“*”,它表示DC在解析时,先找已经读入内存的设计。这个习惯我一直保留着,能避免一些重复解析的问题。

核心要点:
  • 目标库:最终映射的工艺库,只设一个。
  • 链接库:包含目标库和所有用到的IP库。
  • 符号库:图形界面用,不影响综合结果。
  • 综合库:DC内置的运算单元库,必须设。
  • 库文件:.lib是人读的,.db是机器读的。
  • 搜索路径:告诉DC去哪儿找库文件。

好了,关于综合库的分类和设置,就聊到这儿。下一章咱们会讲怎么读入设计文件,到时候这些库的设置就会派上用场了。