简介:L-Edit V11.1 是一款面向集成电路版图设计与教学场景的 EDA 工具资源,适合微电子、集成电路相关专业的学生、教师及初学版图设计的工程师使用。资源为免安装版本,解压后即可直接运行,省去繁琐的配置流程,便于在课堂演示或自学环境中快速上手。压缩包共收录 619 个文件,整体约 26.77MB,涵盖 tdb、tdo 等工艺与版图数据文件,dll、h、c、cpp 等程序与开发文件,以及 lvs、drc、ext、spc 等验证与仿真相关文件,另附 pdf 说明文档、bat 批处理脚本和 exe 可执行程序,结构较为完整。内容预览中可见 crack、resonator、xor2 等批处理脚本,涉及版图示例与 LVS 验证流程,方便读者对照练习版图绘制、规则检查与电路提取等操作。目前已有 4079 人学习下载,适合作为版图设计入门与教学实践的参考工具包。
1. 从 L-Edit V11.1 的版图窗口说起:为什么老工程师还在用它画标准单元
如果你在版图工程师的群里问一句“现在画标准单元用什么”,大概率会得到两个答案:一个是脚本化程度更高的新工具,另一个就是 L-Edit V11.1。这个版本号听起来有点年代感,但它在中小规模模拟电路、标准单元库、MEMS 结构、功率器件版图里依然活跃。原因不复杂:它把“画版图”这件事拆得足够直白,图层、坐标、DRC 规则、GDS 导出都在一个界面里闭环,不需要你先搭一套复杂的工程环境。
我见过不少团队的做法是:用 L-Edit V11.1 做单元级版图设计和快速迭代,再把 GDS 丢给后续流程。它适合谁?适合需要自己掌控版图细节、又不想被重型工具绑死的模拟版图工程师、器件工程师、高校实验室里做流片验证的研究生。这一章不展开操作,先把“它到底解决什么问题”说清楚:它解决的是从原理图到可制造版图之间那段最磨人的手工活,尤其是当你的单元数量在几十到几百个、规则又经常变的时候。
2. 用 L-Edit V11.1 建一个可复用的标准单元:从图层定义到 GDS 导出
2.1 先定图层映射表,别急着画第一个矩形
很多人打开 L-Edit V11.1 之后第一反应是直接画矩形,结果画到一半发现图层名字对不上工艺库,后面 DRC 和导出全乱。我的习惯是先把工艺厂给的图层对照表整理成一张表,再在 L-Edit 里建对应的 Layer。常见做法是:打开 Setup 菜单下的 Layers 对话框,逐条添加图层名、颜色、填充样式、GDS 编号。这里的关键是 GDS 编号必须和工艺库一致,否则导出后版图会“丢层”。
下面这张表是我做模拟单元时常用的最小图层集合,你可以按自己的工艺增删:
| 图层名 | 用途 | GDS 编号示例 | 线宽/间距典型值 |
|---|---|---|---|
| NWELL | N 阱 | 1 | 最小宽度 0.6 um |
| POLY | 多晶硅栅 | 2 | 最小宽度 0.18 um |
| ACTIVE | 有源区 | 3 | 最小宽度 0.22 um |
| CONT | 接触孔 | 4 | 0.22 um x 0.22 um |
| MET1 | 第一层金属 | 5 | 最小宽度 0.23 um |
| VIA1 | 通孔 | 6 | 0.23 um x 0.23 um |
| MET2 | 第二层金属 | 7 | 最小宽度 0.28 um |
提示:GDS 编号不是随便填的,一定要拿工艺厂的 Layer Map 文件核对。我见过有人把 MET1 写成 6,结果导出后金属层和通孔层叠在一起,DRC 报了几百个错。
建完图层后,建议立刻保存一个模板文件(.tdb),后面每画一个新单元都从这个模板复制。这样做的收益在第三、第四个单元时就会体现出来:你不用再重复调颜色、改线宽、对 GDS 编号。
2.2 画一个反相器单元:坐标、栅格与对齐的实操细节
假设我们要画一个最简单的反相器单元,版图尺寸控制在 2 um x 2 um 以内。步骤如下:
第一步,设置栅格。在 L-Edit V11.1 里按快捷键 Ctrl+G 打开 Grid 设置,把 Snap 设成 0.01 um,Display 设成 0.05 um。这样你画矩形时坐标会自动吸附到 0.01 um,避免出现 0.003 um 这种“脏坐标”。脏坐标在后续 DRC 和 LVS 里是玄学错误的源头之一。
第二步,画有源区。选择 ACTIVE 图层,用 Box 工具画一个 0.8 um x 0.6 um 的矩形,作为 PMOS 和 NMOS 的共用有源区。注意 PMOS 和 NMOS 之间要留足够的阱间距,通常 NWELL 要包住 PMOS 有源区 0.3 um 以上。
第三步,画多晶硅栅。选择 POLY 图层,画一条宽度 0.18 um 的竖条,横跨有源区。这条栅的左右边缘要对齐有源区边界,不能超出太多,否则寄生电容会变大。
第四步,打接触孔。在 CONT 图层上,于有源区两端各放两个 0.22 um x 0.22 um 的方孔,孔间距 0.3 um。这里有个血泪经验:接触孔不要贴着有源区边缘放,要留 0.1 um 以上的包围,否则工艺厂会判“孔到有源区边界太近”。
第五步,连金属。用 MET1 把接触孔连起来,再引出输入输出端口。金属线宽至少 0.23 um,拐角处用 45 度斜角或圆弧,不要用 90 度直角——直角在先进工艺里容易导致电迁移问题。
下面是一段用 L-Edit 的 TCL 脚本批量生成接触孔阵列的示例,适合在单元里重复放孔时用:
# 在 L-Edit V11.1 中批量生成接触孔阵列 # 参数:起始坐标 x0 y0,孔数 nx ny,孔间距 pitch,孔尺寸 size proc draw_contact_array {layer x0 y0 nx ny pitch size} { for {set i 0} {$i < $nx} {incr i} { for {set j 0} {$j < $ny} {incr j} { set x [expr {$x0 + $i * $pitch}] set y [expr {$y0 + $j * $pitch}] # 创建矩形并指定图层 set rect [ledit::create_rectangle $layer $x $y [expr {$x + $size}] [expr {$y + $size}]] } } } # 调用示例:在 CONT 图层上从 (0.5, 0.5) 开始放 2x2 个孔,间距 0.5,孔尺寸 0.22 draw_contact_array "CONT" 0.5 0.5 2 2 0.5 0.22这段脚本的逻辑很直接:双重循环按间距递增坐标,每次创建一个矩形。参数里pitch是孔中心到中心的距离,size是孔的边长。注意pitch必须大于size,否则孔会重叠。我一般会把pitch设成size + 0.28,留出足够的间距余量。
2.3 DRC 规则检查:把错误挡在导出之前
画完单元后,不要急着导出 GDS。先在 L-Edit V11.1 里跑一遍 DRC。打开 Tools 菜单下的 DRC,加载工艺厂提供的规则文件(通常是 .drc 或 .rul 格式)。如果没有现成规则文件,可以自己写几条最关键的检查,比如最小线宽、最小间距、孔包围。
下面是一个简化的 DRC 规则片段,用来检查 MET1 的最小线宽和最小间距:
# L-Edit DRC 规则示例:MET1 最小线宽和间距 # 最小线宽检查 layer MET1 width < 0.23 # 如果 MET1 宽度小于 0.23 um,报错 # 最小间距检查 space < 0.23 # 如果 MET1 间距小于 0.23 um,报错 # 接触孔包围检查 layer CONT enclosure MET1 < 0.05 # CONT 被 MET1 包围小于 0.05 um,报错跑完 DRC 后,L-Edit 会在输出窗口列出所有违规坐标。双击某条错误,视图会自动跳到对应位置。这里有个小技巧:把 DRC 结果导出成文本,用脚本按错误类型分类,先修“间距”类错误,再修“包围”类错误,因为间距错误往往会影响多个单元。
2.4 导出 GDS:三个必须确认的参数
导出 GDS 是最后一步,也是最容易翻车的一步。在 File 菜单下选择 Export GDSII,重点确认三个参数:
第一,Layer Map 文件。必须选择与当前版图图层定义一致的那个映射文件。如果选错,导出的 GDS 里图层编号会全部错位。
第二,单位。L-Edit 内部默认单位是微米,GDS 导出时通常用 1e-6 作为用户单位。如果你在导出对话框里看到“User Unit”是 0.001,那导出的版图会缩小 1000 倍。这个参数我吃过亏,导出的 GDS 在后续工具里打开只有几个像素大。
第三,精度。GDS 的坐标精度通常是 0.001 um 或 0.0001 um。对于大多数模拟工艺,0.001 um 够用;如果你画的是射频结构,建议用 0.0001 um。
导出完成后,用 L-Edit 重新打开这个 GDS 文件,对比图层数量和单元边界。如果发现少层或边界偏移,回到 Layer Map 和单位设置排查。
3. L-Edit V11.1 的避坑与排查:那些年我们踩过的图层和坐标坑
3.1 现象:DRC 报了几百个错,但版图看起来没问题
原因:最常见的是栅格没对齐,导致坐标出现 0.001 um 级别的偏移。L-Edit V11.1 的 DRC 引擎对坐标非常敏感,哪怕你肉眼看着两条线贴在一起,实际坐标可能差了 0.002 um。
解决:按 Ctrl+G 把 Snap 设成 0.01 um,然后全选版图,用 Edit 菜单下的 Snap to Grid 功能把所有坐标吸附到栅格上。再跑一次 DRC,大部分“假错误”会消失。
3.2 现象:导出的 GDS 在后续工具里打开,金属层不见了
原因:Layer Map 文件里的 GDS 编号和版图图层定义不一致。比如你在 L-Edit 里把 MET1 的 GDS 编号设成 5,但导出时选的映射文件里 MET1 对应的是 7。
解决:打开 Setup 下的 Layers 对话框,逐个核对每个图层的 GDS 编号,然后重新导出。建议把正确的映射关系保存成单独的 .map 文件,每次导出都用它。
3.3 现象:接触孔在 DRC 里报“孔包围不足”,但明明留了 0.1 um
原因:接触孔的包围检查是看孔边缘到有源区或金属边缘的距离,不是看孔中心。如果你放孔时用的是中心坐标,实际边缘可能只留了 0.05 um。
解决:在放孔时,用孔的中心坐标减去孔边长的一半,得到孔边缘坐标,再检查包围。或者直接用脚本批量放孔,在脚本里把包围量作为参数传进去。
3.4 现象:L-Edit V11.1 打开大版图时卡顿严重
原因:V11.1 是较老的版本,对超大版图的渲染优化有限。如果你在一个文件里放了几万个矩形,视图刷新会明显变慢。
解决:把大版图拆成多个单元文件,用层次化设计。每个单元单独保存,最后在一个顶层文件里引用。这样每次只加载当前编辑的单元,卡顿会缓解很多。另外,关闭不必要的图层显示,只打开当前编辑需要的层。
3.5 现象:TCL 脚本执行到一半报错,但错误信息看不懂
原因:L-Edit V11.1 的 TCL 解释器对变量类型和图层名大小写敏感。比如你写layer met1,但实际图层名是MET1,就会报“layer not found”。
解决:在脚本开头用puts打印当前图层列表,确认图层名拼写。另外,所有坐标变量建议用expr显式声明为浮点数,避免整数除法导致坐标归零。
4. 把 L-Edit V11.1 用成批量单元生成器:一个参数化单元的进阶写法
当你已经能熟练画单个单元后,下一步自然是“批量生成”。L-Edit V11.1 的 TCL 接口虽然不算现代,但足够让你写一个参数化的单元生成器。我一般会这样做:把单元的关键尺寸(栅宽、孔数、金属宽度)定义成变量,然后用一个主脚本读入参数表,循环生成不同尺寸的单元,最后统一导出 GDS。
下面是一个参数化反相器单元的脚本骨架:
# 参数化反相器单元生成器 # 参数:栅宽 wg,孔数 ncont,金属宽度 wm proc generate_inverter {wg ncont wm} { # 创建新单元 set cell [ledit::create_cell "INV_wg${wg}_nc${ncont}"] # 画有源区 ledit::create_rectangle "ACTIVE" 0 0 [expr {$wg + 0.4}] 0.6 # 画多晶硅栅 ledit::create_rectangle "POLY" [expr {$wg/2 - 0.09}] -0.1 [expr {$wg/2 + 0.09}] 0.7 # 批量放接触孔 for {set i 0} {$i < $ncont} {incr i} { set x [expr {0.2 + $i * 0.5}] ledit::create_rectangle "CONT" $x 0.2 [expr {$x + 0.22}] 0.42 } # 画金属 ledit::create_rectangle "MET1" 0 0.1 $wm 0.5 # 返回单元名 return $cell } # 批量生成不同尺寸的单元 foreach wg {0.5 0.8 1.0} { foreach nc {2 3 4} { generate_inverter $wg $nc 0.5 } }这段脚本的核心是generate_inverter过程:它接收三个参数,分别控制栅宽、接触孔数量和金属宽度。内部用create_rectangle逐层绘制,最后返回单元名。主循环遍历不同的参数组合,一次性生成 9 个单元。参数说明:wg决定栅的横向尺寸,ncont决定接触孔个数,wm决定金属引出线的宽度。注意wg/2在 TCL 里是浮点除法,因为wg本身是浮点数;如果你传整数进去,记得用expr {double($wg)/2}。
生成完所有单元后,用 File 菜单下的 Export GDSII 一次性导出。导出前建议先跑一遍 DRC,把每个单元都检查一遍。如果某个单元报错,脚本会继续生成后面的单元,但错误会记录在日志里,你可以根据单元名定位到具体参数组合。
进阶技巧:把参数表写成一个 CSV 文件,用 TCL 的open和gets逐行读取,这样不用改脚本就能调整参数。我通常会把常用尺寸组合放在 CSV 里,每次流片前根据工艺角微调几个值,重新跑一遍脚本,几分钟就能得到全套单元版图。
最后说一个我自己的习惯:每次生成完一批单元,我会随机挑三个用 L-Edit 打开,手动量一下关键尺寸,确认脚本没有把某个参数写错。这个习惯帮我拦住了好几次“栅宽少写一个零”的事故。希望帮到你。
本文还有配套的精品资源,点击获取