admin 管理员组文章数量: 1087649
2024年12月28日发(作者:时间戳转换为时间序列类型)
使用手册
本手册共分为三部分:第一部分分为四章,分别介绍Cadence cdsSpice、virtuoso Editing、
Diva和verilog。第二部分主要介绍MEDICI。第三部分是附录部分,是对前两章的一个补
充,并简要的介绍了寄生元件提取语句的语法。
第一章. CdsSpice的使用说明 .........................................1
§ 1-1 进入Cadence软件包 .................................
..............1
一.在工作站上使用........................................................1
二.在PC机上使用...........................
.............................1
§ 1-2 建立可进行SPICE模拟的单元文件.................................. 2
一.File菜单.............................
.............................. 2
二.Tools菜单.......................................................... 4
三.Technology File菜单.....
............................................ 4
§ 1-3 编辑可进行SPICE模拟的单元文件.................................. 5
§ 1-4 模拟的设置(重点)..........
..................................... 6
一.Session菜单........................................................ 6
二.Setup菜单.
........................................................ 7
三.Analyses菜单....................................................... 7
四.Variables菜单.......................................................10
五.其它有关的菜单项...........................
.......................10
§ 1-5 模拟结果的显示以及处理..........................................11
§ 1-6 一个例子――D触发器..........................
..................12
§ 1-7 分模块模拟(建立子模块).........................................14
§ 1-8 其它的一些内容(计算器)................................
.........16
第二章. Virtuoso Editing的使用简介..........................................1
§ 2-1 建立版图文件...........................................
..........1
§ 2-2 绘制inverter掩膜版图的一些准备工作................................1
§ 2-3 绘制版图.................................................
........5
一.画pmos的版图......................................................5
二.布线...................................
.............................7
三.画nmos的版图.......................................................8
四.完成整个非门的绘制及绘制输入、输出.............
.....................8
五.作标签..............................................................9
第三章. Diva验证工具的使用说明..............
..............................1
§ 3-1 DRC规则文件的编写.............................................2
§ 3-2 版图提取文件的介绍.................
.............................3
§ 3-3 LVS文件的介绍..................................................4
§ 3-4 Diva的用法..............
........................................5
一.DRC的说明........................................................5
二.版图提取(
Extractor)说明...........................................7
第四章. Verilog的使用方法..................................1
§ 4-1 Verilog的文本编辑器................
..............................1
§ 4-2 Verilog的模拟仿真................................................1
一.命令的选择........................................................1
二.SimVision图形环境.................................................2
三.Navigator窗口......................................................5
四.Singal Flow Browser窗口..................................
...........8
五.Watch Objects窗口.................................................10
§ 4-3 一个示例..................................
........................11
第六章. 附录..............................................................1
§ 6-1 非门DRC文件的编写......
....................................... 1
§ 6-2 一个完整DIVA文件的注解............................................6
§ 6-3 DRC文件中一些定义和关键词的图文解释.....
.......................13
§ 6-4 DIVA中寄生元器件提取语句介绍..................................
24
第一章. CdsSPICE的使用说明
Cadence CdsSPICE 也是众多使用SPICE内核的电路模拟软件之一。因此在使用上
会有部分同我们平时所用到的PSPICE相同。这里将侧重讲一下它的一些特殊用法。
§ 1-1
进入Cadence软件包
一.在工作站上使用
在命令行中(提示符后,如:ZUEDA22>)键入以下命令
icfb&↙(回车键),其中& 表示后台工作。Icfb调出Cadence软件。
出现的主窗口如图1-1-1所示:
图 1-1-1Candence主窗口
二.在PC机上使用
1)将PC机的颜色属性改为256色(这一步必须);
2)打开Exceed软件,一般选用xstart软件,以下是使用步骤:
start method选择REXEC(TCP-IP) ,Programm选择Xwindow。Host选择10.13.71.32
或10.13.71.33。host type选择sun。并点击后面的按钮,在弹出菜单中选择command tool。
确认选择完毕后,点击run!
3)在提示符ZDASIC22> 下键入:setenv DISPLAY 本机ip:0.0(回车)
4)在命令行中(提示符后,如:ZUEDA22>)键入以下命令
icfb&↙(回车键)
即进入cadence中。出现的主窗口如图1-1-1所示。
以上是使用xstart登陆cadance的方法。在使用其他软件登陆
cadance时,可能在登录
前要修改文件.cshrc,方法如下:
在提示符下输入如下命令:vi .cshrc↙ (进入全屏幕编辑程序vi)
将光标移至setevn DISPLAY ZDASIC22:0.0 处,将“ZDASIC22”改为PC机的IP,其
它不变(重新回到服务器上运行时,还需按原样改回)。改完后存盘退出。
然后输入如下命令: source .cshrc↙ (重新载入该文件)
以下介绍一下全屏幕编辑程序vi的一些使用方法:
vi使用了两种状态,一是指令态(Command Mode),另一是插入态(Insert Mode)。当vi
处于指令态时,打入的内容会视作指令来解释;而当vi处于插入态时,就可以打入正文
(text)文件;大多数vi指令是单字符的。由插入态改变为指令态,按〈Esc〉键;而由
命令态转为插入态,则可以使用下面的插入令,直接打入,无需再按〈Return〉键。在vi
的指令态下,用h,j,k,l键移动光标,具体如下:
h——光标左移一个字符;
j——光标向下一行;
k——光标向上一行;
l——光标右移一个字符;
以下是一些基本插入命令(须用到的)的用法:
i——在光标处插入正文;
x——删除光标处的字符;
:wq——存盘退出;
要记著一点,在插入态处,不能打入指令,必需先按〈Esc〉键,返回指令态。假若户不知
身处何态,也可以按〈Esc〉键,不管处于何态,都会返回指令态其它的一些命令请读者自己参
阅有关的书籍。
§ 1-2
建立可进行SPICE模拟的单元文件
主窗口分为信息窗口CIW、命令行以及主菜单。信息窗口会给出一些系统信息(如出
错信息,程序运行情况等)。在命令行中可以输入某些命令。如我们调用Cadence的命令icfb
和一些其它命令,比较重要的有调出帮助文件的openbook&等。
一.File菜单
在File菜单下,主要的菜单项有New、Open、Exit等。在具体解释之前我们不妨先理
顺一下以下几个关系。library(库)的地位相当于文件夹,它用来存放一整个设计的所有数据,
像一些子单元(cell)以及子单元(cell)中的多种视图(view)。Cell(单元)可以是一个简
单的单元,像一个与非门,也可以是比较复杂的单元(由symbol搭建而成)。View则包含
多种类型,常用的有schamatic,symbol,layout,extracted,ivpcell等等,他们各自代表什
么意思以后将会一一提到。
New菜单项的子菜单下有Library、Cellview两项。Library项打开New Library窗口,
Cellview项打开Create New File窗口,如图1-2-1和1-2-2所示。
图1-2-1 New Library 窗口
图1-2-2 Create New File 窗口
1) 建立库(library):窗口分Library和Technology File 两部分。Library部分有Name和
Directory两项,分别输入要建立的Library的名称和路径。如果只建立进行SPICE
模拟的线路图,Technology部分选择 Don’t need a techfile 选项。如果在库中要创立
掩模版或其它的物理数据(即要建立除了schematic外的一些view),则须选择
Compile a new techfile(建立新的techfile)或Attach to an existing techfile(使用原有的
techfile)。
2) 建立单元文件(cell):在Library Name 中选择存放新文件的库,在Cell Name中输
入名称,然后在Tool选项中选择Composer-Schematic工具(进行SPICE模拟),在
View Name中就会自动填上相应的View Name——schematic。当然在Tool工具中还
有很多别的工具,常用的象Composer-symbol、virtuoso-layout等,分别建立的是
symbol、layout的视图(view)。在Library path file中,是系统自建的library path file
文件的路径及名称(保存相关库的名称及路径)。
Open菜单项打开相应的Open File窗口,如图1-2-3所示。
在
Library Name中选择库名,在Cell Names中选择需要打开的单元名。Mode项可以选
择打开方式——可编辑状态或者只读状态。
图 1-2-3 Open File窗口
Exit项退出Cadence软件包。
二.Tools菜单
在Tools菜单下,主要的菜单项有Library Manager、Library Path Editor等。
Library Manager项打开的是库管理器(Library Manager)窗口,如图1-2-4所示。
图 1-2-4 Library Manager窗口
在窗口的各部分中,分别显示的是Library、Category、Cell、View相应的内容。双击需
要打开的view名(或同时按住鼠标左右键从弹出菜单中选择Open项)即可以打开相应的
文件。同样在library manager中也可以建立library和cell。具体方法是点击file,在下拉菜
单中选择library或cell即可。
Library Path Editor项打开的是Library Path Editor窗口,如图1-2-5 所示。
从File菜单中选择Add Library项,填入相应的库名和路径名,即可包括入相应的库。
图 1-2-5 Library Path Editor窗口
三.Technology File菜单
这个菜单中的最后一项Edit Layers 可以使用在版图编辑中,用来修改原始图层的一
些属性。
§ 1-3
编辑可进行SPICE模拟的单元文件
选择主窗口的File→Open→Open file,打开相应的文件,即进入了Composer-Schematic
Editing窗口,如图1-3-1所示。窗口左边的按钮分别(从上到下)为Check and Save(检查并
存盘)、Save(存盘)、Zoom out by 2(放大两倍)、Zoom in by 2(缩小两倍)、Stretch(延
伸)、Copy(拷贝)、Delete(删除)、Undo(取消)、Property(属性)、Component(加元件)、
Wire(Narrow)。(画细线) 、Wire(Wide)(画粗线) 、Pin(管脚)、Cmd options、Repeat(重
复),这些分别可以在菜单中找到相应的菜单项
图 1-3-1 Composer-Schematic Editing窗口
选择Add/Component菜单,打开相应添加元件的窗口,如图1-3-2所示。点击Browse,
会弹出library manager窗口,一些常用的元器件都在Analoglib库中。 View Name一般选择
symbol,instance Names不用自己填,系统会自己加上去 。添加完元件后需设定元件的模型
名称(如果必须的话)以及一些参数的值,特别是mos管和三极管,一定要填model name,
图
1-3-2 添加元件窗口
否则在模拟时会出错(我们一般使用华晶的元件model)。填好后,就可以将元件添加到
Editing的编辑窗口中去了。其它的一些连线、移动、删除、复制的操作和一般的EDA工具
差不多,这儿就不一一再说了。还有一点要提到的是,对于交叉相连的两条线,系统会有警
告,可对连线稍作修改去除这个警告。
注:
以下是一些常用的快捷键:
i——添加元件,即打开添加元件的窗口;
[——缩小两倍;
]——扩大两倍;
w——连线(细线);
f——全图显示;
p——查看元件属性。
从一种状态转为另一种状态,按escape,或直接点击图标或使用快捷键。
为了使电路图更加明了,一般在电路的输入输出部分加上pin脚。这在后面的例子中将会提
到。
§ 1-4
模拟的设置(重点)
Composer-schamatic界面中的Tools→Analog Artist项可以打开Analog Artist Simulation
图 1-4-1 Analog Artist Simulation窗口
窗口,如图1-4-1 所示。这是模拟时用到的主要工具,接下去主要介绍一下有关的内容。
一. Session菜单
包括Schematic Window、Save State、Load State、Options、Reset、Quit等菜单项。Schematic
window项回到电路图;Save State项打开相应的窗口,保存当前所设定的模拟所用到的各种
图1-4-2 Save State 窗口
参数。如图1-4-2所示。窗口中的两项分别为状态名和选择需保存的内容。
Load State打开相应的窗口,加载已经保存的状态。
Reset重置analog artist。相当于重新打开一个模拟窗口。
二.Setup菜单
包括Design、Simulator/directory/host、Temperature、Model Path等菜单项:
Design项选择所要模拟的线路图。
Simulator/directory/host项选择模拟使用的模型,系统提供的选项有CdsSpice、HspiceS、
SpectreS等等。我们一般用到的是CdsSpice和SpectreS。其中采用SpectreS进行的模拟更加
精确。下面我们只以这两种工具为例说明。
Temperature 打开如图1-4-3的窗口,可以设置模拟时的温度。
图 1-4-3 温度设置窗口
Model Path打开如图1-4-4的窗口,设置元件模型的路径。系统会自动在所设定的路径
下寻找器件model name对应的model模型。
图1-4-4 模型路径设置窗口
三.Analyses菜单
选择模拟类型。在cdsSpice下有ac、dc、tran、noise四个选项,分别对应的是交流分
析、直流分析、瞬态分析和噪声分析。我们知道:交流分析是分析电流(电压)和频率之间
的关系,因此在参数范围选择时是选择频率。直流分析是分析电流(电压)和电流(电压)
间的关系。Tran分析是分析参量值随时间变化的曲线。他们分别的窗口如下图所示。其设
置很直观,这里就不在赘述。
图 1-4-5 瞬态分析设置
图1-4-6 交流分析设置
图1-4-7 直流分析设置
而在spectreS中,可供选择的分析类型有很多,常用的还是ac、dc、tran和noise,不
过它们设置与cdsSpice不同。Tran的设置只需填入模拟停止时间即可。 ac和dc分析的设
置则更具特点:spectreS提供了变量扫描功能(和参量扫描有些类似),其中可供选择的变
量(parameter)有frequency(ac分析)、temperature、component parameter和model parameter。
以下一一说明:在ac分析扫描频率(常规分析)时,只需填入起始频率和终止频率即可。
而在扫描其他参数时,必须将整个电路固定在一个工作频率(at frequency)上,然后进行其
它选择。要进行component parameter扫描时,先点击select component,然后在电路图上选
择所需扫描的器件,这时会弹出一个列有可供扫描参量名称的菜单,在其上选择即可。进行
model parameter扫描时只需填入model name和parameter name即可。当然,以上扫描都免
不了要填写扫描范围,就不多说了。以下是一些图示:
四.Variables菜单
包括Edit等子菜单项。Edit项打开如图1-4-5的窗口。可以对变量进行添加、删除、查找、
复制等操作。变量(variables)既可以是电路中元器件的某一个参量,也可以是一个表达式。
变量将在参量扫描(parametric analysis)时用到,以下会提到。
图 1-4-5变量编辑窗口
五.其它有关的菜单项
1)Tools/Parametric Analysis子菜单可以打开如图1-4-6的窗口。它提供了一种很重要
的分析方法——参量分析的方法,也即参量扫描。可以对温度,用户自定义的变量
(variables)进行扫描,从而找出最合适的值。以下详细说明:
图 1-4-6 参量分析窗口
参量扫描
在模拟中,如果对某一元件的参数大小不确定,不知值取多大可以得到最优的结果时,
可以将该参数设为变量,进行变量扫描,比较输出结果,从而确定参数的值。另外,对系统
变量也可以进行扫描,如温度变量(temp)。
步骤:
a.在Edit Variables窗口中添加新的变量,如是对系统变量(如温度)扫描,就略去这一步;
b.在Parametric Analysis窗口(如图1-4-5所示)中,填入变量名称(温度变量是temp),
设定扫描范围以及步长等。也可以点击setup,在pick name for variables的弹出菜单中
选择所需扫描的参量(除系统参量外,菜单中所列举的都是variables中设置的变量)。
其实这个工作和我们前面提到的spectreS中的变量扫描很象,不过它更加完备(因为可
以对一个表达式进行扫描),所以读者应当将两种方法都掌握。
然后运行Analysis菜单下的start子菜单,开始模拟,模拟结果会在
Waveform窗口中显示。
2) Outputs/To be plotted/selected on schematic子菜单用来在电路原理图上选取要显示的
波形(点击连线选取节点电压,点击元件端点选取节点电流),这个菜单比较常用。
当然我们需要输出的有时不仅仅是电流、电压,还有一些更高级的。比如说:带宽、
增益等需要计算的值,这时我们可以在Outputs/setup中设定其名称和表达式。在运
行模拟之后,这些输出将会很直观的显示出来。举个例子:标识3db的点,我们用
到的表达式如下:bandwidth(VF(“/Out),3,“low”)。需要注意的是:表达式一般
都是通过计算器(caculator)输入的。Cadance自带的计算器功能强大,除了输入
一些普通表达式以外,还自带有一些特殊表达式,如bandwidth、average等等。本
文在最后会对计算器作介绍。
下面介绍一下analog artist窗口的情况,在Analog Artist窗口中靠右的一列按钮分别是:
Choose Design:选择模拟的电路;
Choose Analyses(选择模拟的类型):瞬态模拟、直流模拟或交流模拟;
Edit Variables(变量编辑):打开变量编辑窗口;
Setup Outputs:输出设置;
Delete:删除变量等;
Run Simulation:开始模拟;
Stop Simulation:停止模拟;
Plot Outputs:波形输出。
§ 1-5
模拟结果的显示以及处理
在模拟有了结果之后,如果设定的output有plot属性的话,系统会自动调出waveform
窗口,并显示outputs的波形。如图1-5-1 所示。
图1-5-1 波形显示窗口
其左边的一列按钮分别为:
Delete(删除):删除图中的某个波形;
Move(移动):移动某个波形的位置,可以把几个波形叠加在一个坐标轴下;点击该按
钮,然后点击需要移动的波形,再在目的地点击左键,即可完成移动操作;
Undo(取消):取消前一次操作;
Crosshair MarkerA、 Crosshair MarkerB:十字标志A和B;
Calculator(计算器):计算器工具(可以对输出波形进行特定的处理 );
Switch Axis Mode(坐标轴模式切换):同一坐标显示所有波形或分别在各自的坐标下显
示;
Add Subwindow:添加子窗口。
§ 1-6
一个例子——D触发器
1、 电路图的输入
这是一个带R清零端(低电平有效)的D触发器,由20个MOS管组成,其中NMOS
管和PMOS 管各为10个,组成四个传输门、两个反门和两个与非门。
具体的电路如图1-6-1
图 1-6-1 D触发器电路图
D触发器真值表
D Q
时钟(clk)
0 X Q
1 0 0
1 1 1
其中的一些参数设置如下:
传输门的PMOS:W——30μ,L——3μ; model:hj3p(在models目录下)
NMOS:W——15μ,L——3μ; model:hj3n;
与非门的PMOS:W——30μ,L——3μ;
NMOS:W——30μ,L——3μ;
非门的PMOS:W——30μ,L——3μ;
NMOS:W——15μ,L——3μ;
电源直流电压:5.7V;
R端的信号源(R):
cellname——vpwl;
Number of pairs of points——3(信号源波形上有三个转折点);
Time 1——0s;
Voltage 1——0V;
Time 2——100μs;
Voltage 2——0V;
Time 3——105μs;
Voltage 3——5V;
Delay time——500ns;
时钟信号(clk): 时钟信号的反(clkbar):
cellname——vpulse; cellname——vpulse;
Voltage 1——0V; Voltage 1——5V;
Voltage 2——5V; Voltage 2——0V;
Delay time——5μs; Delay time——5μs;
Rise time——5μs; Rise time——5μs;
Pulse time——100μs; Pulse time——100μs;
Period time——200μs; Period time——200μs;
D端输入(D):
cellname——vpulse;
Voltage 1——0V;
Voltage 2——5V;
Delay time——5μs;
Rise time——5μs;
Pulse time——100μs;
Period time——200μs;
瞬态分析设置如下:
From:0 to:1ms by:1μs
得到的波形如图1-6-2所示:
图 1-6-2 cdsSPICE模拟结果1
可以看到模拟的结果符合D触发器的逻辑。但是有一个问题出现了,注意到我们所设
的时间是从0
→1ms,但是输出的模拟结果到600μs左右就截止了,这是和模拟的工具有关。
为了得到较好的模拟结果,可以换一种工具——spectreS来完成模拟。
在Analog Artist Simulation窗口中选Setup下的Simulator/directory/host子菜单,出现如
图1-6-3的设置窗口。在Simulator项中选择spectreS工具。然后在Choosing Analyses弹出
的设置窗口中设定stop time为1ms,模拟的结果如图1-6-4所示,将得到一个很好的结果。。
图 1-6-3 选择模拟工具窗口
图1-6-4 spedtreS模拟结果
§ 1-7
分模块模拟(建立子模块)
在电路越来越复杂的情况下,如果再花时间去建立一个象D触发器这样复杂的
schamatic,明显会使工作更繁复。因此我们在建立了一个子电路后,可以将其看作一个整
体,建立一个模块,即建立一个symbol(view name),放在用户自己库里的作为一个器件
(component)来用。
下面通过子模块非门的建立,来说明这一内容。
在Library Manager中分别建立非门not(cell)的schematic(view)和symbol(view),如图
1-7-1(a) 和1-7-1(b)所示。两者的PIN的名称必须一致,这样才能建立起一一对应的关系。
图 1-7-1(a) 图 1-7-1(b)
建立symbol(view)的步骤:
在Library Manager中新建cell,在如图1-2-2的窗口的Tool项选择Composer-symbol,
即建立的是symbol(view);
用子菜单Add/Shape/Line和Add/Shape/Circle的命令画出如右图的形状;
用子菜单Add/label的命令添加标签[@instanceName];
用子菜单Add/Selection Box命令添加选择框。
另一种建立symbol(view)的方法是:打开not(cell)的schematic(view),用子菜单
Design/Create Cellview/From Cellview命令。出现以下的窗口,如图1-7-2
图 1-7-2 从一个view建立另一个view
输入相应的名称后,单击OK,就出现如图1-7-3的选项窗口。其建立的symbol如图
1-7-4所示,如果不是建立有常用符号的子模块,如与门,非门等逻辑门,这种方法是较快
的。
图 1-7-3 建立symbol的选项窗口
图 1-7-4 第二种方法建立的symbol图形
这样就建立了一个最简单的子模块——非门。在模拟过程中,就可以通过添加元器件
(component)来直接将非门加到电路中来,而不用具体画出其内部的结构,这实际上就是
以一个简单的symbol来代替其内部的复杂结构。以此类推,可以将小模块一步步的拼凑成
大的模块,直接用于模拟仿真。有一点要注意的是:对于有源器件(如非门)建立symbol,
必须在原始电路图上添加analoglib中的源和地,而且源的电压值也需要设定好,否则变为
symbol搭成电路后会出错。当然用于模拟时设定的激励源是不用加在电路图中的
§ 1-8
其它的一些内容
计算器
计算器有两种格式,一种是代数格式,另一种RPN(逆波兰)格式。有时需要对Waveform
窗口中显示的波形进行处理,如改变坐标轴的单位(将电压单位改成分贝形式等),比较两
个量的差值(显示两个电压的差)。所有的这些可以用Calculator工具来实现,如图1-8-1所
示。
除了常规的计算以外,计算器还可以完成波形处理等工作。下面就简单地介绍一下常用
的内容。
图 1-8-1 计算器工具
图1-8-1中显示的是逆波兰模式。菜单Options/set Algebraic或set RPN可以切换模式。
Calculator窗口中的按钮可以分为下面几个部分:
1. 功能键(选择、打印波形曲线,绘波形图);
2. 常规计算器键盘;
3. 函数键。
下面分别介绍他们的功能。
一.功能键:
1. browser:打开结果浏览窗口(Result Browser)。它有如下作用:
。观察模拟波形和文本结果
。绘制波形
。将波形表达式直接拷入计算器窗口中
、family:从波形窗口(waveform Window)中选择所要处理的曲线波形。Wave
是选择单一的波形,family是选择一组波形(如参数扫描得到的曲线簇)。
、plot:在波形窗口(waveform Window)中绘制曲线波形。Erplot 是先擦除原
先的波形,然后再绘出新的曲线波形;plot是直接在原波形窗口中追加新的曲线波形。
s、print:打印曲线波形抑或是显示测量的数值。
5.电原理图表达式键:在电原理图中选择需要处理的数据(如电压、电流)具体如下表
所示。
vt it
瞬态电压 瞬态电流
vf if
频率电压 频率电流
vs is
源扫描电压 源扫描电流
vdc op
直流电压 直流工作点
vn opt
噪声电压 瞬态工作点
var mp
变量 模型参数
二.常规计算器键盘:
这部分和常规计算器的键盘基本相同,除了少数几个键,如undo键。对于逆波兰模式,
其输入形式需遵循逆波兰表达式的格式。先介绍几个键:lastx:上次buffer(显示窗口)中
的数值或变量、x<>y:buffer中的值与stack1(堆栈1)的值互换、dwn:下压堆栈、up:
堆栈弹出、clear:清除buffer中的值、clst:将buffer和stack中的所有值都清除。下面举个
例子:输入(1+x)/x。其输入步骤为:1,enter,clear,x,+,lastx,/
三.函数键
1. 常规函数键:
如下表所示。
三角函数 Sin,cos,tan,sinh,cosh,tanh,asin,acos,atan,asinh,acosh,atanh
Mag
phase
real
imag
Ln、log10、dB10、dB20、exp、10**x、y**x、x**2、
abs、int、1/x、squrt
自定义函数 F1、F2、F3、F4
2. 特殊函数键:
在special function的下拉框中有下列函数,如表所示。
函数名 说明
Ishift
X轴位移
Clip
在clip函数限制的范围内画波形
convolution
取两个波形的卷积
Eex
指数函数
Frequency
估计周期(准周期)波形的周期
其他常规函
数
幅度
相位
实部
虚部
常规算术函数
增益带宽积
增益裕量
相位裕量
上升时间
摆率
带宽
下面将举例说明计算器波形处理功能的应用。如已得到如图1-8-2的电压的交流响应波
形图,要计算它的-3dB带宽。
步骤如下:
1) 点击左边的wave键,然后在波形图中点击波形,在计算器的显示窗口中就会显示
出该波形的名称;
2) 在special function的下拉框中选择bandwidth,得到如下窗口,在Db处填3,在Type
处选择low(表示低通,high表示高通,band表示带通),然后ok。
GainBWprod
Gain Margin
Phase Margin
Rise Time
Slew Rate
bandwidth
3) 点击erplot键,就可以在waveform窗口得到结果如图1-8-3所示。
处理波形:
4) 点击左边的wave键,然后在电路原理图中选中所需要的波形,拖至计算器的命令
行处,此处就会显示该波形的名称;
5) 再结合右边的函数键,得到想要的表达式。如要得到分贝的形式,就点击dB10或
dB20的键。
6) 点击左边的plot键,就可以在waveform窗口得到结果。
1-8-2 交流响应波形图
图1-8-3 db表示图
第二章.
Virtuoso Editing的使用简介
全文将用一个贯穿始终的例子来说明如何绘制版图。这个例子绘制的是一个最简单的非
门的版图。
§ 2-1
建立版图文件
使用library manager。首先,建立一个新的库myLib,关于建立库的步骤,在前文介绍
cdsSpice时已经说得很清楚了,就不再赘述。与前面有些不同的地方是:由于我们要建立的
是一个版图文件,因此我们在technology file选项中必须选择compile a new tech file,或是
attach to an exsiting tech file。这里由于我们要新建一个tech file,因此选择前者。这时会弹出
load tech file的对话框,如图2-1-1所示。
图2-1-1
在ASCII Technology File中填入即可。接着就可以建立名为inv的cell了。
为了完备起见,读者可以先建立inv的schematic view和symbol view(具体步骤前面已经介
绍,其中pmos长6u,宽为0.6u。nmos长为3u,宽为0.6u。model 仍然选择hj3p和hj3n)。
然后建立其layout view,其步骤为:在tool中选择virtuoso-layout,然后点击ok。
§ 2-2
绘制inverter掩膜版图的一些准备工作
首先,在library manager中打开inv这个cell的layout view。即打开了virtuoso editing窗
图2-2-1 virtuoso editing窗口
口,如图2-2-1所示。
版图视窗打开后,掩模版图窗口显现。视窗由三部分组成:Icon menu , menu banner , status
banner.
Icon menu (图标菜单)缺省时位于版图图框的左边,列出了一些最常用的命令的图标,
要查看图标所代表的指令,只需要将鼠标滑动到想要查看的图标上,图标下方即会显示出相
应的指令。
menu banner(菜单栏),包含了编辑版图所需要的各项指令,并按相应的类别分组。几
个常用的指令及相应的快捷键列举如下:
Zoom In -------
放大 (z)
Save -------
保存编辑(f2)
Undo -------
取消编辑(u)
Move -------
移动(m)
Rectangle -------
编辑矩形图形(r)
Path ------- 编辑布线路径(p)
Zoom out by 2-------
缩小2倍(Z)
Delete -------
删除编辑(Del)
Redo -------
恢复编辑 (U)
Stretch -------
伸缩(s)
Polygon -------
编辑多边形图形(P)
Copy -------
复制编辑 (c)
status banner(状态显示栏),位于menu banner的上方,显示的是坐标、当前编辑指
令等状态信息。
在版图视窗外的左侧还有一个层选择窗口(Layer and Selection Window LSW)。
LSW视图的功能:
1) 可选择所编辑图形所在的层;
2) 可选择哪些层可供编辑;
3) 可选择哪些层可以看到。
由于我们所需的部分版图层次在初始LSW中并不存在,因此下一步要做的是:建立我们
自己的工艺库所需的版图层次及其显示属性。为了简单起见,以下仅列出绘制我们这个版图
所需的最少版图层次。
层次名称 说明
Nwell
Active
Pselect
Nselect
Contact
Metal1
Via
Metal2
Text
Poly
N阱
有源区
P型注入掩膜
N型注入掩膜
引线孔,连接金属与多晶硅/有源区
第一层金属,用于水平布线,如电源和地
通孔,连接metal1和metal2
第二层金属,用于垂直布线,如信号源的I/O口
标签
多晶硅,做mos的栅
下图是修改后的LSW。
图2-2-2 LSW
如何来修改LSW中的层次呢?以下就是步骤:
1. 切换至CIW窗口,在technology file的下拉菜单中选择最后一项edit layers出现如图窗
口
图2-2-3 edit layers
2. 在technology library中选择库mylib,先使用delete 功能去除不需要的层次。然后点击
add添加必需的层次,add打开如下图的窗口:
图2-2-4
其中,layer name中填入所需添加的层的名称。Abbv是层次名称缩写。Number是系统给层
次的内部编号,系统保留128-256的数字作为其默认层次的编号而将1-127留给开发者创
造新层次。Purpose是所添加层次的功用,如果是绘图层次,一般选择drawing。Priority是
层次在LSW中的排序位置。其余的选项一般保持默认值。在右边是图层的显示属性。可以
直接套用其中某些层次的显示属性。也可以点击edit resources自己编辑显示属性。如图2-2-5
所示(这个窗口还可以在LSW中调出) 编辑方法很简单,读者可以自己推敲,就不再赘
述。上述工作完毕后就得到我们所需的层次。接着我们就可以开始绘制版图了。
§ 2-3
绘制版图
一.画pmos的版图(新建一个名为pmos的cell)
1. 画出有源区
在LSW中,点击active(dg),注意这时LSW顶部显示active字样,说明active层
为当前所选层次。然后点击icon menu中的rectangle icon,在vituoso editing窗口中
画一个宽为3.6u,长为6u的矩形。这里我们为了定标,必须得用到标尺。点击
misc/ruler即可得到。清除标尺点击misc/clear ruler。如果你在绘制时出错,点击需
要去除的部分,然后点击delete icon。
2. 画栅
在LSW中,点击poly(dg),画矩形。与有源区的位置关系如下图:
0.6u 0.6u(gate length)
6u(gate width)
1.5u
3.6u
图2-2-5 display resource editor
3.画整个pmos
为了表明我们画的是pmos管,我们必须在刚才图形的基础上添加一个pselect层,这一层
将覆盖整个有源区0.6u。接着,我们还要在整个管子外围画上nwell,它覆盖有源区1.8u。
如下图所示:
pselect
00.6u0.6u
1.8u
nwell
4.衬底连接
pmos的衬底(nwell)必须连接到vdd。首先,画一个1.2u乘1.2u的active矩形;然后
在这个矩形的边上包围一层nselect层(覆盖active0。6u)。最后将nwell的矩形拉长,完成
后如下图所示:
nselect
active
pselect
这样一个pmos的版图就大致完成了。接着我们要给这个管子布线。
二.布线
pmos管必须连接到输入信号源和电源上,因此我们必须在原图基础上布金属线。
1. 首先我们要完成有源区(源区和漏区)的连接。在源区和漏区上用contact(dg)层
分别画三个矩形,尺寸为0.6乘0.6。注意:contact间距为1.5u。
2. 用metal1(dg)层画两个矩形,他们分别覆盖源区和漏区上的contact,覆盖长度为
0.3u。
3. 为完成衬底连接,我们必须在衬底的有源区中间添加一个contact。这个contact每
边都被active覆盖0.3u。
4. 画用于电源的金属连线,宽度为3u。将其放置在pmos版图的最上方。
布线完毕后的版图如下图所示:
图2-3-1 pmos版图
通过以上步骤我们完成了pmos的版图绘制。接下来我们将绘制出nmos的版图。
三.画nmos的版图
绘制nmos管的步骤同pmos管基本相同(新建一个名为nmos的cell)。无非是某些参
数变化一下。下面给出nmos管的图形及一些参数,具体绘制步骤就不再赘述。
3.6u
0.6u
0.6u 3u
3u
图2-3-2nmos版图
四.完成整个非门的绘制及绘制输入、输出
1. 新建一个cell(inv)。将上面完成的两个版图拷贝到其中,并以多晶硅为基准将两
图对齐。然后,我们可以将任意一个版图的多晶硅延长和另外一个的多晶硅相交。
2. 输入:为了与外部电路连接,我们需要用到metal2。但poly和metal2不能直接相
连,因此我们必须得借助metal1完成连接。具体步骤是:
a. 在两mos管之间画一个0.6乘0.6的contact
b. 在这个contact上覆盖poly,过覆盖0.3u
c. 在这个contact的左边画一个0.6乘0.6的via,然后在其上覆盖metal2(dg),
过覆盖0.3u
d. 用metal1连接via和contact,过覆盖为0.3u
从下图中可以看得更清楚:
via contact
metal2
metal1
poly
3. 输出:先将两版图右边的metal1连起来(任意延长一个的metal1,与另一个相交)。
然后在其上放置一个via,接着在via上放置metal2。
五.作标签
1. 在LSW中选择层次text(d3),点击create/label,在弹出窗口中的
label name中填
入vdd!并将它放置在版图中相应的位置上。
2. 按同样的方法创制gnd!、A和Out的标签。完成后整个的版图如下:
图2-3-4 非门的版图
至此,我们已经完成了整个非门的版图的绘制。下一步将进行DRC检查,以检查版图在绘
制时是否有同设计规则不符的地方。
第三章 Diva验证工具使用说明
版图绘制要根据一定的设计规则来进行,也就是说一定要通过DRC(Design Rule
Checker)检查。编辑好的版图通过了设计规则的检查后,有可能还有错误,这些错误不是
由于违反了设计规则,而是可能与实际线路图不一致造成。版图中少连了一根铝线这样的小
毛病对整个芯片来说都是致命的,所以编辑好的版图还要通过LVS(Layout Versus
Schematic)验证。同时,编辑好的版图通过寄生参数提取程序来提取出电路的寄生参数,
电路仿真程序可以调用这个数据来进行后模拟。下面的框图可以更好的理解这个流程。
图 3-0-1 IC后端工作流程
验证工具有很多,我们采用的是Cadence环境下集成的验证工具集DIVA。下面先对
DIVA作一个简单介绍。
DIVA是Cadence软件中的验证工具集,用它可以找出并纠正设计中的错误:它除了可
以处理物理版图和准备好的电气数据,从而进行版图和线路图的对查(LVS)外。还可以在
设计的初期就进行版图检查,尽早发现错误并互动地把错误显示出来,有利于及时发现错误
所在,易于纠正。
DIVA工具集包括以下部分:
1. 设计规则检查(iDRC)
2. 版图寄生参数提取(iLPE)
3. 寄生电阻提取(iPRE)
4. 电气规则检查(iERC)
5. 版图与线路图比较程序(iLVS)
需要提到的是:Diva中各个组件之间是互相联系的,有时候一个组件的执行要依赖另
一个组件先执行。例如:要执行LVS就先要执行DRC。在Cadence系统中,Diva集成在版
图编辑程序Virtuoso和线路图编辑程序Composer中,在这两个环境中都可以激活Diva。要
运行Diva前,还要准备好规则验证的文件。可以把这个文件放在任何目录下,这些规则文
件的写法下面专门会进行说明,也会给出例子。这些文件有各自的默认名称,如:做DRC
时的文件应以命名,版图提取文件以命名。做LVS时规则文件应
以命名。
§ 3-1 DRC规则文件的编写
仍旧以前面的非门为例,我们制定了以下规则:
1.a n阱(well) n阱的最小宽度
1.b 阱与阱之间的最小间距
1.c ndiff到nwell的最小间距
1.d pdiff到nwell的最小间距
1.e p mos 器件必须在nwell内
2.a 有源区(active) 有源区的最小宽度
2.b 有源区之间的最小间距
3.a 多晶硅(poly) 多晶硅的最小宽度
3.b 多晶硅间的最小宽度
3.c 多晶硅与有源区的最小间距
3.d 多晶硅栅在场区上的最小露头
3.e 源、漏与栅的最小间距
4.a 引线孔(contact) 引线孔的最小宽度
4.b 引线孔间的最小间距
4.c 多晶硅覆盖引线孔的最小间距
4.d metal1覆盖引线孔的最小间距
5.a 金属1(metal1) 金属1的最小宽度
5.b 金属1间的最小间距
6.a 金属2(metal2) 金属2的最小宽度
6.b 金属2间的最小间距
6.c 金属2的最小挖槽深度
7.a 通孔(via) 通孔的最小宽度
7.b 通孔间的最小间距
7.c 通孔与引线孔间的最小间距
7.d metal1覆盖通孔的最小间距
4.8u
1.8u
0.6u
1.8u
1.2u
1.2u
0.6u
0.6u
0.6u
0.6u
0.6u
0.6u
0.9u
0.3u
0.3u
1.2u
0.9u
1.2u
1.2u
1.2u
0.6u
0.9u
0.6u
0.3u
7.e metal2覆盖通孔的最小间距 0.3u
7.f 通孔与多晶硅的最小间距 0.3u
结合上述规则,我们就可以编写出相应的DRC规则检查文件(见附录1),取名为
。这个文件的第一部分是层次处理,用于生成规则文件中所要应用到的层
次(可以是原始层或是衍生层)。例如:nwell=geomOr("nwell"),(在文件中引用到的所
有原始物理层次都要用双引号括起来)这一句的目的是在后面应用到nwell这个原始物
理层次时,不需要再用引号括起来,前面几句都是这个意思。后面四句则生成版图验证
中必须的一些层次。有一点需要注意的是:在geomOr的关键字和“(”之间不能出现
空格,nwell=geomOr (“nwell”)的写法系统在编译时会报错。
下面这个语句相当于一个条件转移语句,当有drc命令时,执行下面的规则,否则跳
转到下一个命令。
ivIf( switch( "drc?" ) then
在设计规则检查中,主要的语句就是drc()了。先简单介绍一下这个语句的语法。
[outlayer]=drc(inlayer1 [inlayer2] function [modifiers] )
outlayer表示输出层,如果定义(给出)输出层,则通过drc检查的出错图形就可以保
存在该输出层中。此时,如果没有modifiers选项,则保存的是原始的图形。如果在modifiers
选项中定义了修改方式,那么就把修改后的结果保存在输出层中。如果没有定义outlayer
层,出错的信息将直接显示在出错的原来层次上。
Inlayer1和inlayer2代表要处理的版图层次。有些规则规定的是只对单一层次的要求,
比如接触孔的宽度,那么可以只有inlayer1。而有些规则定义的是两个层次之间的关系,如
接触孔和铝线的距离,那么要注明两个层次。
Function中定义的是实际检查的规则,关键字有sep(不同图形之间的间距), width
(图形的宽度), enc(露头), ovlp(过覆盖), area(图形面积), notch(挖槽的宽度)
等。关系有>, <, >=, <=, ==等。结合起来就是:sep<3, width<4, 1 例如:drc(nwell width < 4.8 "Minimum nwell width =4.8")。在此例中,没有outlayer 的定义,也没有modifiers的定义,所以发现的错误都直接显示在nwell层上。例子中,inlayer 就是nwell,检查的只是n阱层的规则。function是width<4.8,表示n阱宽度小于4.8微米。 所以上面这句的执行结果就是把n阱层中宽度小于4.8u的图形当做错误输出。后面引号中的 信息起到说明提示作用,需要时可以查询,对查错没有实际意义。同样需要注意的是:在drc 和“(”之间同样不能有空格,否则系统会提示没有drc语句。从上面讨论不难看出,DIVA 规则文件的编写对格式有一定要求。 在规则文件中我们还可以看到saveDerived语句,如:saveDerived(geomAndNot(pgate nwell) "p mos device must in nwell"),这一句将输出不在nwell内部的pgate(pmos), 这种写法在规则文件的编写中经常碰到,要熟练掌握。 另外,在DRC文件中,引号引出的行是注释行。 以上就是对DRC文件编写的一些简单介绍,对于其中使用的关键字,作者有专门的说明 文章,同时在本文后面作者还会给出一个完整的DRC校检文件并给出详细说明,读者可以参 照它,以加深对文件编写的理解。 § 3-2 版图提取文件的介绍 上面已经提到,通过DRC验证的版图还需要进行LVS也就是版图和线路图对查比较。实际 上就是从版图中提取出电路的网表来,再与线路图的网表比较。那么如何提取版图网表呢? 这里我们就要使用到DIVA的extract文件。下面是它的简单介绍: 首先,同DRC一样,extract文件的最开始同样是这样一条语句: ivIf(switch(“extract?”) then 它相当于一个条件转移语句,当有extract这个命令时,执行下面的规则,否则跳转到另外 的循环。 接着,extract文件中要进行的是层次定义,它一般分为三个步骤: 1. 识别层定义(recognition layer) 2. 终端层定义(terminal layer) 3. 伪接触层定义(psuedo_contact layer) 然后是定义层次间的连接关系,使用geomConnect语句将版图间的不同层次连接起来(一个 extract文件只能有一个geomConnect语句),构成完整的网表。例如句子: geomConnect( via(contact psd nsd poly metal1) via(via metal1 metal2) ) 其中,via语句的作用是使用连接层连接任意数目的层次,但要注意的是:一个via语句中只 能出现一个连接层。但在geomConnect语句中via语句可以出现的次数不限。以上语句表示: 在有contact的地方,psd nsd poly metal1 是相互连接的。在有via 的地方metal1和metal2 相连,注意后一个via和前一个的意义不同。 上述工作完成之后,我们接着要进行的工作是器件的提取(device extraction)。使 用extractDevice语句。extractDevice 语句定义电路中用到的元器件,这是提取文件中的 关键语句。语法说明如下: extractDevice( reclayer termlayer model physical ) 其中reclayer是识别层,它应该是后来通过逻辑关系生成的提取层,这个层上的每一个图形 都会被当作是一个元器件。 Termlayer是端口层,它表示的是元器件的端口,一定要是可以连接的层次。具体的端口定 义因元器件而异。 Model指的是元器件的类型,与端口要对应。例如下两句: extractDevice( pgate (GT "G")(psd "S" "D")(NT "B")"pfet ivpcell" ) extractDevice( ngate (GT "G")(nsd "S" "D")(pwell "B")"nfet ivpcell" ) 分别提取出pmos管和nmos管。 接着很重要的一步是器件尺寸测量,使用measureParameter语句,例如: w1=measureParameter(length (ngate butting nsd) .5) 这一句测量的是nmos的沟道宽度,注意后面的.5必须加上,否则测出的将是两倍的沟道宽度。 下面使用saveInterconnect 这个命令把连接的层次写到提取出来的网表中,以便在做 LVS时,可以与线路图中的网表互相对比。 saveInterconnect( nsd psd poly contact metal1 ) saveRecognition 这个命令将提取产生的可以识别的图形保存下来。通常和 extractDevice语句中的识别层一致。 saveRecognition( ngate "ngate" ) saveRecognition( pgate "pgate" ) 以上就是对extract文件的一个简要介绍,读者可以参看附录中完整的例子,以加深对它的 理解。 § 3-3 LVS文件的介绍 接下来,就是LVS检查了。在diva中,由于版图提取在extract中就已经完成,LVS文件 中的逻辑结构相对就比较简单。只需进行网表比较,参数比较,以及把一些“并联或串联” 的元器件归并等即可。所以这一部分文件不会因为工艺层次不同而有很大不同,可以根据范 本做少许改动。 以下只介绍一下LVS的基本结构: lvsRules( procedure(mosCombine(value1,value2) ……. ) Procedure(mosCompare(lay,sch) ……. ) permuteDevice(parallel “pmos” mosCombine) compareDeviceProperty(“pmos” mosCompare) ) 至于例子,读者可以参考附录。 § 3-4 Diva的用法 一.DRC的说明 编辑好的验证文件都存在..exporthomewmymyLib下,文件名分别是 、、。有了这三个文件就可以进行版图验证了。下面 将以一个非门为例子来进行说明。 在编辑版图文件的同时就可以进行DRC检查。在virtuoso版图编辑环境中。单击Verify 菜单,上面提到的DIVA工具都集成在这个菜单下。先介绍设计规则检查DRC,单击第一个子 图3-4-1 DRC菜单窗口 菜单DRC就会弹出DRC的对话框。如下: Checking Method指的是要检查的版图的类型。 Flat 表示检查版图中所有的图形,对子版图块不检查。(与电路图中类似,最上层电路 由模块组成,而模块由小电路构成。有些复杂的版图也是如此) Hierarchical利用层次之间的结构关系和模式识别优化,检查电路中每个单元块内部是 否正确。 hier w/o optimization 利用层次之间的结构关系而不用模式识别优化,来检查电路中每 个单元块。 Checking Limit 可以选择检查哪一部分的版图 Full 表示查整个版图 Incremental 查自从上一次DRC检查以来,改变的版图。 by area 是指在指定区域进行DRC检查。一般版图较大时,可以分块检查。 如果选择这种方式后,Coordinate 这个输入框就变为可输入。可以在这个框内输入坐标, 用矩形的左下角和右上角的坐标来表示。格式为:12599:98991 115682:194485 或者先单击Sel by Cursor,然后用鼠标在版图上选中一个矩形,这个输入框也会出现相应 的坐标。如果不出现可以多选几次。 Switch Names 在DRC文件中,我们设置的switch在这里都会出现。这个选项可以方便我们对版图文件进行 分类检查。这在大规模的电路检查中非常重要。 Run-Specific Command File Inclusion Limit 上面的两项并不是必需的,可以根据默认设定。 Echo Commands 选上时在执行DRC的同时在CIW窗口中显示DRC文件。 Rules File 指明DRC规则文件的名称,默认为 Rules Library 这里选定规则文件在哪个库里。 Machine 指明在哪台机器上运行DRC命令。 local 表示在本机上运行。对于我们来说,是在本机运行的,选local。 remote 表示在远程机器上运行。 Remote Machine Name 远程机器的名字。 在填好规则文件的库和文件名后,根据实际情况填好Checking Method 和Checking Limit就可以单击OK运行。这时可以在CIW窗口看到运行的信息,同时在版图上也会出现发 亮的区域(如果有错误)。 错误在版图文件中可以看到,另外也可以选择Verify-Markers-Find菜单来帮助找错。单 击菜单后会弹出一个窗口,在这个窗口中单击apply就可以显示第一个错误。这个窗口较简 单,大家看一下,再试几次就可以了。 同样,可以选择Verify-Markers-Explain来看错误的原因提示。选中该菜单后,用鼠标 在版图上出错了的地方单击就可以了。也可以选择Verify-Markers-Delete把这些错误提示删 除。 Virtuoso版图编辑环境下的菜单见图3-4-2。 图3 –4-2Virtuoso菜单 二.版图提取(Extractor)说明 为了进行版图提取,还要给版图文件标上端口,这是LVS的一个比较的开始点。在LSW 窗口中,选中metal1(pn)层,(pn)指得是引脚(pin);然后在Virtuoso环境菜单中选择 Create-Pin,这时会出来一个窗口。如下: 图3-2-3 创建版图端口窗口 填上端口的名称(Terminal Names 和Schematic中的名字一样)、模式(Mode,一般选 rectangle)、输入输出类型(I/O Type)等。至于Create Label属于可选择项,选上后,端口 的名称可以在版图中显示。 填好可以直接在版图中画上端口,往往有好几个端口,可以都画好在单击Hide。 这 些端口仅表示连接关系,并不生成加工用的掩模板,只要求与实际版图上铝线接触即可, 也没有规则可言。 版图的完成后,就可以提取了,在版图编辑环境下选择Verify –extractor 。弹出菜单如 下: 图3-2-4Extractor窗口 图3-2-5 提取出的文件 填好提取文件库和文件名后,单击OK就可以了。然后打开Library Manager,在库myLib下 nmos单元中增加了一个文件类型叫extracted的文件,可以用打开版图文件同样的方式打开 它。图3-2-5就是提取出来的版图,可以看到提取出来的器件和端口,要看连接关系的话, 可以选择Verify-probe菜单,在弹出窗口中选择查看连接关系。 版图的准备工作基本上就完成了,接下来是线路图的准备工作。线路图的准备工作相 对较简单,有几个要注意的地方:首先,在库的选用上,要用Sample库中的元件;其次,线 路图的端口名称要与版图中的端口名称一致;最后,在线路编辑完成后要进行检查,可以直 接单击左边第一个快捷键,也可以选择菜单Check--Current Cellview。 在版图和线路图的准备工作完成后就可以进行LVS了。 图3-2-6 LVS 参照图3-2-6的弹出菜单,填好规则文件的库和文件名,要进行LVS的两个网表。(其实 在LVS中比较的是两个网表,一个是schematic中,另一个是extracted,所以两个schematic文 件也可以比较,只是一般没这个必要)设置完以后单击RUN,片刻后就回弹出一个窗口表 示LVS完成或者失败。失败时可以在上面的菜单中单击Info看运行的信息再进行处理。LVS 完成后,可以在上面的弹出菜单中单击Output,这时会弹出LVS的结果。 当然,LVS完成并不是说LVS通过了,可能会有很多地方不匹配。这时要查看错误可以 在LVS窗口中单击Error Display。即可在Extracted和Schematic 中查看错误。 第四章 Cadence中Verilog 的一些使用方法 § 4-1 Verilog 的文本编辑器 随着电路规模的增大和复杂,传统的图形输入模式已不可行。语言描述电路 成为潮流。它的方便性和好的更改性、维护性在实践中得到很好的体现。尤其现 在强大的综合工具,和系统集成对核的需求性使Verilog更有用武之地。每个硬 件工程师应该学习掌握它。 在进入Cadence后在命令行中键入 textedit *.v↙ (此处*为文件名,在textedit 命令后应带上文件名) 键入上述命令后进入文本编辑框,和Windows 中常用的文本编辑框很象。 图4-1-1textedit文本编辑框界面 图中的主菜单File、View、Edit、Find及各自底下的子菜单和Windws中的 文本编辑器差不多,使用方法相似,这里就不多说了。编好程序保存可以进 行后续工作了。 § 4-2 Verilog 的模拟仿真 一.命令的选择。 在命令行中键入 verilog↙ 会出现关于此命令的一些介绍,如下: -f -v -y -c compile only -s enter interactive mode immediately -k -u convert identifiers to upper case -t set full trace -q quiet -d decompile data structure Special behavioral performance options (if licensed): +turbo speed up behavioral simulation. +turbo+2 +turbo with second level optimizations. +turbo+3 +turbo+2 with third level optimizations. +listcounts generate code for maintaining information for $listcounts +no_turbo don't use a VXL-TURBO license. +noxl disable XL acceleration of gates in all modules Special environment invocation options (if licensed): +gui invoke the verilog graphical environment 在上面的参数选择中,简单介绍几个常用的: (1)-c 首先应该保证所编程序的语法正确性。先进行语法的检查,选择参数- c键入 如下命令。 verilog –c *.v↙ 根据Cadence的报告,查找错误信息的性质和位置,然后进入文本编辑器进 行修改,再编译,这是个反复的过程,直到没有语法错误为止。 (2)-s 进入交互式的环境,人机交互运行和下面的参数联合使用。 (3)+gui & verilog 仿真有命令和图形界面两种方式。图形界面友好和windows使用很 象,很好掌握,一般都使用图形方式。 “&”符号是后台操作的意思,不影响 前台工作。如此时你可以在命令行输入其它的命令。 其它的命令参数选择比较复杂,这里就不介绍了,故我们这里常用的命令是: verilog –s *.v +gui &↙ (*代表文件名) 进入图形交互界面。 $附:命令行输入 !!↙ 是执行上一条命令, 命令行输入 !* ↙ (*代表字母) 是执行最近的以*开头的命令。 上述附注对命令输入速度提高有所帮助。 二.SimVision 图形环境。 SimVision是Verilog-XL的图形环境。 主要有SimControl、Navigator、 Signal Flow Browswer、 Wactch Objects Window 、SimWave 等窗口。 (1)SimControl 窗口 此窗口是主要的仿真控制窗口,让用户和机器进行交互式操作。执行各种 Verilog-XL命令(菜单),进行仿真、分析、调试你的设计。该窗口可以显示 设计的模块和模块,显示和设置断点、强制信号等。创建用户自己的按钮和 执行经常使用的操作。 Manu Bar ① Tool Bar② Source Browser③ 图4-2-1 SimControl 窗口界面图 Scope Region④ I/O Region⑤ Message Region⑥ 各部分简介: ①、Menu Bar 有许多的子菜单,让你执行各种模拟仿真命令。这里就不一一介绍,到使用 时,在指明其功能和所在位置。 ②、Tool Bar 各种按钮代表最常用的操作和功能,能快速对选中的物体执行各种命令。你 可以在工具条中加入自己定义的按钮,来代表常用的操作命令。使用 Option-User Buttons-Create 菜单项。用Options-User Buttons-Edit 菜 单项修改修改按钮。工具条还显示当前模拟时间,当处于交互式的模拟状态 时,会随模拟更新时间。因为工具条按钮的操作为常用操作,下面各功能详 细介绍一下。 运行模拟按钮 设置模块按钮 对对象执行操作按钮 调用其它显示窗 口按钮 显示模拟时间 a b c d e f g h i j k l m n 放用户自定义按钮 是否显示程序代码 图4-2-2 SimControl窗口中的工具条 a、Run Simulation按钮 运行模拟,若无断点直至完成,图标变为停止模拟图标。若有断点则运行到 断点对应信号再改变的位置。 b、Single Step按钮 再任何模块每按一下执行到下一个可执行行,即使在子程序中也是单步运行。 c、Step Over 按钮 在当前的模块中执行到下一个可执行行,在子程序中步单步执行,而是一步 执行完子程序。 d、Set Scope 按钮 由当前的调试模块转到被选中的模块。 e、Scope Up 按钮 由当前模块转到它的上一级模块,但若有对象被选中,不执行。 f、Show Execution 按钮 模拟时更新当前模块,显示正在模拟的模块。在当前刚执行完的代码行左边 有一个箭头 g、Set Breakpoint 按钮 设置断点,当模拟过程中被选信号变化时发生。代码左边的行号为高亮的可 设为断点,灰色则不可以。 h、Set Force 按钮 弹出一个窗口,里面有当前选中信号的名字和数值。用户可以强制信号为一 个希望值。 i、Show Value 按钮 n、程序代码是否显示的切换按钮。显示当前被选信号的数值。 以下j、k、l、m调用其它调试窗口,具体介绍放到后面。 j、打开Navigator窗口。 k、打开Watch Objects 窗口。显示被选中的对象 l、打开Singal Flow Browser窗口。把被选中的对象放到浏览器中 m、打开SimWave窗口。显示被选中对象的模拟波形。 ③、Source Browser 显示被调试的程序代码,每行左边有行号。你可以在其间选择信号和模块。这 种选择会影响其它工具的操作对象,反过来其他工具操作对象的选择也会作用于 Source Browser信号和对象的选择。可在其间设置断点,如前所说的在行号为 高亮的行可设为断点,灰色则不可以。可在Source Browser中点鼠标的右键选 择菜单进行操作。另一个对选择对象的操作是双击该对象。如双击信号得到它的 数值,双击模块则调到该模块描述处。如图4-2-2中的n字母代表的按钮,Source Browser可被关掉不显示。 ④、Scope Region 包含scope field 和subscopes field。从下拉按钮选择不同的项,跳到不 同的模块。对应的Source Browser显示该模块的代码。 ⑤、I/O Region 显示执行的命令和模拟输出的结果。你也可以直接在此键入命令执行操作。 I/O Region 也可以被关掉不显示,当点击Message Region右边的三角按钮可 切换显示与否。 ⑥、Message Region 显示模拟状态。 三.Navigator 窗口 按下和图4-2-2中j字母所代表的按钮一样的按钮打开Navigator窗口。此 窗口用图形,在Scope Tree 中采用树的形式显示设计中各模块的层次关系。在 Objects List中显出Scope Tree中被选模块的当前模拟数值和描述。 图4-2-3 Navigator窗口 ①、Menu Bar 提供各种命令和操作,有下拉菜单(如下面的图4-2-4)和右键弹出菜单两 种。选中对象点击右键可选择对对象操作所需的命令,如下面的图4-2-5。 图4-2-4 Navigator窗口的菜单 图4-2-5 Navigator中的PoP-Up菜单 ②、Tool Bar a、设置模块 b、对选择对象操作 c、调用其他显示窗口 图4-2-6 Navigator中的工具条 a、b、c同SimControl窗口中的工具条对应按钮的功能一样,都是对选择 对象进行相应的操作。只是对象可以在SimControl窗口选择也可以在Navigator 窗口中选择,互相影响。 ③ 、Hierarchy Path 显示当前模块的直接路径,其他路径不显示。可选择其间的模块点击右键弹 出菜单进行操作。 ④、Scope Tree 对被选中的模块用树的形式表示出来。在图4-2-4中Options-Scope Tree… 菜单项中有关于对象显示的的性质,有Filters、Formatting、Layout三栏,各 有一些选项供选择。影响当前Scope Tree显示的内容。 ⑤、Objects List 显示当前调试模块里的信号和当前数值。在在图4-2-4中Options-Objects List…菜单选项有Filters、Formatting两栏,会影响Objects List中的显示 内容。在Selcet子菜单中的选项(如图4-2-4)能选取某一类别的信号,如都是 Wires型,或是Registers型。 四.Singal Flow Browser窗口 该窗口跟踪可疑信号的值,进入有三个方法 (1) 按下图4-2-2中j字母所代表的按钮 (2)SimControl 窗口Tools- Singal Flow Browser菜单项 (3) 图4-2-6 Navigator中的工具条中字母c的第二个按钮打开窗口。 (4) Wactch Objects Window中按下图4-2-2 中j字母所代表的按钮的一样的按 钮界面如下图。(没选信号时) 图4-2-7 Singal Flow Browser窗口界面 Menu Driver Frame Tool Bar Trace field ①、Menu 对对象的操作命令。可查看信号或输入的细节,显示信号的驱动,可用四种 进制显示信号的数值见下图。后面会阐述菜单项的功能。 图4-2-8 Singal Flow Browser窗口菜单 ②、Tool Bar 中的按钮和前面出现的相同的按钮的功能一样这里就不重复了。 ③、Trace field显示图2 SimControl 窗口Source Browser或者图4、Navigator 窗口中Objects List所选的信号。也可在Trace field输入信号名。 ④、Driver Frame 显示被选的信号和数值,以及所有影响该信号的信号及它们的数值。 假设某个时候的Driver和Value 如下图。 图4-2-9 Driver 信号举例 如果在上图中选中Driver信号选图4-2-9中 View-Driver info…的菜单 项,将弹出 Driver Details窗口显示信号的详细信息。如下图。 图4-2-10 Driver 信号Driver Details窗口 当选中图4-2-9中的Driver 信号,选图4-2-8中Trace-show inputs菜单 项,或者双击信号,将得到影响Driver 信号的有关信号的信息。如下图。 图4-2-11、Driver 信号的inputs信息图 再次双击Driver 信号,会隐去这些信息。 五.Watch Objects 窗口 显示所选信号及其数值,当模拟中断时,更新数值。进入有三个方法 (1) 按下图4-2-2中k字母所代表的按钮 (2) SimControl 窗口Tools- Watch Objects菜单项 (3) Navigator中的工具条中字母c的第一个按钮打开窗口。 (4) Singal Flow Browser 窗口中按下和图 4-4-2 中k字母所代表的按钮的一样的按钮界面如下图。(没选 信号时) 图4-2-12、Watch Objects 窗口 你可以在打开Watch Objects窗口前选择观察信号,如在Source Browser 中 点选择信号,或在SimControl窗口中(图2)的Select菜单下的菜单项选择,或 在图4中Navigator窗口的⑤Objects List中选择。也可以在打开Watch Objects 窗口后再选择信号,如前选择好信号,然后点击图4-2-12中工具条上的加号 图标,把选好信号加到窗口中。窗口的菜单如下图:菜单项的含义都比较明了, 就不多说了。提一下Options-Heighlight Activity项使最新变化的信号项用高 亮条表示,Options-Continous Update 项使信号随时变化,即使按图3、中的 a、Run Simulation按钮也会显示最后的结果,否则不显示最后结果。 图4-2-13、Watch Objects 窗口的菜单 ⑥、SimWave 窗口 显示选择信号的波形和数值。 图4-2-14、SimWave 窗口界面 § 4-3 一个示例 这里举一个实际工作中编的例子,演示前面所讲的内容,但不一定面面俱到。 程序的清单见附录。(alu.v) ①、在命令行中敲textedit alu.v↙ 用textedit 编好程序的文本。 ②、在命令行中敲verilog –c alu.v↙ 编译通过程序. ③、在命令行中敲verilog –s alu.v +gui&↙ 进入交互式图形界面 SimControl 窗口。(见图2)在Scope中选择 ④、在SimControl 窗口中的选中Select-Ports项,选择端口。 ⑤、按下图3、SimControl窗口中的工具条中的k键,打开Watch Objects 窗口, 并如图13选中Options-Continuous ,Highlight Activity两项。 ⑥、按下图3、SimControl窗口中的工具条中的m键,打开 SimWave 窗口。 ⑦、按下图3、SimControl窗口中的工具条中的a键, 图4-3-1、Watch Objects 窗口 图4-3-2、SimWave 窗口波形 附:alu.v源程序: module alu(sum,c_out,a,b,c_in,m); output [3:0]sum; output c_out; input [3:0]a,b; input c_in,m; wire c4,cn,cout1; wire [3:0]sum1,a2; assign a2[0]=(b[0]&~m)|(~b[0]&m); assign a2[1]=b[1]; assign a2[2]=(b[2]&~m)|(((~b[2]&b[1])|(b[2]&~b[1]))&m); assign a2[3]=(b[3]&~m)|(~b[3]&~b[2]&~b[1]&m); assign {c4,sum1}=a+a2+c_in; assign cn=c4|(sum1[3]&sum1[2])|(sum1[3]&sum1[1]); assign {cout1,sum}=sum1+{1'b0,cn,cn,1'b0}+1'b0; assign c_out=cn; endmodule module test; reg [3:0]ta,tb; reg tc,tm; wire [3:0]tsum; wire tcout; alu talu(tsum,tcout,ta,tb,tc,tm); initial $monitor($time,"c_out=%d,sum %d=%d+%d+%d,m=%d",tcout,tsum,ta,tb,t c,tm); initial begin ta=4'b1001; tb=4'b1000; tc=1'b0; tm=1'b0; #10 ta=4'b1001; tb=4'b1001; tc=1'b1; #10 ta=4'b0111; tb=4'b0010; tc=1'b0; #10 tm=1'b1; ta=4'b0111; tb=4'b0010; tc=1'b1; #10 ta=4'b0111; tb=4'b0100; tc=1'b1; #10 ta=4'b0101; tb=4'b0010; tc=1'b1; #10 $finish; end endmodule 下图17、18是程序对应的电路图。 图17 BCD码加法器 图18 ALU原理图 几个打开相关帮助的命令,在命令行中敲入: openbook vlogtut&↙ (Verilog-XL Tutorial) openbook vlogref&↙ (Verilog-XL Reference) openbook vloguser&↙ (simwave user guide) openbook simwaveuser&↙ (open the Verilog-XL guide) 校内网站(ftp:10.12.41.35)有PC机版Verilog仿真工具如Modelshim,Active HDL4.2版,Xilinx的FPGA等等,还有Cadence 的一些资料(如Verilog-XL Reference、user_guide等等)。 第六章 附录 § 6-1 非门DRC文件的编写 附录1:DRC文件 drcExtractRules( nwell=geomOr("nwell") nselect=geomOr("nselect") pselect=geomOr("pselect") poly=geomOr("poly") active=geomOr("active") contact=geomOr("contact") metal1=geomOr("metal1") metal2=geomOr("metal2") via=geomOr("via") ndiff=geomAnd( active nselect) pdiff=geomAnd( active pselect) ngate=geomAnd(ndiff poly) pgate=geomAnd( pdiff poly) ivIf(switch("drc?") then ivIf(switch("checkTechFile") then checkAllLayers() ) ;*/rules for nwell ivIf(switch("nwell")||switch("all") then drc(nwell width < 4.8 "1.a:Minimum nwell width =4.8") drc(nwell sep < 1.8 "1.b:Minimum nwell to nwell spacing =1.8") drc(nwell ndiff enc < 0.6 "1.c:nwell enclosure ndiff =0.6" ) drc(nwell pdiff enc < 1.8 "1.d:nwell enclosure pdiff =1.8") saveDerived(geomAndNot(pgate nwell) "1.e:p mos device must in nwell") ) ;*/rules for active ivIf(switch("active")||switch("all") then drc(active width < 1.2 "2.a:Minimum active width =1.2" ) drc(active sep < 1.2 "2.b:Minimum active to active spacing =1.2") ) ;*/rules for poly ivIf(switch("poly")||switch("allInterconnect")||switch("all") then drc(poly width < 0.6 "3.a:Minimum poly width<0.6") drc(poly sep < 0.6 "3.b:Poly to Poly spacing<0.6") drc(poly active sep < 0.6 "3.c:Field Poly to Active spacing <0.6") ngatel=geomGetEdge(ngate coincident poly) ngatew=geomGetEdge(ngate inside poly) pgatel=geomGetEdge(pgate coincident poly) pgatew=geomGetEdge(pgate inside poly) drc(poly ngatew enc < 0.6 opposite "3.d:nPoly gate overlap onto field<.6" ) drc(active ngatel enc < 0.6 opposite "3.e:nSource/Drain enclosure of gate<.6" ) drc(poly pgatew enc < 0.6 opposite "3.d:pPoly gate overlap onto field<.6" ) drc(active pgatel enc < 0.6 opposite "3.e:pSource/Drain enclosure of gate<.6" ) ) ;*/contact rules ivIf(switch("contact")||switch("allInterconnect")||switch("all") then saveDerived(geomAndNot(contact geomOr(active poly)) "contact not inside Active or poly") saveDerived(geomAndNot(contact metal1) "contact not covered by Metal1") drc(contact width < 0.6 "4.a:Contact width<0.6" ) drc(contact sep < 0.9 "4.b:Contact to Contact spacing <0.9" ) drc(poly contact enc < 0.3 "4.c:Contact inside Poly<0.3" ) saveDerived(geomStraddle(contact poly) "4.c:contact inside poly<0.3") drc(metal1 contact enc < 0.3 "4.d:Contact inside Metal1<0.3" ) saveDerived(geomStraddle(contact metal1) "4.d:contact inside metal1<0.3") saveDerived(geomOutside(contact metal1) "4.d:contact inside metal1<.3") ) ;*/metal1 rules ivIf(switch("metal1")||switch("allInterconnect")||switch("all") then drc(metal1 width < 1.2 "5.a:Metal1 width<1.2" ) drc(metal1 sep < 0.9 "5.b:Metal1 to Metal1 spacing <0.9" ) ) ;*/metal2 rules ivIf(switch("metal2")||switch("allInterconnect")||switch("all") then drc(metal2 width < 1.2 "6.a:Metal2 width<1.2" ) drc(metal2 sep < 1.2 "6.b:Metal2 to Metal2 spacing<1.2" ) drc(metal2 notch < 1.2 "6.c:Metal2 to Metal2 spacing<1.2" ) ) ;*/via rules ivIf(switch("via")||switch("allInterconnect")||switch("all") then drc(via width < 0.6 "7.a:Via width<0.6" ) drc(via sep < 0.9 "7.b:Via to Via spacing<0.9" ) drc(via contact sep < 0.6 "7.c:Via to Contact spacing <0.6" ) drc(metal1 via enc < 0.3 "7.d:Via inside Metal1<0.3" ) drc(metal2 via enc < 0.3 "7.e:Via inside Metal2<0.3" ) saveDerived(geomAndNot(via metal1) "Via not inside Metal1") saveDerived(geomAndNot(via metal2) "Via not inside Metal2") saveDerived(geomOverlap(via contact) "Via not allowed over contacts") saveDerived(geomOverlap(via poly) "Via not allowed over Poly") drc(via poly sep < 0.3 "7.f:Via to Poly spacing <0.3" ) ) ) ) 附录2:extract文件 ;/*EXTRACT RULES FOR NWELL CMOS drcExtractRules( ivIf( switch( "extract?" ) then ;define commonly used layers bkgnd=geomBkgnd() nwell=geomOr("nwell") psub=geomAndNot(bkgnd nwell) active=geomOr("active") nselect=geomOr("nselect") pselect=geomOr("pselect") poly=geomOr("poly") contact=geomOr("contact") metal1=geomOr("metal1") metal2=geomOr("metal2") via=geomOr("via") ndiff=geomAnd(active nselect) pdiff=geomAnd(active pselect) ; nactive=geomAnd(ndiff psub) ;pactive=geomAnd(pdiff nwell) ;define recognition layers ngate=geomAnd(ndiff poly) pgate=geomAnd(pdiff poly) ;define terminal layers nsd=geomAndNot(ndiff poly) psd=geomAndNot(pdiff poly) ;define persudo layers ntap=geomAnd(nsd nwell) ptap=geomAnd(psd psub) geomConnect( via(via metal1 metal2 ) via(contact metal1 psd nsd poly ) via(ntap nwell nsd) via(ptap psub psd) ) ;subPConn=geomStamp( psub ptap error) ; subNConn=geomStamp( nwell ntap error) extractDevice( pgate poly("G") psd("S" "D") "pmos ivpcell" ) extractDevice( ngate poly("G") nsd("S" "D") "nmos ivpcell") ;device measurement pgateWidth = measureParameter( length (pgate coincident poly ) 0.5) pgateLength = measureParameter( length (pgate inside poly ) 0.5) saveParameter( pgateWidth "w" ) saveParameter( pgateLength "l" ) ngateWidth = measureParameter( length ( ngate coincident poly ) 0.5 ) ngateLength = measureParameter( length (ngate inside poly ) 0.5 ) saveParameter( ngateWidth "w" ) saveParameter( ngateLength "l" ) ;saveInterconnect(contact poly metal1 metal2 via ) saveInterconnect( poly contact metal1 metal2 via) ;saveInterconnect((nsd "nselect") (psd "pselect") ) ;saveInterconnect((subNConn "nwell") (subPConn "pselect")) saveRecognition( ngate "poly") saveRecognition( pgate "poly") ) ) 附录3:LVS文件 lvsRules( procedure( compareMOS( layPlist,schPlist) prog( ( ) if(layPlist->w!=nil && schPlist->w!=nil then if( layPlist->w !=schPlist->w then sprintf(errorW, "Gate width mismatch: %gu layout to %gu schematic", float( layPlist->w ), float( schPlist->w ) ) return( errorW ) ) ) if( layPlist->l !=nil && schPlist->l !=nil then if( layPlist->l != schPlist-> then sprintf( errorL, "Gate length mismatch: %gu layout to %gu schematic", float( layPlist->l ),float(schPlist->l) ) return( errorL ) ) ) return( nil ) ) ; prog ); comparemos procedure( parallelMOS( m1Plist, m2Plist ) prog( ( parMos ) (parMos = (ncons nil ) ) if(( m1Plist->l !=nil && m2Plist->l !=nil) then parMos->l = ( m1Plist->l + m2Plist-> l ) /2.0 ) if(( m1Plist->w != nil && m2Plist->w != nil) then parMos->w = ( m1Plist->w + m2Plist->w ) ) return( parMos ) ) ; prog ) ; parallelMOS permuteDevice( parallel "pmos" parallelMOS ) permuteDevice( parallel "nmos" parallelMOS ) ;permuteDevice( MOS "pmos" ) ;permuteDevice( MOS "nmos" ) compareDeviceProperty( "pmos" compareMOS ) compareDeviceProperty( "nmos" compareMOS ) ) ;lvsRules § 6-2 一个完整DIVA文件的注解 一个完整DIVA 文件的注解 ;*************DRC Procedure**************** ;以下这段将会产生覆盖原焊点(pad)4u的金属2的新层次 drcExtractRules( ivIf( switch(“padFix”)||switch(“all”) then metal2=geomOr(“metal2” geomSize(“pad” 4.0));将原金属2层次中覆盖焊 点的部分扩展4u geomErase(“metal2”) saveDerived(metal2(“metal2” “drawing”) );以上两句联合使用将旧层次用 新层次覆盖,并存入drawing(原始版图的图层)中 ) ;如果通孔(via)在poly1上或者在它的0.5u范围以内,就产生新层次viaE ;viaE图形必须覆盖通孔(via)0.2u ivIf(switch(“viaEfix”)||switch(“all”) then viaToFix=geomOverlap(“via” geomSize(“poly1” 0.5));使用这条语句选择满 足条件的via(先将poly1扩展0.5u,然后选择与新图形相交的via) viaE=geomSize(viaToFix 0.2);产生viaE层,它覆盖满足条件的via0.2u geomErase(“viaE”) saveDerived(viaE (“viaE” “drawing”));将新产生的viaE层存入drawing中 ) ) ;*************DRC Procedure**************** drcExtractRules( ;生成常用的衍生层 nsd=geomAndNot(“ndiff” “poly1”) psd=geomAndNot(“pdiff” “poly1”) ngate=geomAnd(“ndiff” “poly1”) pgate=geomAnd(“pdiff” “poly1”) ;开始DRC校检 ivIf(switch(“drc?”) then dummy=geomBkgnd() ;进行0尺寸图形检查 ivIf(switch(“0width”) then layers=geomcat(“thinox” “metal1” “poly1” “metal3” “via2” “via” “contact” “ndiff” “PRES” “pdiff” “nwell” “buried” “pbase” “pad”);注 意geomCat和geomOr的区别 drc(layers width==0 raw “0-width shape”);raw表明检查的是原始层次。 ) ivIf(switch(“offgrid”) then;进行掩膜错位检查 maskedLayers=geomCat(“thinox” “metal1” “poly1” “metal3” “via2” “via” “contact” “ndiff” “PRES” “pdiff” “nwell” “buried” “pbase” “pad”) offGrid(maskedLayers .05 raw “shape off .05 grid”);使用offGrid这个命令来进 行检查 ) ;以下这段将对所有层次进行规定的检查 ivIf(switch(“checkTechFile”) then checkAllLayers() ) ;阱的规则检查 ivIf(switch(“well”)||switch(“all”) then drc(“nwell” width<1.8 “1a:minimum nwell width =1.8”);n阱最小宽度为1.8u drc(“nwell” sep<2.5 “1b:minimum nwell spacing=2.5”);n阱间最小间距为2.5u drc(“nwell” “pdiff” enc<2.0 “1c:nwell enclosure of pdiff =2.0”);pdiff的外边界到 nwell的内边界距离检查,最小间距为2u saveDerived( geomStraddle(“pdiff” “nwell”) “1c:nwell enclosure of pdiff=2.0”);pdiff和 nwell仅有部分交叠,则输出错误信息 drc(“nwell” “ndiff” enc<1.0 “1d:nwell enclosure of ndiff =1.0”);ndiff的外边界到 nwell内边界的最小间距为1u saveDerived( geomStraddle(“ndiff” “nwell”) “1d:nwell enclosure of ndiff=1.0”);ndiff和 nwell仅有部分交叠,则输出错误信息 ;soft connect检查 ptap=geomOverlap(“ndiff” “nwell”);选择在nwell上的ndiff nwell=geomOr(“nwell”) ndiff=geomOr(“ndiff”) metal1=geomOr(“metal1”) geomConnect( via(ptap ndiff metal1);ndiff 通过ptap和metal1相连 ) ivIf(switch(“currentCell?”)||!switch(“hier?”);只在单元内检查阱的连接 geomStamp(nwell ndiff error) ) ) ;扩散区的规则检查 ivIf(switch(“diff”)||switch(“all”) then drc(“ndiff” width<1.0 “2.a:minimum ndiff width=1.0”);ndiff的最小宽度为1u drc(“pdiff” width<1.0 “2.a:minimum pdiff width=1.0”);pdiff的最小宽度为1u drc(“ndiff” sep<1.0 “2.b:minimum ndiff spacing=1.0”);ndiff的间距最小为1u drc(“pdiff” sep<1.0 “2.b:minimum pdiff spacing=1.0”);pdiff的间距最小为1u drc(“pdiff” “ndiff” sep<1.0 “2.c:minimum ndiff to pdiff spacing =1.0”);ndiff和pdiff 间的距离最小为1u drc(nsd width<1.0 “2d:minimum source/drain diffusion width =1.0”) drc(psd width<1.0 “2d:minimum source/drain diffusion width =1.0”);源区和漏区的最 小宽度均为1u saveDerived(geomAndNot(pgate “nwell”) “2.e:P mos device must be inside nwell”);将不 在nwell中的pmos输出至错误层 ) ;poly1的规则检查 ivIf(switch(“poly1”)||switch(“allInterconnect”)||switch(“all”) then drc(“poly1” width<0.6 “3.a:minimum poly1 width=0.6”);poly1的最小宽度为0.6u drc(“poly1” sep<1.0 “3.b:minimum poly1 spacing=1.0”);poly1的最小间距为1u drc(“poly1” “ndiff” enc <0.4 “3.c:poly1 extension past ndiff =0.4”) drc(“poly1” “pdiff” enc <0.4 “3.c:poly1 extension past pdiff =0.4”);poly1跨ndiff和 pdiff的最小距离为0.4u saveDerived(geomButting(pgate psd keep<2) “3c:poly1 extension past pdiff =0.4”);这里 的keep<2是指如果和pgate相外切的psd部分少于两部分(作为一个mos管,必须有源和 漏,因此和pgate相外切且分离的psd层必须为两个),就输出错误 saveDerived(geomButting(ngate nsd keep<2) “3c:poly1 extension past ndiff =0.4”) ) ;metal1规则检查 ivIf(switch(“metal1”)||switch(“allInterconnect”)||switch(“all”) then drc(“metal1” width<0.8 “4a:minimum metal1 width =0.8”);metal1的最小宽度为0.8 drc(“metal1” sep<1.0 “4b:minimum metal1 spacing =1.0”);metal1的最小间距为1u ) ;contact规则检查 ivIf(switch(“contact”)||switch(“allInterconnect”)||switch(“all”) then drc(“contact” width<1.0 “5a:minimum contact width =1.0”);contact的最小宽度为1u drc(“contact” sep<1.0 “5b:minimum contact spacing =1.0”);contact间的最小间距为 1u drc(“ndiff” “contact” enc<1.0 “5c:ndiff enclosure of contact =1.0”);ndiff包含 contact最小为1u saveDerived(geomStraddle(“contact” “ndiff”) “5c:ndiff enclosure of contact =1.0”);若 contact与ndiff仅有部分交叠,输出错误 drc(“pdiff” “contact” enc<1.0 “5c:pdiff enclosure of contact =1.0”) ;pdiff包含 contact最小为1u saveDerived(geomStraddle(“contact” “pdiff”) “5c:pdiff enclosure of contact =1.0”) ;若 contact与pdiff仅有部分交叠,输出错误 drc(“metal1” “contact” enc<0.5 “5d:metal1 enclosure of contact =0.5”);metal1包含contact 最小为0.5u saveDerived(geomStraddle(“contact” “metal1”) “5d:metal1 enclosure of contact =0.5”) ;若 contact与metal1仅有部分交叠,输出错误 saveDerived(geomOutside(“contact” “metal1”) “5d:metal1 enclosure of contact =0.5”);若 有contact在metal1之外,输出错误 drc(“poly1” “contact” enc<0.5 “5e:poly1 enclosure of contact =0.5”) ;poly1包含contact 最小为0.5u saveDerived(geomStraddle(“contact” “poly1”) “5e:poly1 enclosure of contact =0.5”);若 contact与poly1仅有部分交叠,输出错误 savederived(geomOutside(“contact” geomOr(geomOr(“ndiff” “pbase”) geomOr(“pdiff” “poly1”))) “contact must be enclosed by pdiff or ndiff or poly1”);contact必 须处在pdiff、ndiff或是poly1中间 ) ivIf(switch(“metal2”)||switch(“allInterconnect”)||switch(“all”) then drc(“metal2” width<1.0 “6a:minimum metal2 width =1.0”);metal2的最小宽度为1u drc(“metal2” sep<1.0 “6b:minimum metal2 spacing =1.0”);metal2间的最小间距为1u ) ivIf(switch(“via”)||switch(“allInterconnect”)||switch(“all”) then drc(“via” width<1.0 “7a:minimum via width =1.0”);via的最小宽度为1u drc(“via” sep<1.0 “7b:minimum via spacing=1.0”);via间的最小间距为1u drc(“metal1” “via” enc<1.0 “7c:metal1 enclosure of via =1.0”);metal1包含via最小为 1u saveDerived(geomStraddle(“via” “metal1”) “7c:metal1 enclosure of via =1.0”);via同 metal1仅有部分交叠,输出错误 saveDerived(geomOutside(“via” “metal1”) “7c:metal1 enclosure of via =1.0”);若有处于 metal1之外的via,输出错误 drc(“metal2” “via” enc<0.5 “7d:metal2 enclosure of via =0.5”);metal2包含via最小为 1u saveDerived(geomStraddle(“via” “metal2”) “7d:metal2 enclosure of via =0.5”) ;via同 metal1仅有部分交叠,输出错误 saveDerived(geomOutside(“via” “metal2”) “7d:metal2 enclosure of via =0.5”) ;若有处 于metal1之外的via,输出错误 ) ivIf(switch(“pad”)||switch(“all”) then drc(“pad” width<20.0 “8a:minimum pad width =20.0”);pad的最小宽度为20u drc(“metal2” “pad” enc<3.0 “8b:metal2 enclosure of pad =3.0”);metal2包含pad最小为 3u saveDerived(geomStraddle(“pad” “metal2”) “8b:metal2 enclosure of pad =3.0”);若metal2 与pad仅有部分交叠,输出错误 saveDerived(geomOutside(“pad” “metal2”) “8b:metal2 enclosure of pad =3.0”);若有处于 metal2之外的pad,输出错误 drc(“pad” sep<25.0 “8c:minimum pad spacing =25.0”);pad间的最小间距为25u drc(“pad” geomGetByLayer(“metal2” “pad” 6) sep<5.0 “8d:minimum metal2 to pad spacing =5.0”) );将pad扩张6u,选择与其相交的metal2,并检测所选的metal2与pad的间距最小是否为 5u ivIf(switch(“res”)||switch(“all”) then drc(“PRES” width<1.0 “9a:minimum PRES width =1.0”);PRES的最小宽度为1u drc(“PRES” sep<1.0 “9b:minimum PRES spacing =1.0”);PRES间的最小间距为1u drc(“PRES” “ndiff” enc<0.5 “9c:PRES enclosure of ndiff =0.5”);PRES包含ndiff最小 为0.5u saveDerived(geomStraddle(“ndiff” “PRES”) “9c:PRES enclosure of ndiff =0.5”) ;若ndiff 与PRES仅部分交叠,输出错误 ) ivIf(switch(“cap”)||switch(“all”) then drc(“thinox” width<1.0 “10a:minimum thinox width =1.0”);thinox的最小宽度为1u drc(“thinox” sep<2.0 “10b:minimum thinox spacing =2.0”);thinox间的最小间距为2u drc(“poly1” “thinox” enc<0.4 “10c:poly1 enclosure of thinox =0.4”);poly1包含thinox 最小为0.4u saveDerived(geomStraddle(“thinox” “poly1”) “10c:poly1 enclosure of thinox=0.4”) ;若 thinox与poly1仅部分相交,输出错误 ) ivIf(switch(“bipolar”)||switch(“all”) then drc(“buried” “pdiff” enc<0.5 “11a:buried enclosure of pdiff =0.5”);buried包含 pdiff最小为0.5u saveDerived(geomStraddle(“pdiff” “buried”) “11a:buried enclosure of pdiff=0.5”);若pdiff 与buried仅有部分交叠,则输出错误 drc(“buried” “ndiff” enc<0.5 “11a:buried enclosure of ndiff =0.5”);buried包含 ndiff最小为0.5u saveDerived(geomStraddle(“ndiff” “buried”) “11a:buried enclosure of ndiff=0.5”);若ndiff 与buried仅有部分交叠,则输出错误 drc(“buried” “pbase” enc<0.5 “11a:buried enclosure of pbase =0.5”);buried包含 pbase最小为0.5u saveDerived(geomStraddle(“pbase” “buried”) “11a:buried enclosure of pbase=0.5”);若 pbase与buried仅有部分交叠,则输出错误 drc(“pbase” “ndiff” enc<0.5 “11b:pbase enclosure of ndiff =0.5”);pbase包含ndiff 最小为0.5u saveDerived(geomStraddle(“ndiff” “pbase”) “11b:pbase enclosure of ndiff =0.5”);若 ndiff与pbase仅有部分交叠,则输出错误 ) ) ) ;**********************Extraction Procedure************************* drcExtractRules( ivIf( switch(“extract?”) then;开始extraction ;产生一些常用的衍生层次 poly1=geomOr(“poly1”) pdiff=geomOr(“pdiff”) ndiff=geomOr(“nwell”) pbase=geomOr(“pbase”) buried=geomOr(“buried”) thinox=geomOr(“thinox”) PRES=geomOr(“PRES”) contact=geomOr(“contact”) metal1=geomOr(“metal1”) via=geomOr(“via”) metal2=geomOe(“metal2”) pad=geomOr(“pad”) sub=geomBkgnd() ;定义识别层 ngate=geomAnd(ndiff poly1) pgate=geomAnd(pdiff poly1) npn=geomAnd(ndiff pbase);npn的发射极 pnp=geomHoles(pdiff);pnp的发射极(pnp的集电极包围其发射极,横向pnp管) ;定义端口层 nsd=geomAndNot(ndiff poly1) psd=geomAndNot(pdiff poly1) pnpEmit=geomAnd(psd pnp);pnp的发射极 psd=geomAndNot(psd pnpEmit);重新定义psd(去除了pnp的发射极部分) resTerm=geomAnd(geomsize(contact 1) geomAnd(PRES nsd)) PRES=geomAndNot(goemAnd(PRES nsd) resTerm) nsd=geomAndNot(nsd geomOr(PRES resTerm)) ;定义伪接触层 ptap=geomAndNot(geomAndNot(psd nwell) buried) psd=geomAndNot(psd ptap) nburied=geomAndNot(geomAnd(nsd buried) pbase) pbaseConn=geomAndNot(geomAnd(contact pbase) nsd) contact=geomAndNot(contact pbaseConn) padContact=geomAnd(metal2 pad) ;define geomConnect statement geomConnect(via(contact metal1 nsd psd poly1 ptap pnpEmit resTerm) via(via metal1 metal2) via(nburied nsd buried) via(pbaseConn pbase metal1) via(padContact metal2 pad) ) nwellConn=geomStamp(nwell nsd) subConn=geomStamp(sub ptap) ;define extractDevice statemetnt extractDevice(pgate poly1(“G”) psd(“S” “D”) nwellConn(“B”) “pmos ivpcell”) extractDevice(ngate poly1(“G”) nsd(“S” “D”) subConn(“B”) “nmos ivpcell”) extractDevice(npn nsd(“E”) pbase(“B”) buried(“C”) “npn ivpcell”) extractDevice(pnp pnpEmit(“E”) psd(“C”) buried(“B”) “pnp ivpcell”) extractDevice(thinox metal1(“PLUS”) poly1(“MINUS”) “cap ivpcell”) extractDevice(PRES resTerm(“PLUS” “MINUS”) “res ivpcell”) ;measure device sizes and other parameters ;for nmos device: wn=measureParameter(length (ngate butting nsd) .5e-6) ln=measureParameter(length (ngate inside poly1) .5e-6) saveParameter(wn “w”) saveParameter(ln “l”) ;for pmos device: wp=measureParameter(length (pgate butting psd) .5e-6) lp=measureParameter(length (pgate inside poly1) .5e-6) saveParameter(wp “w”) saveParameter(lp “l”) ;for pnp device: pnpea=measureParameter(area (pnp over pnpEmit) 1e-6) saveParameter(pnpea “area”) ;for npn device: npnea=measureParameter(area npn 1e-6) saveParameter(npnea “area”) ;for cap cap=measureParameter(area(thinox) 5e-15) saveParameter(cap “c”) ;for res wr=measureParameter(length(PRES butting resTerm) .5) lr=measureParameter(length(PRES outside resTerm) .5) bendsr=measureParameter(bends_all (PRES outside resTerm)) res=calculateParameter(((lr/wr) –(.46*bendsr))*100.0) saveParameter(res “r”) ;output data to extracted layout saveRecognition(pgate “poly1”) saveRecognition(ngate “poly1”) saveRecognition(npn “ndiff”) saveRecognition(pnp “buried”) saveRecognition(thinox “thinox”) saveRecognition(PRES “PRES”) saveInterconnect(contact metal1 poly1 metal2 via) saveInterconnect((nsd “ndiff”) (psd “pdiff”)) saveInterconnect((nwellConn “nwell”) pbase buried) saveInterconnect((pnpEmit “pdiff”) (pbaseConn “contact”)) saveInterconnect((resTerm “PRES”) pad) copyGragphics((“text” “drawing” ) all) );end extract? ):end drcExtractRules § 6-3 规则文件中一些定义和关键词的图文解释 层处理 层处理要求创建新的层次。你可以在初始设计中使用它,也可以在随后的验证语句中用到。 输入输出层次 层处理创建的新层次我们称之为衍生层。他可以是多边形(图形)或是边。层处理表达式中 的输入层可以是多边形、边、衍生层或是原始的图形层次(使用在真正物理版图设计上的层 次) 在层次处理之前,diva默认将所有在同一层次上的图形合并。有必要的话可以使用raw这个 命令来使所需的一些层次不合并(在下面会再次提到这个命令)。 逻辑命令 逻辑命令可以被称作层间的“布尔运算”。他们从输入层出发,创建新的几何图形。 不同的命令所需的输入层数目从一到多不等。 GeomAnd 输出两个不同层次或边界间的交叠部分。一般需要一个或两个输入层。 GeomOr 输出所有的输入层。这些层次(边界)将会被合并成为一个新层次。 GeomAndNot 输出第一层中未被第二层覆盖的部分。你也可以理解为第一层减去第二层。 有一点需要注意的是在这个命令中输入层的顺序不能搞错。 GeomXor 这个命令输出两层或多层之间非公有的部分。一般需要一或两个输入层。 GeomNot 输出输入层的反。只有一个输入层。 GeomCat 使所有的输入层连续。其输出包含所有的输入层。但不像geomOr使所有的层 合并。可以有任意多个输入层。 关系命令 毫无疑问,关系命令必须有两个输入层次。所有的关系命令都将选择表达式中的第一输入层 的整个图形(当然是满足条件的)。 大多数关系命令允许使用修改符。包括:连接符,限制符以及排除符。 连接符的关键词为:diffNet和sameNet。前一个输出不同结点的图形。后一个输出相同结点 的图形。 限制符的关键词为:keep和ignore。它们都需要指定被选定的图形个数的范围。 GeomInside 选择完全处在第二输入层中的第一输入层。两层可以内切。不能使用限制 符和排除符。 GeomOutside 选择完全处在第二输入层之外的第一输入层。两层可以外切。不能使用任 何修改符 GeomAvoiding 选择完全处在第二输入层之外的输入层。两层间不能外切。不能使用任何 修改符 以下命令均可使用修改符 GeomStraddle 选择的输入层只是部分被第二输入层所覆盖。 GeomButting 选择与第二输入层相外切的层次。 GomeCoincident 选择与第二输入层相内切的层次。 GeomOverlap 选择与第二输入层有公共面积的层次。 GeomButtOrCoin 选择与第二输入层外切或内切的的层次。 GeomButtOrOver 选择与第二输入层外切或相覆盖的层次。 GeomEnclose 选择完全包含第二输入层的层次,可以内切。 GeomButtOnly 仅仅选择相互外切的层次. GeomCoinOnly 仅仅选择内切的层次,第二层必须完全在的第一层内部。 尺寸命令 geomSize 按输入的数值扩张或收缩输入层。其中正值表示扩张,负值表示收缩。Edges 功能允许将图形的边按垂直方向舒张,正值表示向图形外部伸展,负值表示向图形内部伸展。 有一点需要注意的是:所有的锐角在扩张时都会被截角。锐角在扩张时遵循与直角相同的规 则。及伸展边扩张值的根号二。 GeomStretch 扩张或收缩输入层的边界。正值表示扩张,负值表示收缩。输出将会是边。 选择命令 根据输入层的特性,比如:形状,角度等等来选择输入层或其边界。 GeomGetRectangle 选择边平行或垂直于坐标轴的四边形。 GeomGetpolygon 与上一个命令搭配使用,选择上个命令没有选中的所有图形。 GeomGetVertex 根据顶点个数选择图形,顶点数目可由关键字keep和ignore来确定。 GeomGetAngledEdge 选择角度满足要求的边(注意其输出是边),但如果有关键词fig,则 输出包含选定边的图形。 GeomGetNon45 选择与坐标轴不平行,不垂直也不成45度角的边。 GeomGetEdge 根据边或边的一部分与其它边或图形的关系来选择。首先,要指出包 含所需输出边的输入层,当然这个输入层可以是边或图形。然后,你可以使用以下操作符来 选择所需的边: Butting 选择输入层间相外切的边 Coincident 选择输入层间向内切的边 Outside 选择第一输入层中处在第二输入层外部的边 Inside 选择第一输入层中处在第二输入层内部的边 Not-over 为outside和butting的组合 Over 为inside和coincident的组合 GeomGetAdjacentEdge 选择与其它参考边相临近的边 GeomGetTexted 根据文字标识来选择图形。所选图形必须包含文字标识。 GeomGetUnTexted 与上个命令正好相反。 GeomGetNet 根据指定的节点名来选择图形。所有与这个指定节点相联系的层 次都可以作为输入层。 GeomGetLength 选择输入层中的边。选择根据是边的长度,这里所说的边可以是 一条独立的边,也可以是折线边。 GeomHoled 选择包含孔的图形(就像油炸圈饼一样) GeomGetNon90 选择输入层中不平行于坐标轴的边。 焊点金属检查: 毫无疑问,对器件紧凑层的检查会比疏松层花费多得多的时间。举个例子,在焊点金属 检查过程中,系统会检查所有金属的附近有无焊点,但是事实上是只在芯片边界上的金属边 缘有焊点。这将会非常耗费时间,这里我们将使用geomGetByLayer命令来解决这个问题。 以下步骤说明这个命令怎样运作: 1 一个边界将会包围在焊点层次周围,当然距离由我们来定。 2 接着,所有被这个边界包围或穿插的梯形金属层将会被选定。 3 最后,检查被选定的金属层与焊点间的间距(使用DRC命令)。 层生成命令 geomHoles 生成的图形具有“油炸圈饼”的几何形状。 GeomNoHoles 与上个命令相反 GeomBkgnd 生成包含版图中所有图形的一个矩形。 存储命令 Savederived 将衍生层存入库中相关的视图中去。当然你也可以指定输出层次,衍生层 将会被存储在那里。 根据指定的关键字,衍生层可以被存储到某一个视图中去。这样的关键字有: lay_view,ext_view,cell_view,和abs_view。从名字不难看出,它们分别代表版图,提取层,excell 和抽象视图。如果没有关键字,那么系统将默认是当前视图。有一点要注意的是,上述关键 字的使用都必须在一个特定的上下文中,如:lay_view应在DRC或extraction中。Ext_view 和cell-view必须在extraction中。而abs_view则只能在abstract generation 中起作用。 这个命令的输出有两种格式:tile(梯形)和多边形。系统默认的是多边形格式。 这条命令也可以附加消息。但是消息两头必须有引号。可以在运行DRC的explain命令 是看到这些消息。 CopyGraphics 从当前分析层拷贝源层次到特定层中去。 在extraction时,源层次将被拷贝到extracted view中去。在abstract generation时,源层次 拷贝到abstract view中。在分层提取中,如果使用到关键词cell_view,系统会将指定层次从 “分层提取中的最高层次(top_lever of hierarchy)”中拷贝到excell view 。但如果使用关键词 all,系统将会从设计版图的所有层次中搜寻指定层次并进行拷贝。 GeomErase 从所有的视图中删去指定原始图形层上的全部图形。当然你也可以指定删 除的范围。要特别小心的使用这个命令,因为他可能永久改变数据库。 DRC 命令 根据drc检查的类型,drc命令可能使用一到两个输入层。输入层可以是原始图形层或是衍 生层。 Drc的检查结果可以被输出到输出层。而这些输出层又可以作为后续检查的输入。如果没 有定义输出层,则检查结果会被输出到marker层去。 Fuctions-决定输入层被检查的方式。除了area外,所有的function都是基于边到边检查的。 每个function的使用都有一个范围。即有一个上限和下限。如果没有定义下限,系统会自 动给出“大于等于0”的保留值。 Modifiers-修改functions的属性。如果不冲突的话,可以同时使用多个modifiers。 Functions: Width 检查同一输入层中内边线到内边线的距离 Notch 检查同一输入层中外边线到外边线的距离 Area 检查单一输入层的面积 Sep 检查第一输入层的外边线到第二输入层外边线的距离 Enc 检查第一输入层的内边线到第二输入层外边线的距离 Ovlp 检查第一输入层的内边线到第二输入层内边线的距离 Modifiers: With_perp 除了标准的边界检查外还可以检查垂直边。 Only_perp 只能进行垂直边的检查 Parallel 只能进行平行边的检查,所有function默认的边界检查为平行边或非平行边 NotParallel 只能进行非平行边的检查 SameNet 只检查连接在同一节点的层次,在这个命令里使用的层次必须在前面的 geomConnect 命令中出现过 DiffNet 只检查连接在不同节点的层次,在这个命令里使用的层次也必须在前面 的geomConnect 命令中出现过 App 只检查值确定的投影边。无论是正值、负值或是零都必须说明 Opposite 只检查两图形的相对边。将输出修整为正的并置。 Length,lengtha, 只计算长度符合指定长度限制的边的长度。Length在检查两层关系时, Lengthb 两条边都计算。Lengtha和lengthb则分别代表第一层和第二层的边 Fig,figa,figb fig在两层检查中两层的图形都输出。而在一层检查中输出第一层的图形; figa和figb在两层检查中分别输出的第一层和第二层的图形 Edge,edgea,edgeb edge在两层检查中两层的边界都输出。而在一层检查中输出第一层的 边界;edgea和edgeb在两层检查中分别输出的第一层和第二层的边界 Raw 在层次合并之前检查每一层。 Message 是一串处在引号中的字符串,用于错误检查中提示 方形边角检查 SquareGrow 在图形周围添加一个直交的检查图形,即将原图形沿x和y方向伸展指定 的长度。形象的说就是在原图形外加一个封套 NormalGrow 在原图形周围添加一个扩张的图形。在使用这个命令时,有一个特殊情况: 如果图形的挖槽(notch)长度小于两倍的扩张长度,将会在槽处出现冲突。 这一点我们要注意到。 大多数DRC规则可以分为以下三部分: 1 电气规则要求的指定材料间的露头(enclosure)或间距(sepration) 2 在生产时可能存在的掩膜错位 3 生产过程中材料的过搀杂或是迁移 上述的方形边角检查可以使对非投影的折角描述更加精确。 Soft-connect 检查 GeomStamp 检查阱是否被错误的使用来作为传导通道。geomstamp必须要放在 geomConnect命令之后而且stamping层(第二层)必须在geomConnect中出 现过。 在复杂的单元覆盖情况下使用分层DRC检查来提高效率: hier? 允许在分层DRC检查时使用不同的规则,它包括以下分支句子: currentCell?只作当前单元的检查 topcell? 只作最高层单元(top-level cell)的检查 当你在DRC检查中选择了分层检查模式,那么所有在hier?分支语句中的命令将会被执行。 在DRC中运用层次属性: 层次属性: spacingRules 定义一层或是两层的无序属性。DRC保留的属性有:minWidth,minSpacing, 和minNotch。 OrderedSpacingRules 定义指定顺序的两层的属性。DRC保留的属性有:minEnclosure, minSpacing和minOverlap。 变量赋值 : DRC在technology file中可以设定变量。一般是在technology file中的controls class中。 DRC中的参考值: CheckLayer 进行一层或是两层的检查. CheckAllLayers 在所有层上进行DRC检查。当然你可以指定某一层不被检查. TechGetSpacingRule 从单层属性中获取值 TechGetTechFile 获取设计的technology file信息 § 6-4 DIVA中寄生元器件提取语句介绍 DIVA中关于寄生元件提取的语句很多,分别是measureParasitic、 multiLevelParasitic、measureFringe、calculatParasitic、saveParasitic、 attachParasitic。下面将就它们的用法作一些简单的介绍: 在介绍之前,我们有必要澄清几个概念:首先,我们为什么要对版图进行寄生元件提取? 很简单,我们都知道,在电路的版图当中,由于工艺上的或是其他的一些不可避免的因素的 影响,会产生一些寄生的元件。比如说:寄生电容、寄生电阻等等。而这些寄生元件又往往 会对我们的电路特性带来负面的影响,所以我们得尽量的减少其生成。但就如上面所说的一 样,一些寄生元件的产生有其必然性,这就要求我们设计的芯片能够在这些负面的影响下也 能体现较好的特性。所以在一块芯片的版图完成之后,我们所要进行的很重要的一步工作就 是提取版图中的寄生参数并将其代入电路中进行模拟。这就是我们所说的后模拟。只有经过 后模拟的版图才是最接近实际情况的器件版图。 另外,我们知道,在版图验证中LVS 是非常重要的。在我们做完寄生参数的提取工作 之后,下一步要进行的将是带寄生参数的SPICE模拟。也就是说我们所提取得那些寄生参数 将被加入到SPICE的网表(netlist)中去。但是,在LVS 中我们却不能将这些寄生元件 加入到其网表中,因为这些元件在原始版图中事实上是不存在的。所以,我们将会得到两个 不同的视图(view):SPICE view和LVS view。 接下来,我们将进入正题。在具体到每一个语句之前,我先介绍一下后面会经常用到的 一些测量语句。Area:面积 perimeter:周长 length:长度 bends:凹角 (concave corner) corners:凸角(convex corner) angle:任意角 (bends+corners) calculatParastic语句介绍: 这个函数可以在前面measureParasitic语句所导出的值或是calculatParasitic 语句所计算出的值的基础上进行进一步的计算。而且,这个语句能突破每个 measureParasitic语句只能进行一次测量的局限性,它允许我们对更多的简单测量语句 进行组合以形成复杂的寄生参数测量。其语法如下: outValue=calculatParasitic(expression[limit]) outValue:是保存在指定文件中的数值 expression:是一些计算符,如:+、—、×、、log()、sin()、cos()等等。 要注意的是在符号和名称之间必须有空格。(这是为了避免混淆,因为我们有像+p这样的 层次名称)另外,一条calculatParasitic命令中参量的数目应当限制在十条以内,这 一点也要注意。还有就是在运算中不能出现不规则的情况,如下例: x=area metal over poly y=area metal over diff caculate x/y 这时如果y为零,那么这条命令将会终止执行。 Limit:范围限制。它所要用到的操作符有:<、<=、> 、>=、 ==。关键字有:keep 和ignore。 其范围限制格式有下列三种: low_limit operator keyword high_limit keyword operator low_limit keyword operator high_limit 例子如下: cap=calculateParasitic(c1 + c2+ c3 + c4 ignore<0.1) cap=calculateParasitic((log(c1)*1.3e-6)+(c2*0.054)+1.4 ignore<0.1) 第一句表示将c1 c2 c3 c4的值加起来赋给cap,如果值小于0.1就忽略。 MeasureFringe语句介绍: 这个函数一般是在层的边缘按照相应的DRC语句来进行测量,他不能测量有覆盖关系的层 次。一般用它来描述边缘寄生电容或是侧墙寄生电容。 该函数的语法如下: outvalue=measureFringe(layer1[layer2]calculate[printls “filename” ][grouded][ML Flayer][limit] drc_command) outvalue:数值形式,只能为参数(parameter)提取或是寄生参数(parasitic)提 取语句来引用。如:calculateParasitic、calculateParameter等等。 Layer1:被测量的基本层,必须为connected layer Layer2:DRC语句所需的第二层 Caculate:关键词calculate+(formula),在formula中长度用l,间距用s表示。 其中formula中使用的运算公式同calculateParasitic中的expression相同。 例如: calculate(l/s) calculate(l/log(s)+2.0) printls:将测量出的length和spacing只输出至一个名为“filename”的textfile 中。这个文件具有下例的形式: ;Node name to number mapping vdd 1 gnd 9 q* 13 q 15 ;length spacing net1 net2 5.5 1.0 1 13 2.5 0.5 1 13 2.5 0.5 1 15 9.5 1.0 9 15 这个文件包括两个部分,第一部分将名称和节点匹配。第二部分按length、spacing的顺 序列出相应节点间的测量值。 下面介绍一下measureFringe函数的执行步骤: 1. 找到满足DRC规则描述的下一对边 2. 测量其l和s 3. 计算边之间的电容 4. 决定边的net number 5. 将两节点间新算出的电容加到总体上去 6. 有更多的边,转到第一步 7. 按limit筛选值 注意如果当前文件夹中已经存在有同名文件,将会被覆盖,所以在多次使用printls时, 要注意使用不同的文件名。 Grounded:将测量出的寄生参量值转换成为两个分离的测量值(nets到地)。如果你没有 定义groundnet,系统将会自动赋值为0!. ML Flayer:定义的临时层次,为multiLevelParasitic函数传递消息。 Drc_command:与普通的DRC命令无异 Limit:同前所述 例子:fcap=measureFringe(metal calculate(l/s) sep<3 parallel opposite) mp=measureFringe(metal poly calculate(sqrt(l+3)/log(s)) ignore<0.1 1 MeasureParasitic语句介绍: 这个函数通过测量层次或层次之间的关系来获得寄生参数。然后可以用saveParasitic命 令来保存提取出来的寄生参数。该函数的语法如下: outValue = measureParasitic( operator ( layer1 [function layer2]...)[coeff][application] [grounded] [polarized]][limit] ) outValue:表示的是提取出来的数据值保存在那里,这个值只能由相应的寄生参数提取语 句如calculateParasitic和saveParasitic来访问使用。 Operator:操作符,包含area(面积,可以使用关系操作符如over、not_over 等)perimeter(周长) length、 bends_all(所有的bends)、 bends_full(大 于45度的bends)、 bends_parts(小于等于45度的bends)、 corners_all(所 有的corners)、 corners_full(大于等于90度的corners)、 corners_parts(小 于90度的corners)、 angles_all(所有的bends和corners)、 angles_full(大 于等于90地 angles)、 angles_parts(小于90度的angles)、fig_count(计算 inlayer2为inlayer1所包含<可以内切>的图形)。 如下图例: Layer1:表示的是要测量的层次, 一般要求是连接层(connected layer)。 Function:表示的是要测量的层次之间的关系。如butting、 coincident, over, not_over, outside、 inside、 enclosing等,其中除去over、not_over外的 其余的functions所操作都是边界(edge)。 Layout2:表示的是要测量的第二个层次。 Coeff:系数,用于转换单位。如:将平方微米(电容)的单位转换成法。 Application:定义测量如何进行,有几种方法。填figure表示的是,根据图形提取数 据,然后用attachParasitic命令把数据添加到原有的器件上。填two_net表示的是, 根据定义的两个层次(layer1、layer2)产生一个二端口(两个节点)的寄生器件。在 填two_net时有几点需要注意的地方: 1. 如果第一节点和第二节点相同,则不进行测量 2. 如果没有指定第二层或是所有的后续层次前面的fuction是not_over或是 outside。则系统默认得第二节点将是groundNet或是0!(没有指定groundNet)。 3. 采用0!作标志的原因是:0作为net number在一般的extraction中不会出现, 所以它不会同其它的net number冲突。而!则应用的是schematic editor中指 定globel net的方法。 4. 有相同net number的nets的测量在同一个measureParasitic命令中将会被合 并。 填one_net表示的是第一节点同groundNet(0!)间的测量。填three_net 将同 two_net一样选择节点。它所要选择的第三个节点的号码源于前缀不是not_over或 outside的第三层,但如果第三节点与第一节点相同的话,测量将被忽略。下面举个例子, 如下图: 如果你所要提取得是A和B的公共面积到地所生成的寄生电容,你可以这样表示:A over background over B,然后使用two_net application。但是,如果出现这么一种情 况,A和B属于同一个net,那么在使用two_net语句时,就会得到一个我们并不想得到 的寄生电容。可是如果换作使用three_net语句,那么这个我们并不欢迎的电容将并不会 被系统所考虑。 Grounded:表示产生的寄生器件分别是在layout1, layout2和地线之间。注意,由于 one_net同grouded的意义相同,它们是不能同时使用的。 Polarized:表示的是有极性的寄生器件,从layout1到layout2, 和反过来是不一样 的,如二极管。 Limit:同前。 例:cap=measureParasitic( area ( poly over mental ) 0.03 two_net ) 表示得到poly和mental这两层之间重叠的面积,再乘一个系数。得到的是一个两端的器 件。 diode=measureParasitic( area ( ndiff over pbase not_over ntub ) two_net polarized )表示是不在ntub上,在pbase上的面积。得到的是一个两端有 极性的器件。 MultiLevelParasitic语句介绍: 这个函数通过测量组合层次图形的面积或边长来生成寄生电容。它可以控制层的优先级(与 measureParasitic不同),其产生的电容的终端必须是连接层或是源自连接层。该函数 的语法如下:outvalue=multiLevelParasitic(layers(layer1 layer2 …)cap(layerA layerB c1 c2 [c3[c4]] [shield(layers c5) [fringe(layerAB layerF [vertical(..s..)]) [grounded][limit]] outvalue:同前。 Layers(layer1 layer2 .. layerN):一次最多16层,还包含fringe中指定的特 殊层次,这些层次的列举顺序指明了优先级。列举的第一项被认为是版图中的lowest layer。在这个层次列表中至少得有两个层次。 系统在下述情况满足的条件下生成电容: 1. 两层有重叠 2. 两层不属于同一个electrical net 3. 两层间没有别的层次的图形存在 如下图: layer1和layer4间的电容(A)是这两层相重叠的面积减去layer2、layer3插入其 间的部分。相当于语句: layer1 and layer4 andNot layer2 andNot layer3 cap:它有下面的形式: cap(layerA layerB coeff1 coeff2 [coeff3[coeff4]][shield()][fringe()]) layerA和layerB在前面的层次列表中必须列出。Coeff任旧起到单位转换的作用。不 需要的coeff可设为zero或是nil。 LayA和layB在cap语句中的顺序是无关紧要的,我们一般习惯于保持层次列表中的顺序。 Coeff1:layer1和layer2间的转换系数。无论所测面积是如何形成的。如下图: coeff2和coeff3:前一系数用于layer1的边界与layer2形成的电容。后一系数用于 layer2边界与layer1形成的电容,如图示: 如果coeff3缺省而又没有注明nil或是zero,系统赋予其coeff2的值。 Coeff4:layer1的边界和layer2的边界组成的电容。如图示: shield:用于调整层间的电容(当两层间有其它层次时),如下图: 由于两层间有间隔层,所以c1的值比layer1和layer2间overlap所带来的电容值要 小。这个效果可以通过给shield赋上一个负的系数值来达到。我们所提供的系数必须对 各种寄生电容给予充分的考虑。如A图中c2+c4或c3+c5。其格式为:shield(layer coeff)。 如下图给出了各种系数的一个图示: fringe:语法格式为:fringe(caplayer Mllayer vertical(..s..) lateral(..s..)) Caplayer:cap中定义的layer1或layer2。 Mllayer:由measureFringe命令产生的伪层次,用于在measureFringe和 multiLevelParasitic这两个函数间传递消息。 vertical:通过修改这个系数来补偿周边寄生电容对垂直寄生电容产生的影响。 Lateral:通过修改这个系数来补偿垂直寄生电容对周边寄生电容产生的影响。 下面有几个图例: 其中c代表的就是垂直寄生电容、S代表的是周边寄生电容。 事实上vertical和lateral都是作为调整参数出现的,它们之间是互动的。 下面有些特殊情况,如图: 如果两图形周边间距为零,将不会有任何vertical或是lateral的调整。图A中在零 间距地边缘电容(fringe capacitor)和垂直边界电容(vertical edge capacitor) 间没有任何调整关系。图B中,中间一层是作为shield layer出现的,所以也没有任何 垂直边界电容或是0间距边缘电容需要调整。 下面是两个例子: 1. Cap(metal1 diffusion 0.74 0.12 0.23 0.14 shield(poly –0.05)fringe(metal1 Fmetal vertical (-0.15/s)) .coeff1=0.74 .coeff2=0.12 .coeff3=0.23 .coeff4=0.14 .poly层是metal1和diffusion间的shield层,具有电容调整系数-0.05 .Fmetal层在前面measureFringe语句中已经定义 .所有的metal1的边界电容系数将有一个-0.15/s的调整,其中s是measureFringe 中定义的图形周边距离。 2. Cap=multiLevelParasitic(layers(diff poly metal) cap(diff poly 0.35 nil) cap(poly metal nil 0.13) ignore<0.1) AttachParasitic语句介绍: 这个命令将measureParasitic命令中测量出的寄生参数值作为属性赋给器件。注意属 性值只能从measureParasitic和caculateParasitic中得到,而不能从器件参数测 量命令measureParameter中获取。 AttachParasitic(measurement propname device_layer [attach_layer][shared]) Measurement:measureParasitic或caculateParasitic函数中得出值所在地文 件。 Propname:定义属性的名称,有三种方式: 1. 引号内。同一器件的所有测量都集中为一个属性。如“sdcap”。 2. 属性名列表。每个测量对应一个属性名,若测量数>属性名数,则剩余值将被加入到第 一属性中,反之,则多余属性名不用。如:”source_cap” “drain_cap” 3. (“source_cap” “S”) (“drain_cap” “D”) device_layer:在extactmos或是extractDevice中定义的device recognition layer。同样可以是使用像geomInside或是geomGetTexted这类命令 从device recognition layer中选出的部分,但其属性值仍将赋给device recognition layer。 Attach_layer:括在括号中的层次列表。是与device_layer相关的层次。其关系可能 是lapping、touching、nesting。 Shared:能让一个图形参数的测量值根据它所附属的device的数目来均分。没有这个参 数,测量值将赋给每一个device。 例: 1. AttachParasitic(sdarea “sdcap” gate) 将s、d的面积作为单一电容附加到器件上 Parasitic(sdarea “scap” “dcap” gate shared) 将s、d的面积分开作为电容附加到器件上 3.Attachparasitic(sdarea (“scap” “s”) (“dcap” “D”) gate shared ) 带有终端的定义 4. AttachParasitic(coll_area “coll_cap” npn tub) 通过npn的集电极与tub的关系确定寄生参数。 SaveParasitic语句介绍: 将测量值作为寄生器件保存到extracted view中,在view中相应位置会产生相应器 件,而这些测量值将作为属性保存。 saveParasitic( measurement terminal1 terminal2 propname model ) measurement: 可以是一个列表。如果有多个值的文件被定义,将会产生一个拥有多重 属性的寄生元件。 Terminal1, terminal2:表示的是器件的端口,如果上面measureParasitic中选上 了polarized,那么要注意端口的一一对应。 Propname:属性名称,用双引号引起来。如电容中的c表示的是容值。”c”。 Model:表示寄生器件参数的模型,也用双引号引起来。如”pcapacitor” 例:saveParasitic( cap "PLUS" "MINUS" "c" "pcapacitor" ) 这一条语句表示把cap这个值存成pcapacitor模型,数据存在c参数中,表示寄生的电容 值。
版权声明:本文标题:Cadence使用手册经典 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/p/1735431273a1663246.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论