第二章 版图设计环境搭建: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对复杂层次的处理,有时候会出些小毛病。

我的建议:如果你刚入门,或者公司有统一要求,优先学Virtuoso。它更通用,资料也多。如果你主要做数字模拟混合、或者标准单元库,Laker的自动化能帮你省不少时间。

2.2 PDK安装与配置——这一步最容易踩坑

PDK(Process Design Kit)是工艺厂提供的设计套件。SMIC的PDK,一般包含以下几个核心部分:

  • 工艺文件:.tf(technology file)和.drf(display resource file)
  • 器件模型:用于仿真的model文件
  • 标准单元库:数字标准单元的版图、电路、时序模型
  • DRC/LVS规则文件:验证用的rule deck

安装步骤(以Virtuoso为例):

  1. 从SMIC官网或FAE拿到PDK压缩包,解压到指定目录。我一般放在 /home/PDK/SMIC_0.18um/ 这样的路径下。
  2. 设置环境变量。在 .bashrc.cshrc 里添加:
setenv CDS_Netlisting_Mode Analog
setenv SMIC_PDK_ROOT /home/PDK/SMIC_0.18um
set path = ($path $SMIC_PDK_ROOT/tools/bin)
  1. 启动Virtuoso,在CIW窗口执行:
load("/path/to/PDK/init.il")

嗯,这里要注意。很多新手load完就以为完事了,结果画版图时发现器件调不出来。为什么?因为PDK的 cds.lib 文件没配置好。你得确保 cds.lib 里包含了PDK的库路径。

我曾经踩过的坑:有一次我装SMIC 0.13um的PDK,load完init.il后,发现所有器件的参数都是乱码。折腾了两天,最后发现是环境变量 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")
关键点:.tf和.drf必须匹配。如果你用了SMIC 0.18um的.tf,却加载了0.13um的.drf,那显示的颜色会完全错乱,甚至某些层会看不见。我有个同事就犯过这错,画了半天发现M2层显示不出来,急得满头大汗。

2.4 显示设置与快捷键配置——效率翻倍的关键

说实话,版图设计里,鼠标点来点去最浪费时间。我个人的习惯是,能快捷键绝不用菜单。下面是我常用的显示设置和快捷键配置:

显示设置

在Virtuoso的LSW(Layer Selection Window)里,你可以:

  • 右键点击层名,选择「Set Display Level」来调整显示优先级
  • 用「Y0」「Y1」「Y2」按钮切换显示模式(Y0只显示当前层,Y2显示所有层)
  • Ctrl+F 打开「Filter」,快速定位某层

我建议你把不常用的层(比如N阱、P阱的填充层)设成半透明,这样不会遮挡视线。具体操作:在LSW里双击层名,调整「Stipple」和「Transparency」参数。

快捷键配置

Virtuoso的快捷键存在 .cdsinitleBindKeys.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\")")
一个小技巧:把常用层绑定到数字键,画图时手指不用离开键盘区。我习惯把M1到M4分别绑到1-4,VIA1到VIA3绑到5-7。这样画金属走线时,按一下数字键就能切层,效率提升很明显。

显示加速设置

画大版图时,刷新慢很烦人。你可以这样优化:

  • 在CIW输入 envSetVal("layout" "displayGrid" 'boolean nil) 关闭网格显示
  • Options -> Display 把「Dynamic Highlighting」关掉
  • 把「Display Level」设成「Partial」,只显示当前编辑的层次

嗯,这些设置看起来琐碎,但真能让你少等很多次进度条。我当年做一颗电源管理芯片,版图有十几万个器件,没优化显示前,每次缩放都要等好几秒。优化后基本秒开。

2.5 环境验证——搭好了怎么检查?

环境搭完,别急着画图。先跑个简单的验证:

  1. 在Virtuoso里新建一个cell,试试能不能调出NMOS和PMOS
  2. 画一条M1走线,看看颜色对不对(SMIC 0.18um的M1一般是蓝色)
  3. 跑一下DRC,看规则文件能不能正常加载
  4. 跑一下LVS,看器件识别正不正常

如果以上都OK,恭喜你,环境搭好了。如果哪一步卡住了,别慌。先检查环境变量,再看PDK路径,最后看.tf和.drf是否匹配。90%的问题都出在这三个地方。

最后说一句:环境搭建是基础,但基础不牢,地动山摇。我建议你把每一步都记下来,写成文档。下次换电脑、换项目时,直接照着做就行,不用再重新踩一遍坑。