数字asic流程实验(五) ICC布局布线
1.IC Compiler简介
IC Compiler(以下简称ICC)是Synopsys公司用于把门级网表转换成代工厂可用于掩膜的版图信息的工具。其基本工作流程为
- 数据准备(Data Setup):将门极网表、约束文件、元件库、工艺文件、物理库、寄生参数模型等输入ICC;
- 布局规划(Design Planning):规定芯片尺寸、形状,确定IO、电源、pad位置等,放置宏单元,放置标准单元,铺设电源网络;
- 布局(Placement):将电路中各个基本单元在芯片中进行布局;
- 时钟树综合(Clock Tree Synthesis):将时钟信号连接至需要驱动的基本单元;
- 布线(Routing):将各个基本单元对应端口进行连接;
- 可造性设计(Chip Finishing):连线拓展、加宽连线,冗余通孔插入,插入填充单元,填充金属等;
如下图所示。
即将DC综合后输出的SDC约束文件,门极网表,代工厂提供的元件库(.db),物理库(physical lib),工艺文件(.tf),RC参数文件(tlu+)等输入ICC后,通过软件中完成布局布线操作,最终会输出可以提供给代工厂进行芯片加工的版图。
此外在完成布局布线后还要在ICC中再次导出门极网表和时序描述文件用于后仿真,与DC导出的文件的区别是
- ICC导出的门极网表文件中的模块与连线与版图是严格对应的
- ICC导出的时序描述文件中的延时由RC参数计算而来
深入学习ICC,最好的方式是熟读Synopsys公司的《IC Compiler 1 Workshop Student Guide》。
2.版图基本知识
使用MOS工艺制作集成电路时,由于集成电路的制作是平面加工工艺,而芯片是立体结构。平面工艺到立体结构的实现,需要多层掩模版。每一层掩模版需要用一层版图来表示,因此版图也是分层的,即不同层的版图代表不同的掩模版。版图是用二维图形表示电路的三维结构,版图设计的目的是完成集成电路加工所需的各个掩模版上的图形的设计。
下图为一个非门的版图:
该非门制作时采用N阱工艺,衬底为P型,PMOS做在N阱中,其剖面图如下:
观察剖面图可以很容易的看出制作时的分层关系。制作该非门时所需要的版图包括:
- N-well:N阱
- active:有源区
- N-implant:N型掺杂
- P-implant:P型掺杂
- poly:栅
- contact:金属触点
- metal1:金属连线
如下图所示
在进行复杂集成电路加工时,单层金属连线往往不能够满足需求,因此会有多层金属连线。如本次实验使用的是6层金属布线工艺。
3.TCL脚本编写&运行
通过编写运行TCL脚本完成Data Setup步骤,该步骤主要的目的是将门极网表(.v)、约束文件(.sdc)、单元库(.db,.sdb)、物理库(physical lib)、寄生参数模型(tlu+)等输入ICC。
本次实验的TCL脚本内容如下:
set DESIGN_NAME "cic_filter"
set search_path "../lib/logic ../lib/milkyway" #设置搜索路径
set target_library "slow.db" #设置标准元件库
set link_library "* $target_library"
set symbol_library " smic18.sdb " #设置标准元件图标库
create_mw_lib my_lib1.mw
-technology ../lib/milkyway/tech/milkyway/smic18_6lm.tf
-mw_reference_library ../lib/smic18 -open #使用工艺文件和物理库创建milkyway
import_designs "../dc/outputs/cic_filter_post_dc.v" -format verilog -top cic_filter #导入网表文件
uniquify_fp_mw_cel
current_design $DESIGN_NAME
set_tlu_plus_files -max_tluplus ../lib/milkyway/tech/tluplus/smiclog018_6lm_cell_max.tluplus
-min_tluplus ../lib/milkyway/tech/tluplus/smiclog018_6lm_cell_min.tluplus
-tech2itf_map ../lib/milkyway/tech/tluplus/smic18_6lm_lef_smic18_6lm_tf.map #导入RC参数文件和.map文件
report_tlu_plus_files > reports/init/report_tlu_plus.rpt
check_tlu_plus_files > reports/init/check_tlu_plus.rpt
remove_sdc
read_sdc ../dc/outputs/cic_filter_post_dc.sdc #读取约束文件
set_clock_uncertainty 2 [all_clocks]
remove_propagated_clock [all_clocks]
check_timing
save_mw_cel
start gui
接着需要在虚拟机中用icc_shell运行脚本
1.打开虚拟机,至/home/crazy/Desktop/experiment/icc 文件夹下,右键Open in Terminal
2.依次输入
ic
icc_shell -f icc_setup.tcl
3.等待脚本运行完成,如果出现报错(和DC综合时一样,执行出错会打印0)则根据报错信息修改icc_setup.tcl。运行完后会自动进入GUI,并且可以看到各个单元。
至此Data Setup步骤完成,可以开始进行布局布线了。
4.在GUI中布局布线
1.在icc_shell中输入
start_gui
启动GUI,①为标签栏,后续各个步骤都在标签栏中进行调用;②为芯片预览图,每一步操作后会更新该图,可以通过滚轮进行放大缩小。
2.下面开始Design Planning
创建Foorplan,并规定core area到芯片边缘的距离,统一设置为50
Foorplan ---> Create Foorplan
创建完毕后:
3.创建电源和地
Preroute ---> Derive Power Ground Connection
选择Manuel connection,依次命名Power net,Power pin,Ground net,Ground pin为VDD和VSS,Create port选择Top
此步骤完成后芯片预览图不会更新,但在Shell中会打印成功连接电源的信息
4.创建电流环
Preroute ---> Create Rings
Nets中填写VDD VSS,Horizontal为水平布线,层数选择为第五层金属(METAL5),Vertical为垂直布线,层数选择为第六层金属(METAL6),Offset、Width和Space分别设置为5、15、5
此步完成后芯片预览图变更如下:
5.创建Power Straps
Preroute ---> Create Power Straps
Nets填写VDD VSS,层数选择METAL6,Width设置为5,方向选择Vertical,X start、Straps、X increment分别设置为70、5、30
此步完成后芯片预览图变更如下:
6.填充标准单元
Finishing ---> Insert Standard Cell Filler
Without metal中填写FILL64 FILL32 FILL16 FILL8 FILL4 FILL2 FILL1
此步完成后芯片预览图变更如下:
7.连接各个标准单元
Preroute ---> Preroute Standard Cells,此步结束后可以在预览图中看到很多小的横向电源条
此步完成后芯片预览图变更如下:
8.去除填充
Finishing ---> Remove Fillers,选择删去Standard Cell
此步完成后芯片预览图变更如下:
至此电源网络搭建完毕,Design Planning结束,开始Placement
9.开始进行电路单元布局,此步骤点击执行后需要等待一段时间
Placement ---> Core Placement and Optimization
此步完成后芯片预览图变更如下:
可以看到所有电路单元都被放进Core area中了,至此Placement结束,开始Clock Tree Synthesis
10.设置时钟树
Clock ---> Set Clock Options Target标签页中,Clock_tree选择clk,Max fanout设置为30,Routing标签页中,勾选METAL1至METAL6的全部金属层,Clock_tree选择clk_div后同样进行配置
11.开始连接时钟,Clock tree names填写clk_div clk,勾选Fix hold time violation for all clocks,等待连接完成,连接完成后可以看到芯片预览图中多出的时钟连线。
Clock ---> Core CTS and Optimization
此步完成后芯片预览图变更如下:
12.重新建立电源,这次Create port选择None
Preroute ---> Derive Power Ground Connection
Shell中打印的信息如下
至此Clock Tree Synthesis结束,开始Route
13.设置忽略的布线层,Maximum routing layer选择METAL6,Minimum routing layer选择METAL1,下面全都不勾选,代表所有金属层都纳入RC参数计算
Route ---> Routing Setup ---> Set Ignored Layers
- Route ---> Net Group Route,选中All clock nets
15.布线相关设置完成,开始布线,布线结束后各个单元模块之间就已经完成了相互连接。
Route ---> Core Routing and Optimization
此步完成后芯片预览图变更如下:
至此Route完成,开始Chip Finishing
16.再次进行标准单元填充,但这次的填充单元是带金属的,输入在With metal一行,Other Options标签中,勾选二三两项
Finishing ---> Insert Standard Cell Filler
此步完成后芯片预览图变更如下:
至此Chip Finishing步骤结束,芯片可以说已经设计好了,接下来就是导出各个文件并进行验证了
17.依次导出网表(.v),提取寄生参数、导出时序描述(.sdf),导出寄生参数文件(.spef),以及代工厂用于加工的GDSII文件
导出网表,Output verilog file name选择文件路径时,文件命名要带.v的后缀名
File ---> Export ---> Write Verilog
提取寄生参数
Route ---> Export RC
导出时序约束
File ---> Export ---> Write SDF
导出寄生参数文件
File ---> Export ---> Write Parasitics
导出GDSII文件
File ---> Export ---> Write Stream
至此ICC布局布线全部工作完成
5.参考资料
《IC Compiler 1 Workshop Student Guide》
《CMOS集成电路的版图设计》
https://blog.csdn.net/qq_42556934/article/details/107661335
https://blog.csdn.net/weixin_46752319/article/details/107252336
https://blog.csdn.net/weixin_46752319/article/details/107313770
https://blog.csdn.net/weixin_46752319/article/details/107360843
https://blog.csdn.net/weixin_46752319/article/details/107387584
https://blog.csdn.net/weixin_46752319/article/details/107564592
https://blog.csdn.net/weixin_46752319/article/details/107633027