第二章 版图设计环境搭建:EDA工具选择、PDK安装与配置
好,咱们开始聊环境搭建。说实话,很多新手觉得这步就是装个软件、点几个按钮,没什么技术含量。但我跟你说,环境搭得好不好,直接决定你后面几个月干活顺不顺手。我见过太多人因为PDK路径配错、显示设置不对,白白浪费好几天。
2.1 EDA工具选择:Virtuoso vs Laker
目前主流的两款工具,就是Cadence的Virtuoso和SpringSoft的Laker(现在被Synopsys收了)。我用Virtuoso十几年了,但Laker我也用过几个项目,各有千秋。
Virtuoso,说白了就是行业老大哥。功能全、生态好,尤其是做模拟版图,它的层次化编辑、自动布线辅助、DRC/LVS集成,都非常成熟。我个人习惯用Virtuoso做复杂模拟模块,比如PLL、ADC这些,它的约束驱动布线确实好用。
Laker呢,强在自动化。它的「Device Generation」功能,能根据参数自动生成MOS管、电阻、电容的版图,效率很高。我记得有个项目,用Laker搭一个匹配的差分对,比Virtuoso快了一倍。但Laker对复杂层次的处理,有时候会出些小毛病。
2.2 PDK安装与配置——这一步最容易踩坑
PDK(Process Design Kit)是工艺厂提供的设计套件。SMIC的PDK,一般包含以下几个核心部分:
- 工艺文件:.tf(technology file)和.drf(display resource file)
- 器件模型:用于仿真的model文件
- 标准单元库:数字标准单元的版图、电路、时序模型
- DRC/LVS规则文件:验证用的rule deck
安装步骤(以Virtuoso为例):
- 从SMIC官网或FAE拿到PDK压缩包,解压到指定目录。我一般放在
/home/PDK/SMIC_0.18um/这样的路径下。 - 设置环境变量。在
.bashrc或.cshrc里添加:
setenv CDS_Netlisting_Mode Analog
setenv SMIC_PDK_ROOT /home/PDK/SMIC_0.18um
set path = ($path $SMIC_PDK_ROOT/tools/bin)
- 启动Virtuoso,在CIW窗口执行:
load("/path/to/PDK/init.il")
嗯,这里要注意。很多新手load完就以为完事了,结果画版图时发现器件调不出来。为什么?因为PDK的 cds.lib 文件没配置好。你得确保 cds.lib 里包含了PDK的库路径。
LANG 设成了中文,PDK的字符编码不兼容。改成 export LANG=en_US.UTF-8 就好了。所以,装PDK时尽量用英文环境。
2.3 工艺文件加载:.tf 和 .drf
.tf文件(Technology File)定义了工艺的物理层信息:
- 各层名称、编号、用途(比如M1是金属1,用于走线)
- 设计规则(最小线宽、间距、包围等)
- 通孔定义(VIA1、VIA2等)
- 器件层次结构
.drf文件(Display Resource File)定义了显示样式:
- 各层的颜色、填充图案
- 线型、透明度
- 高亮和选择时的显示效果
加载方法很简单。在Virtuoso的CIW窗口输入:
techLoad("路径/你的工艺.tf")
drLoad("路径/你的工艺.drf")
或者,你可以在 .cdsinit 文件里自动加载,这样每次启动都不用手动敲了:
techLoad("/home/PDK/SMIC_0.18um/techfile/SMIC018.tf")
drLoad("/home/PDK/SMIC_0.18um/techfile/SMIC018.drf")
2.4 显示设置与快捷键配置——效率翻倍的关键
说实话,版图设计里,鼠标点来点去最浪费时间。我个人的习惯是,能快捷键绝不用菜单。下面是我常用的显示设置和快捷键配置:
显示设置
在Virtuoso的LSW(Layer Selection Window)里,你可以:
- 右键点击层名,选择「Set Display Level」来调整显示优先级
- 用「Y0」「Y1」「Y2」按钮切换显示模式(Y0只显示当前层,Y2显示所有层)
- 按
Ctrl+F打开「Filter」,快速定位某层
我建议你把不常用的层(比如N阱、P阱的填充层)设成半透明,这样不会遮挡视线。具体操作:在LSW里双击层名,调整「Stipple」和「Transparency」参数。
快捷键配置
Virtuoso的快捷键存在 .cdsinit 或 leBindKeys.il 文件里。下面是我自己用了多年的配置,分享给你:
; 常用操作
hiSetBindKey("Layout" "Ctrl+Z" "undo()")
hiSetBindKey("Layout" "Ctrl+Y" "redo()")
hiSetBindKey("Layout" "F4" "leHiCopy()")
hiSetBindKey("Layout" "F5" "leHiStretch()")
hiSetBindKey("Layout" "F6" "leHiMove()")
; 视图控制
hiSetBindKey("Layout" "Ctrl+W" "zoomIn()")
hiSetBindKey("Layout" "Ctrl+Q" "zoomOut()")
hiSetBindKey("Layout" "Ctrl+E" "zoomFit()")
; 层切换(我习惯用数字键)
hiSetBindKey("Layout" "1" "leSetEntryLayer(\"M1\")")
hiSetBindKey("Layout" "2" "leSetEntryLayer(\"M2\")")
hiSetBindKey("Layout" "3" "leSetEntryLayer(\"M3\")")
hiSetBindKey("Layout" "4" "leSetEntryLayer(\"VIA1\")")
显示加速设置
画大版图时,刷新慢很烦人。你可以这样优化:
- 在CIW输入
envSetVal("layout" "displayGrid" 'boolean nil)关闭网格显示 - 用
Options -> Display把「Dynamic Highlighting」关掉 - 把「Display Level」设成「Partial」,只显示当前编辑的层次
嗯,这些设置看起来琐碎,但真能让你少等很多次进度条。我当年做一颗电源管理芯片,版图有十几万个器件,没优化显示前,每次缩放都要等好几秒。优化后基本秒开。
2.5 环境验证——搭好了怎么检查?
环境搭完,别急着画图。先跑个简单的验证:
- 在Virtuoso里新建一个cell,试试能不能调出NMOS和PMOS
- 画一条M1走线,看看颜色对不对(SMIC 0.18um的M1一般是蓝色)
- 跑一下DRC,看规则文件能不能正常加载
- 跑一下LVS,看器件识别正不正常
如果以上都OK,恭喜你,环境搭好了。如果哪一步卡住了,别慌。先检查环境变量,再看PDK路径,最后看.tf和.drf是否匹配。90%的问题都出在这三个地方。