每次跑完HSPICE仿真,看着密密麻麻的数据文件,很多工程师都会陷入"数据沼泽"——明明仿真跑完了,却不知道从哪里开始分析。其实仿真后处理就像淘金,原始数据是含金的矿砂,我们需要用合适的工具和方法把真正的"黄金"提炼出来。
我刚开始用HSPICE时也踩过不少坑。有一次仿真一个运放电路,跑完直接看波形图,觉得所有参数都正常,结果流片后才发现功耗超标。后来才发现是没用好.print语句筛选关键节点的静态电流数据。这个教训让我明白,有效的后处理不是看所有数据,而是精准捕获关键指标。
HSPICE提供了丰富的输出控制选项,主要分为三类:
举个例子,分析一个基准电压源时,我们可能关注:
spice复制.print dc v(n1) ; 输出节点n1的直流电压
.probe tran i(vdd) ; 监测电源电流随时间变化
.measure tran avg_power avg i(vdd)*v(vdd) ; 计算平均功耗
.print是最基础也最常用的输出指令,但很多人只用到了它10%的功能。除了基本的节点电压输出,它还能:
spice复制.print tran v(out*) ; 输出所有out开头的节点电压
spice复制.print tran iall(m*) ; 输出所有MOS管电流
spice复制.print tran v(n1)-v(n2) ; 输出节点电压差
实测发现,对于大型电路,过度使用.print会导致输出文件膨胀。我的经验法则是:首轮仿真先用.probe保存全部数据,分析确定关键节点后再用.print精准输出。
.probe与.print不同,它不直接生成文本输出,而是将数据保存为波形文件,适合图形化分析。几个实用技巧:
spice复制.option probe
.probe tran v(out) i(vdd) ; 只保存输出节点和电源电流
spice复制.probe tran X1.v(internal_node) ; 监控子电路X1的内部节点
spice复制.probe ac vdb(out) vp(out) ; 输出增益(dB)和相位
有个实际案例:在调试一个PLL电路时,通过.probe保存VCO控制电压波形,在波形查看器中用FFT功能发现了意外的低频抖动,这个用.print很难直观发现。
HSPICE的.option就像瑞士军刀,不同组合能解决不同问题。常用组合有:
spice复制.option post=2 ; 生成二进制波形文件
.option probe ; 只保存.probe指定信号
spice复制.option list ; 输出器件参数
.model_info ; 打印模型卡片
spice复制.option ingold=2 ; 压缩数据格式
.option numdgt=4 ; 控制数据精度
特别提醒:.option list会输出所有MOSFET的有效尺寸,对于验证版图后仿真特别有用。曾经发现过一个案例,版图中的MOS宽度因为DRC规则被调整,但设计者没注意到,导致电路性能不达标,就是靠这个选项发现的。
数值精度不是越高越好,需要平衡精度和效率:
spice复制.option numdgt=6 ; 默认4位,6位适合高精度需求
.option measdgt=8 ; 单独控制.measure精度
对于蒙特卡洛分析,建议降低精度提升速度:
spice复制.option numdgt=3 ; 蒙特卡洛仿真足够
这是一个实际项目中使用的运放评估模板:
spice复制* 关键信号定义
.probe tran v(out) v(inp,inn) i(vdd)
* 性能测量
.measure tran gain max v(out)/v(inp,inn)
.measure tran bw when vdb(out)=maxvdb(out)-3
.measure tran power avg i(vdd)*v(vdd)
* 控制选项
.option post probe
.option measdgt=6
这个模板可以一次性提取:
分析电源噪声时,我习惯用这个配置:
spice复制.print tran v(vdd) ; 电源节点电压
.probe tran i(vdd) ; 电源电流
.option captab ; 输出电容信息
.measure tran ripple pp v(vdd) from=1m to=10m
关键点:
曾经用这个方法发现过一个LDO的PSR问题——虽然静态性能达标,但在负载瞬变时会出现电压凹陷,这个现象需要同时观察电压和电流波形才能发现。
经常有人抱怨:"明明仿真跑完了,但我要的数据没输出"。常见原因和解决方法:
spice复制* 错误写法 - 没有关联分析类型
.probe v(out)
* 正确写法
.probe tran v(out)
spice复制.probe tran X1.X2.v(internal) ; 多级子电路路径
当遇到GB级别的输出文件时,可以:
spice复制.tran 1p 10n sweep ... ; 仿真步长1ps
.print tran v(out) step=10p ; 输出步长10ps
spice复制.option post=2 ; 二进制波形文件
.measure是后处理中最强大的工具,但也是最容易出问题的。常见陷阱:
spice复制* 测量时间段必须在仿真时间内
.measure tran risetime trig v(in) val=0.5 rise=1 targ v(in) val=0.5 rise=2
spice复制* 阈值设置不合理导致测量失败
.measure tran delay when v(out)=1.8 ; 可能永远达不到1.8V
经过多个项目实践,我总结出一个高效的后处理流程:
一个典型的脚本片段:
spice复制* 批量测量不同工艺角的增益
.param corner='tt'
.include 'models_`corner`.lib'
.measure dc gain find v(out) at=1m
.alter ff
.alter ss
最后分享一个实用技巧:建立自己的测量语句库,把常用的测量模板(如建立保持时间、带宽、相位裕度等)整理成可复用的代码片段,能大幅提升工作效率。我现在的库里有30+种标准测量模板,新项目直接调用,省时又避免出错。