引言
SPICE(Simulation program with Integrated Circuit Emphasis)作为电路级模拟程序,是许多仿真软件的核心,比如Tanner Tools、Cadence。
本文旨在向初学者介绍SPICE的概况、原理以及应用,帮助初学者对SPICE建立一个基础的概念。
目录
1、简介
2、原理
3、SPICE模型
4、应用
简介
SPICE是1972年伯克利大学开发的一个电路分析工具,但实际上它只是一个内核,提供核心算法SPICE。要使用各种各样的功能,需要跟它的各种壳(如PSPICE、HSPICE等)进行对话。
SPICE发展至今,已经由许多公司开发出了各自的仿真器,比如HSPICE、PSPICE、smart-SPICE、TSPICE、spectre等,其中最出名的当属HSPICE。当然其他的仿真器也具有各自的特色,比如spectre就是由Cadence公司开发的,它的运算速度更快,并且收敛性会更好。
具体的历史可以参见这篇文章,写的妙趣横生,SPICE简史。
原理
SPICE其实是一个解非线性常微分方程的工具,里面内嵌了器件、电路的数学公式。比如下方的关于MOSFET的公式
我们输入的网表文件,暗含了各个元器件的连接关系,就构成了一个个方程组,靠着计算机强大的算力,将这些方程组解出来,我们就能获得我们想要的信息,比如某个节点的电压,某条支线的电流。
这里提到一个概念叫做网表文件,网表文件是一个描述电路元件之间相互连接关系的代码,和我们想要仿真的电路是对应的。比如下图就是M1晶体管分别与out in vdd vdd四个电极相连
因此,我们可以把SPICE理解为一个输入是网表文件,输出是电路参数的盒子。但是,不同仿真器的输入文件在格式上有所差别,有些差别较小,比如TSPICE和HSPICE,只需要改一些细节就可以将一个仿真器的输入文件作为另一个仿真器的输入。但也有些差别较大,比如HSPICE的语法和spectre的语法就有较大的差别,两者之间的转换需要复杂的操作,过程可以参考这个链接。
除了输入文件不同,不同仿真器的输出结果也会有所差异,比如仿真一个晶体管的Id-Vg曲线,不同仿真器的结果会略有差异。因此,对于对器件性能要求比较高的仿真,应当观察哪个仿真器的结果和实际最为接近。
计算机在解方程的时候,实际上会不断迭代,向真正的解靠近,一旦迭代次数超过最大迭代次数,或者解是发散的,就可能会出现仿真结果不收敛的情况,这种情况,除了修改仿真器的内部算法,更可能的原因是电路设计上存在缺陷。
事实上,有意思的一点是,我们只要掌握了SPICE中的那些数学公式,我们甚至能利用MATLAB来进行仿真,当然,这只针对单个器件或者简单电路以及收敛性要求不高的情况下。我们曾经用matlab来仿真一个晶体管的Id-Vg曲线,其结果和HSPICE的仿真结果基本一样。这在一些特殊的领域,比如SPICE模型去和实际模型拟合时,具有重要的意义
SPICE模型
SPICE模型就是上文所说的一组表征器件物理性能的方程,其中包含具有物理意义的模型参数。但是对于一种特定的器件,其电学性能,遵循的电学公式往往是不一样的,比如MOSFET和TFT(薄膜晶体管),他们对阈值电压的处理,就有所不同。
因此,针对特定的器件,往往由具体的SPICE模型,对于一些常用的器件,比如NMOS,我们用一些自带的模型往往已经足够,但是对于一些特殊的器件,它的性能参数与它的生产工艺有关,它的模型往往由生产它的公司提供。
下面以HSPICE的模型为例,解释说明模型中的语句内涵
图片转载自https://wenku.baidu.com/view/c066b15f561252d380eb6ec1.html
mod1:模型名称,也就是网表文件中具体元器件调用的名称
nmos:元器件类型
VTO等其他参数:这些参数表现了这个元器件的特性,可以通过修改这些参数来修改元器件的特性,这些参数的集合被称为模型卡。
注:在SPICE模型文件中,往往还有一个LEVEL参数,用来指定哪一种模型,不同LEVEL之间的模型,其参数会有差别,当然也有为了模拟其他类型器件而建立的LEVEL比如LEVEL=62就是LTPS(低温多晶硅)TFT的模型。
往往这些参数在模型文件中已经有了一个缺省时的默认值(可以参见HSPICE的模型手册)
SPICE的这些参数有些具有实际的物理意义,有些是单纯的数学参数,有些参数甚至是根据实际的经验公式来制定的,具体的含义可以查阅模型手册。
LEVEL 58的部分模型参数
应用
知道了原理,那我们怎么对一个电路用SPICE进行仿真呢。就像我们之前说的,我们需要与一个仿真器进行对话,这里我们采用HSPICE来作为例子。
HSPICE对一个TFT进行Id-Vg曲线仿真
-
自己手写一个或者从其他软件导出这个电路的网表文件。对于不复杂的电路,可以直接手写,但是对于庞大复杂的电路,建议先用其他软件画出电路图,再导出这个电路图的网表文件。手写的话可以参照HSPICE的相关语法。
-
调用所用到的器件的模型,现在仿真器一般支持的模型库都比较全面,一般的模型文件都能识别。完整网表如下
-
进行仿真,根据电路的规模和复杂程度,仿真时间也会有所差别。这里可能会出现仿真结果不收敛的情况,这时候你需要检查下你的电路是否在一些点发生了冲突,或者可以换个仿真器进行尝试,或者修改仿真器的算法机制(更改迭代数、收敛的误差范围之类的)。