hspice简明使用手册
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
HSPICE简明使用手册
水平有限,如有错误请予以改正。
还有很多的功能不太了解,希望大家都来补充完善。
谢谢!大家也可以把一些自己在调试过程中的bug 汇总到一起,给大家作参考。
方便以后少犯这种错误,最好加上为什么错了,如何改正。
我会建立一个名字为our_bugs_go_away的文件夹来放大家调试过程中的bug。
如果你认真看了正文中的红字部分,应该就可以使用hspice的基本功能来实现电路模拟。
附录中会有基本的语法,供大家查阅,不一定很全。
1. 常用文件类型
.sp 网表文件输入文件
该文件是hspice唯一的输入文件,用网表形式描述电路。
下面会专门讲解该文件的几个基本构成。
.mt0 中存放测试数据输出文件
.lis 中存放仿真的过程以及仿真时的错误输出文件
2. hspui按钮的作用
Open 打开.sp文件
Simulate 仿真开始
Edit LL 观察.lis文件,debug
Edit NL 修改.sp 文件
Avanwaves 观察模拟波形
Explore 找到模拟中所用文件的文件夹
3.AvanWaves 使用
用来观察模拟得到的波形
3.1 results brower 对话框用来选择要看的是那种分析(tran,dc,ac)的那种波形,双击你要看的波形就可以了。
3.2主面板
3.2.1窗口
panel# 用来看波形
wave list 观察波形的列表
3.2.2按钮
panels 观察窗口个数控制
window 观察窗口显示控制
measure 测量控制,有对某点的测量和点到点的测量
configuration 不明
tools 不明
3.3快捷按钮
3.3.1 results brower 的开关按钮
3.3.2变量运算函数编辑器
3.3.3打印
3.3.4测量某点坐标
3.3.5两点间坐标检测
3.3.6窗口显示控制
4..sp 文件介绍
对于一个用hspice模拟的电路,一般可以分为两个部分来描述:
1 电路单元的.sp文件。
名字多为:unit.sp 比如:nand2g.sp
它一种子电路的形式,就像我们电路中的一些小单元或者Verilog中的module,用来调用,。
可以参考程军老师给的.sp文件。
2 电路整体.sp文件。
名字多为:sim_unit.sp 比如:sim_nand2g.sp
一般为电路的顶层部分,用来调用单元电路,用网表来描述整个电路,并声明激励源来模拟。
可以控制模拟的类型,是直流模拟.dc ,交流模拟(频域分析).ac ,瞬态模拟.tran。
这个文件就像是Verilog中的top + testbench。
当然编写网表文件的风格多种多样,这只是其中一种。
在流程后面会有一个.sp文件的讲解,告诉大家.sp文件有哪些基本部分,如何写.sp文件。
.sp文件的构成
以程序为例
5. 完整的模拟流程:
直接用记事本建立.sp文件,只要改一下文件扩展名即可。
或者直接复制一个.sp文件改个名字。
(下面的内容不用细看,只要知道有哪些步骤)
1 建立模型(一般采用现成模型,直接利用.lib 命令调用。
采用何种模型由工艺来定)NMOS 和PMOS的模型
2 子电路建立(例子:nand2g.sp)
描述该子电路的晶体管连接和长宽等即可。
3 编写模拟程序(例子:sim_nand2g.sp)
详见下面对模拟程序的说明。
4 利用hspice软件模拟步骤
下面的红色英文为hspui的按钮(hspui 为hspice的用户界面)
01 open hspui.exe(一般在开始菜单中,有点多余~)
02 Open .sp file(sim_nand2.sp,the simulating netlist)
03 Simulate(点击面板中的按钮)
04 open.lis(Edit LL)
find the syntax errors or measurement result
note: use Ctrl-F to locate the target
05 if there are errors, modify the .sp files(Edit NL)then go to step 3
06 open Avanwaves(可以跳转到上面看) to see the waves()
.sp文件的编写(文件中的大小写没关系)
1 单元子电路网表的编写(例子:nand2g.sp)
简言之:起名字,连节点,分类别,写参数
例子:
mp out in vdd vdd pmos w=wp l=0.25u
(到底器件有哪些节点,参见附录中的语法)
起名字(mp):就是给每个晶体管(也可以是电阻电容)起个名字
连节点(out in vdd vdd):说明每个晶体管的节点
分类别(pmos):写出这个晶体管是什么类型的,P,N
写参数(w=wp l=0.25u):给出晶体管参数,就看模型是怎么建的,需要哪些参数。
晶体管—W,L ;电阻—阻止;电容—电容值
当你把每个晶体管都的节点都说明清楚后,一个子电路也就诞生了。
2 模拟程序电路网表的编写
包含部分:后面为对应的指令
0) 标题-- .title (可有可无)
1) 器件模型-- .lib
2) 全局变量声明-- .global
3) 参量声明-- .param
3.5) .data c_tab …… .enddata(可能有)参量表,扫描参数时用到
4) 直流工作点分析-- .op (这个东西不一定要有,与.UIC文件有关,可以自己看,但是一般要写)
5) 模拟类型(可以用多种或一种,在看波形时就知道区别了),有瞬态分析 .tran ,
有直流特性分析.dc ,有交流特性(频域分析)分析.ac 。
6) 电路网表,利用已经建立的子电路搭建一个测试电路,并且声明好电路的激励。
实际就是将节点连接正确。
7) 测量语句,利用.measure 来测量一些参数,比如延迟,上升延时,下降延时等。
8) .end 结束语句。
子电路的开始结束:.subckt -- .ends
参量网表:.data c_tab -- .enddata
顶层电路:-- .end (不用开头)
以程序为例来分析如何写.sp 文件:
说明文字用括号括起来
************* simulation file for nand2 gate **************
(‘*’用来注释,和C中的’//’作用相同)
.lib "../spice_model/cmos25_level49.lib" TT (器件模型声明,这是个cmos模型)
.global vdd (全局变量声明,全局变量是vdd)
.param vsupply=2.5 (参量声明,就像C中参量,参量是vsupply,大小为2.5V)
(hspice 中的单位多可以省略,只有表示数量级即可。
).param cload=0.5p
.param trantime=0.1n
.data c_tab
(扫描参量表,扫描的参量是trantime,cload,一共16组数据,在.mt0中会有16组测量数据,看图时也会有16条曲线。
)
trantime cload
0.1n 0.1p
0.1n 0.2p
0.1n 0.3p
0.1n 0.4p
0.1n 0.5p
0.2n 0.1p
0.2n 0.2p
0.2n 0.3p
0.2n 0.4p
0.2n 0.5p
0.3n 0.1p
0.3n 0.2p
0.3n 0.3p
0.3n 0.4p
0.3n 0.5p
0.4n 0.1p
0.4n 0.2p
0.4n 0.3p
0.4n 0.4p
0.4n 0.5p
.enddata
.op (直流工作点计算)
.tran 0.1ns 200ns sweep data=c_tab
(瞬态分析,从0-200ns,步长为0.02ns。
并且上面声明的trantime 和cload两个的扫描参数)
.dc vsim1 0 2.5 0.02
(直流分析,从0-2.5V,步长0.02vsim1 相当于产生一个电压值线性增加的电压源)
.dc vsim2 0 2.5 0.02
.option post nomod (控制选项,主要控制输出结果,可以见附录)
(下面是网表声明)
vdd vdd 0 vsupply
vsim1 in1 0 dc=vsupply pulse 0 vsupply 0 trantime trantime 10ns 20ns
vsim2 in2 0 dc=vsupply pulse 0 vsupply 0 trantime trantime 23ns 46ns
.include ./nand2g.sp
c0 outp 0 cload
x1 in1 in2 outp nand2g wp=2u wn=2u
(测量语句声明)
.measure tran tdlay1f trig V(in1) val=0.75 td=55n rise=1 targ V(outp) val=0.75 fall=1
.measure tran tdlay1r trig V(in1) val=1.75 td=35n fall=1 targ V(outp) val=1.75 rise=1
.measure tran tdlay2f trig V(in2) val=0.75 td=41n rise=1 targ V(outp) val=0.75 fall=1
.measure tran tdlay2r trig V(in2) val=1.75 td=21n fall=1 targ V(outp) val=1.75 rise=1
.end
常用命令:关键字前都有一个“.”
1) .lib 调用模型,以及时TT还是FS或者FF之类的。
一般用TT
2) .global vdd 全局变量声明,一般是vdd
3) .param 参量声明,可以是个扫描用的可变参量,也可是像宏一样的声明
比如
.param vsupply=2.5
3.5) 参量表
.data c_tab
trantime cload
0.1n 0.1p
0.1n 0.2p
0.1n 0.3p
......
.enddata
4) .op 直流工作点分析
5) .tran 0.1ns 200ns sweep data=c_tab 瞬态模拟,并且扫描c_table,从0ns到200ns,步长为0.1ns
6) .dc vsim1 0 2.5 0.02 直流扫描分析,变量名为vsim1,从0-2.5V,步长为0.02
7) .option post nomod post说明数据可以用Avanwaves看,nomod不输出模型信息
8) . measure 测量语句
.measure tran tdlay1f trig V(in1) val=0.75 td=55n rise=1 targ V(outp) val=0.75 fall=1
常用器件、激励、VDD声明方法,电容电阻都用C和R开头命名。
晶体管用M开头命名,子电路用X开头命名,
vdd vdd 0 vsupply //vdd
vsim1 in1 0 dc=vsupply pulse 0 vsupply 0 trantime trantime 10ns 20ns //两个输入用脉冲
.include ./nand2g.sp //引用自电路文件
c0 outp 0 cload //电容
x1 in1 in2 outp nand2g wp=2u wn=2u //子电路
附录:
我的一些经验:
经验1 编写子电路时,一般不考虑负载,只描述晶体管。
模拟时加入别的。
模型已经考虑了寄生参数。
经验2 晶体管模型一般使用标准模型,利用.lib调用即可。
经验3 使用哪种工艺,晶体管的L一般就是多大。
经验4 晶体管模型一般都要描述宽度w,可以使变量也可以是参量。
最后可以利用扫描方式来优化。
如何优化很多时候要利用理论,比如梯形结构的。
经验5 引用模型时注意管脚对应关系。
经验6 .measure 输出到.mt0文件中。
与有哪些数据与扫描参数和测量数值有关。
经验7 参数表中的一组参数模拟一次,就产生一次的图像或者测量数据。
经验8 alter# 一般为1.0000,temper一般为标准温度25.0000
经验9 在使用.lib 的路径有问题时,放到可以成功的文件夹下就行。
但是怎么设置路径?路径到底该怎么写?。