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_lib或compile_library命令把它转成.db文件。不过现在很多工艺厂直接提供.db文件,省了这一步。
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去哪儿找库文件。
好了,关于综合库的分类和设置,就聊到这儿。下一章咱们会讲怎么读入设计文件,到时候这些库的设置就会派上用场了。