640 likes | 1.08k Views
HSPICE 简介. 周伶俐 2006/05/31. lilingzhou1982@163.com. 一 .HSPICE 简介. SPICE ( S imulation P rogram for I ntegrated C ircuits E mphasis) PSpice (MicroSim Corp.) ——PC version of SPICE HSpice (Avant!.) ——runs on workstations and larger computers. Hspice 和 Pspice 的区别.
E N D
HSPICE 简介 周伶俐 2006/05/31 lilingzhou1982@163.com
一.HSPICE 简介 • SPICE (Simulation Program for Integrated Circuits Emphasis) • PSpice (MicroSim Corp.) ——PC version of SPICE • HSpice (Avant!.) ——runs on workstations and larger computers
Hspice和Pspice的区别 • Hspice可以支持sun,hp,sgi,ibm,ux,pc(win2000,win98,nt,linux)支持多线程工作,sun-mt,hp-mt,pc-mt .... • 不过由于两者的引擎都是脱胎于spcie2g.5所以在运算能力上差别不是很大,但是hspice的功能要比pspice强大,特别是在收敛上面加了很多option,由于hspice在业界20多年,有着强大的model支持,使它在业界有着特别良好的应用,以至于成为了业界的一个标准。
Hspice和Pspice的区别 • 缺点就是,对内存敏感,内部是frotran写的采用类似c指针的方式对内存地址进行操作,大概只可以做5000个晶体管,速度很慢 • 其实在有效的2000个晶体管以上的电路就应该考虑用cadence,主要比起Hspice来说,cadence在电路收敛性问题比较少。(后面会讲到收敛性问题)
简单电路正向设计的典型流程 • 功能定义 • 行为设计 • 逻辑级电路设计——得到由基本逻辑单元组成的电路(数字电路) • 逻辑级仿真(迭代) • 选择合适的工艺库。把各基本功能单元映射至其上;或设计各单元晶体管级电路——得到电路级网表
电路级仿真:验证各单元电路是否具有期望的功能,性能估计。(迭代)电路级仿真:验证各单元电路是否具有期望的功能,性能估计。(迭代) • 版图设计、DRC, LVS • 提取版图网表,进行后仿真:验证功能,估计性能。(迭代) Hspice主要应用于电路级仿真、分析。可以辅助调整电路参数。得到功耗、延时等性能估计。
前端功能 MetaLib CDF Symbol Library Schematic HSPICE Netlist Netlister HSPICE Simulation Parameter Changes Wave Data 反标注 Analysis Hspice的流程 后处理
Hspice有哪些功能? • 电路级和行为级仿真 • 直流特性分析、灵敏度分析 • 交流特性分析 • 瞬态分析 • 电路优化(优化元件参数) • 温度特性分析 • 噪声分析 • 傅立叶分析 • Monte Carlo, 最坏情况,参数扫描,数据表扫描 • 功耗、各种电路参数(如H参数、T参数、s参数)等可扩展的性能分析
*title 输入文件的标题 options 设置模拟的条件 Analysis statement 设置扫描变量、设置分析模式 .print/.plot/.graph/.probe 设置输出结果的显示方式 Sources (I or V) 设置输入激励 netlist 电路网表 .lib 元件库 .model libraries 元件模型描述 .end 结束语句 Hspice的输入——网单文件 文件结构:
Hspice的输入——网单文件 • 例(The Star-Hspice netlist for the RC network circuit) : • *title A SIMPLE AC RUN • .OPTIONS LIST NODE POST • .OP • .AC DEC 10 1K 1MEG • .PRINT AC V(1) V(2) I(R2) I(C1) • V1 1 0 10 AC 1 • R1 1 2 1K • R2 2 0 1K • C1 2 0 .001U • .END
举例 SIMPLE RTL INVERTER $ Title *Circuit Description VCC 4 0 5 VIN 1 0 PULSE 0 5 2NS 2NS 2NS 30NS RB 1 2 10K Q1 3 2 0 Q1 RC 3 4 1K .MODEL Q1 NPN BF 20 RB 100 TF .1NS CJC 2PF $ Device Model * Analysis .DC VIN 0 5 0.1 .TRAN 1NS 100NS *Output .PLOT DC V(3) .PLOT TRAN V(3) (0,5) .PRINT TRAN V(3) .END $Necessary
二. 词法 • 1. 不区分大小写(case insensitive) • 2. 标题行——第一行 • 3. 注释:* or $ • 4. 续接符:+ • 5. 非线性器件要用 .MODEL statement. • 6. 0, GND, GND!, GROUND 表示全局地. • 7. 表示数量的词尾: T(= 1E12 or 10+12); G(= E9); MEG(= E6); K(= E3); M(= E-3); U(= E-6); N(= E-9); P(= E-12), and F(= E-15),默认是国际单位。(关键不要搞错M和MEG) • 8. Output variables:(后面会有详细的讲解) Voltage between two nodes: v(n1,n2) Voltage of a node relative to ground: v(n1) Current through an independent source: i(vin)
*与$注释的区别 • 一个星号(*)或一个美元符($)作为第一个非空行字符表明一个注释说明 • 语法 • * <comment on a line by itself> • 或 • <HSPICE statement> $ <comment following HSPICE input> • 例子 • *RF=1K GAIN SHOULD BE 100 • $ MAY THE FORCE BE WITH MY CIRCUIT • VIN 1 0 PL 0 0 5V 5NS $ 10v 50ns • R12 1 0 1MEG $ FEED BACK • 你可以把一个注释说明放在电路描述的任何地方。 • *必须在一行的第一个空格处。 • $用作说明并不必在一行第一个空格处(例如,在同一行紧跟Star-Hspice输入的说明)。$必须在一个空格或逗号之前,如果它不是第一个非空白字符。 • 文件或节点名内允许使用$。
1. .INCLUDE Statement • .INCUDE语句:引用一个文件,被引用的文件置于引用文件前。 例: LNA .include “me98xxxx/model.sp“ ···
2. .PARAM statement • Syntax: .PARAM <parametername> = <Expression>' • Example: .PARAM width = 20u .PARAM length = 'sqrt(width)*1.65' M1 3 2 0 0 NMOS width length
3. .DATA statement • .PARAM width = 10u .PARAM length = 6u .PARAM RL = 1KM1 3 2 0 0 NMOS width length Rload 3 5 RL .TRAN 1n 1000n SWEEP DATA=D1 .AC DEC 10 1hz 1GHz SWEEP DATA=D1 .DATA D1 width length RL + 50u 20u 1K + 60u 10u 10K + 100u 25u 1K .ENDDATA
4. .ALTER • 可以使用.ALTER语句并使用不同的参数和数据以返回一个仿真结果。 • 语法 .ALTER <title_string> title_string是任何最长至72个字母的字符串。.alter运行所需的合适的字符串在每个输出列表文件和图形数据文件(.tr#)的标题部分打印出来。
.ALTER • Vin node1 node2 dc h1 .alter change VIN=5 .PARAM h1=5V • .ALTER FF .DELLIB 'D:\TEST\PROCESS\0.6U BCD V0.1PHASE1.lib' TT .LIB 'D:\TEST\PROCESS\0.6U BCD V0.1PHASE1.lib' FF SS TT FF SF FS
1. The most important rules • no duplicate nodes不能重复定义节点 • zero for your ground node地确定是0 • no floating nodes 不要有悬空节点
2. Node names • 对于仿真中关键的节点最好给一个有意义的命名 • 节点名字的有意义化会方便你直接观看输出的结果,避免再回到图中对照。
3. 元器件描述 • Vxx—独立电压源 Ixx—独立电流源 • Exx-电压控制电压源 Gxx-电压控制电流源 • Hxx-电流控制电压源 Fxx-电流控制电流源 • Sxx-电压控制开关 Wxx-电流控制开关 • Rxx-电阻Cxx-电容 • Lxx-电感 Kxx-互感 • Dxx-二极管 Qxx-三极管 • Mxx-MOS Jxx-JFET • Xxx-模块
3. 元器件描述(续)--几种常用电源 • Sinusoidal sources Vname N1 N2 SIN(VO VA FREQ TD THETA PHASE) Vname = VO + VA exp[-THETA.(t - TD)] sin[2pi.f (t - TD) + (Phase/360)] • PWL Vname N1 N2 PWL(T1 V1 T2 V2 T3 V3 ...) Example: Vgpwl 1 2 PWL(0 0 10U 5 100U 5 110U 0)r 间隔时间 • Pulse Vname N1 N2 PULSE(V1 V2 TD Tr Tf PW Period)
下面是由前面举例的CMOS反相器组成的三级反相器链网表:下面是由前面举例的CMOS反相器组成的三级反相器链网表: …… .global vdd .SUBCKT INV IN OUT wn=1.2u wp=1.2u Mn out in 0 0 NMOS W=wn L=1.2u Mp out in vdd vdd PMOS W=wp L=1.2u .ENDS X1 IN 1 INV WN=1.2U WP=3U X2 1 2 INV WN=1.2U WP=3U X3 2 OUT INV WN=1.2U WP=3U CL OUT 0 1PF VCC VDD 0 5V …… 4. 子电路
5. .GLOBAL xx • This statement causes all nodes numbered xx, whether in the main circuit or a subcircuit, to be connected together. • 注意:Global的使用需格外小心,一般仅把电源定义成Global
6. .LIB 语句 • LIB 语句: .lib ‘<filepath>filename’ entryname 该语句根据文件路径和文件名来调用一个库文件,一般该文件包含器件模型。 例 .lib ‘MODELS’ cmos1 MODELS文件: ··· .MODEL CMOS1 nmos ··· 我们仿真中加库的语句应该是 .LIB 'D:\TEST\PROCESS\0.6U BCD V0.1PHASE1.LIB' TT
1. .OP Statement • 计算直流工作点指令,对于分析电路很有用(要会看.lis文件) • 一般在任何其它仿真之前都需要计算直流工作点 • .op time看某一时刻的各个器件和电源的状态。.op vol time某一时刻所有节点电压,.op cur time某一时刻所有器件和电源的电流。.ac.dc是初始工作点,.tran默认时间是0。
2. .DC Statement • 对参数和独立电源扫描 • .DC SRCname START STOP STEP • 注意: 1)对独立源扫描时,SRCname为电源名,而非节点名 2)仿真迟滞特性要正、负双向扫描, 如: .DC Vin 0 5 0.1 .DC Vin 5 0 -0.1 3) 注意对两个量的扫描,后面的是外循环
.DC对参数的扫描 • 对参数的扫描 • 例如:vin 1 2 dc H1 .param H1=10v .dc H1 0 20 1 • 对温度的扫描: .dc temp -20 80 1
3. .TRAN Statement • .TRAN: .TRAN var1 START=start1 STOP=stop1 STEP=incr1 or .TRAN tincr1 tstop1 <tincr2 tstop2 ...tincrN tstopN> + <START=val> <UIC> 起始时刻和步长都指的是输出打印的时刻点,计算的时间步长由hspice自己决定。UIC参数表示使用.IC语句指定的节点初始值。 例:.TRAN .1NS 25NS 1NS 40NS START=10NS 0-25ns,步长0.1ns,25ns-40ns,步长1ns;从10ns开始输出结果。 .TRAN 1NS 100NS $以1ns的步长输出到100ns
4. .AC Statement • .AC: 一般频域扫描: .AC type np fstart fstop <SWEEP var start stop incr> Or .AC type np fstart fstop <SWEEP var type np start stop> Or .AC var1 START = start1 STOP = stop1 STEP = incr1 例:.AC DEC 10 1K 100MEG 1kHz-100MHz,每10倍频10个采样点。
Ac type • 一共有4种 DEC – decade variation. OCT – octave variation. LIN – linear variation. POI – list of points. • 例如 .AC DEC 10 1K 100MEG .AC LIN 100 1 100HZ .AC DEC 10 1 10K SWEEP cload LIN 20 1pf 10pf .AC DEC 10 1 10K SWEEP rx POI 2 5k 15k
5. .NOISE— AC Noise Analysis • 噪声分析: 用来计算各个器件的噪声对输出节点的影响并给出其均方根并输出,可完成.AC语句规定的各频率的计算,应在.AC分析之后。 .NOISE ovv srcnam inter Ovv-输出变量,srcnam-输入源,inter-频率间隔 例:.title ac sweep example .OPTIONS POST R1 in 1 5 C1 1 0 500pf V1 IN 0 0 AC=10V,37 .AC OCT 10 1 100MEG .noise v(1) v1 20--分析1点电压的噪声情况,噪声源为V1端口 .END
Lis文件中输出的噪声分析结果 1 ****** Star-HSPICE -- 1999.4 (19991220) 22:12:12 04/16/2002 pcnt ****** .title ac sweep example ****** noise analysis tnom= 25.000 temp= 25.000 ****** frequency = 1.0000 hz **** resistor squared noise voltages (sq v/hz) element 0:r1 total 8.233e-20 rx 5.0000 **** total output noise voltage = 8.233e-20 sq v/hz = 286.9260p v/rt hz transfer function value: v(1)/v1 = 1.0000 equivalent input noise at v1 = 286.9260p /rt hz **** the results of the sqrt of integral (v**2 / freq) from fstart upto 1.0000 hz. using more freq points results in more accurate total noise values. **** total output noise voltage = 0. volts **** total equivalent input noise = 0. …….
1. .PRINT, .PLOT and .PROBE • .PRINT:在输出的list文件中打印数字的分析结果,如果.OPTIONS中有POST则同时输出到post-processor中。 • .PLOT:在输出的list文件中打印低分辨率的曲线(由ASCII字符组成),如果.OPTIONS中有POST则同时输出到post-processor中。 • .GRAPH:生成用于打印机或PostScript格式的高分辨率曲线。 • .PROBE:把数据输出到post-processor,而不输出到list文件。
.PRINT, .PLOT and .PROBE • Examples: • .PLOT DC V(1,2) V(3) I(Vmeas) • .PRINT TRAN V(3,1) I(Vmeas) • .PLOT AC VM(3,0) VDB(4,2) VM(2,1) VP(3,1) IR(V2) • 注意:使用par计算参数的值 例:print dc i1=par(‘V(X1.node3)’)
输出某个器件的流过的电流 • 可以直接输出也可以通过间接的方法 • 间接的方法就是电路中串联0电阻和0电压源来看某个支路或者某个器件上的电流。 • 直接的方法有两种 • 1. 利用里面规范的语句看器件的电流 BJT ic( ) ib( ) ie( ) MOS id( ) ig( ) is( ) Diobe i( ) RES i( ) 例:.print dc ic(q1) • 2.利用.par语句
输出某个器件的流过的电流 • .print i1=par(‘i1(Q118)’) i2=par(‘i1(r1)’) • I1,i2,i3,i4对于不同的器件有不同的含义,具体如下
gain • Vin node1 node2 dc 10 ac 1 • .ac dec 10 1k 1meg • .print vdb(‘vout’) • .print vdb(‘vout/vin’) • .print ac gain=par('vdb(vout)') • Vout是输出节点。
2. Options statement • .OPTIONS: 该语句允许用户重新设置程序的参数或控制程序的功能。常用的一些如下: node: 列出个节点的元件端点,便于查错; post: 使输出数据可以使用 AvantWaves 浏览(即将数据输出到post processor; list: 列出元件列表; MEASDGT:.MEASURE语句输出的有效数字位数 • 语法:MEASDGT = x,The value of x is typically between 1 and 7, although youcan set it as high as 10. The default value is 4.0.
2. Options statement • 例:.option post probe AvantWaves只观察.probe语句输出的变量。 • 除了以上的还有其它的参数详细hspiceguide中的P387页。 • 常用的是fast,bypass=0 加速仿真,但是会牺牲精度。(P426页)
3. .MEASURE statement • 使用.MEASURE语句去修改信息和定义连续的仿真结果 • .MEASURE语句打印使用者定义的一个电路的电气规范并大量地用于最优化。规范包括在一个特定的时间内的传播,时延,上升时间,下降时间,峰间(peak-to-peak)电压,最小和最大电压和大量使用者自己定义的变量。带有错误模式和GOAL参数,.MEASURE也广泛地用于组件值的优化和为参数模型寻找合适的测量数据。其结果保存在*.mt0文件中。