仿真波形看上去是连续的。开源电路仿真器 ngspice 从电路描述出发,用一系列离散计算生成波形,再把结果保存下来。要理解它的内部架构,可以沿着三个问题展开:电路如何连接,以什么状态开始,下一个时间步能否通过检验。[1][2][4]
当脉冲波形出现意外的肩部、放大器迟迟无法稳定,或仿真因时间步错误而中止时,这三个问题就有了实际意义。调整设置并再次运行之前,每个问题都指向一处值得排查的环节。
从图纸到连接关系
ngspice 项目对自身内部工作流程的介绍,从网表开始。在求解之前,程序先处理子电路、参数等内容,建立电路的内部表示,再组装矩阵,随后才进入仿真和输出处理。原理图编辑器可以给出电路描述,求解器处理的则是由此得到的数学电路模型。[1]
一小段输入就能说明其中的区别:R1 in out 1k 描述的是两个具名节点之间的电阻,其中没有电阻在图纸上所处位置的信息。节点 0 是接地参考点。这些名称和连接关系直接参与仿真输入,作用超出了在成图上标注名称。[2]
从 ngspice 项目之外看,KiCad 提供了一个便于理解的例子。它的仿真器文档提醒,原理图符号的引脚编号与仿真模型的端子顺序有时存在差异。二极管或运算放大器在这种情况下需要在 Pin Assignments(引脚分配)选项卡中明确设置映射关系。符号看着熟悉,模型的连接却仍会出错。[3]
由此,表面上的数值问题也有了一个上游排查方向。解释异常波形之前,先确认求解器收到的究竟是什么连接要求。检查模型分配与检查连线,应当放在一起。
瞬态分析需要一个起点
通常,ngspice 会在瞬态分析之前计算初始工作点。计算时,独立源取零时刻的值,电容按开路处理,电感按短路处理,非线性器件方程则迭代求解。可选关键字 uic 会跳过这一步工作点计算,改用指定的初始条件。[2]
对于接在恒定电源上的理想电阻电容电路,起始工作点如果已经稳定,电容也就已经充好电。研究上电过程时,需要描述输入的变化,或设定合适的初始状态。
解出方程只是第一道检验
Holger Vogt 在介绍时间步控制时,区分了两道检验。矩阵迭代未能收敛,ngspice 就会缩短时间间隔后重试。收敛之后,程序还会估算局部截断误差,也就是跨越有限时间间隔所引入的误差。估算值过大,同样会导致这个时间步被拒绝。[4]
收敛检验针对拟求解时刻的解,误差检验则考察积分推进到该时刻的精度。两道检验各有要求,通过其中一道之后,另一道仍须过关。时间步反复缩短,一旦触及下限,运行就会以“Timestep too small”错误结束。[4]
.tran 指令可用 tmax 指定最大时间步。例如,.tran 10u 5m 0 1u 要求仿真运行至 5 毫秒,最大时间步为 1 微秒。这个最大值只设定了上限,内部实际采用的时间间隔还可以更短。[2][4]
在工程实践中,时间步失败需要查明原因。调整数值设置有时有帮助,但仅凭设置本身,还无法判断初始条件、连接关系和元件模型是否共同描述了一个合理的实验。
把实验过程与结果一起保存
ngspice 的控制语言让整套过程可以重复运行。写在 .control 与 .endc 之间的命令可以运行分析、修改元件值、重复扫描,并将结果写入文件。项目教程演示了如何在连续多次运行中改变电源电压,也解释了 ngspice 中的“plot”:它指一组数据向量,即使没有显示图形,这组数据仍然存在。[5]
将计算与绘图分开,有其实际价值:计算可以独立运行,绘图窗口是否保持打开都不影响它。连续运行的命令既能保留输入的改动,也能保存相应的结果向量。教程中的 destroy 命令还点出了存储资源的限制:每次运行的向量全部积累下来,会占用内存。[5]
对小型电子工程团队,我由此得出的实践建议是,把网表、模型文件、仿真器版本和控制命令一同保留。这样,当替换元件使结果发生变化时,同事就有一个可以复现的实验可供检查。单独一张截图会留下太多未交代的选择。
实验台提供另一类证据
通过数值检验,结论仍限于输入的模型。在一篇独立讨论 SPICE 局限的文章中,Analog Devices 应用工程师 John Ardizzoni 指出,放大器宏模型会省略部分特性,以兼顾复杂程度、开发工作量与仿真速度。当 Analog Devices 的模型与数据手册出现冲突时,他建议以数据手册中的实测信息为准。他也强调实物原型验证,尤其是在电路板的实际制作方式会影响高速性能的情况下。[6]
这与时间步精度属于不同的问题。积分算得更细,也无法补入模型中缺失的物理效应。模型分配正确,同样不能证明实验台上的电路已按预期接线。
ngspice 让计算实验的多个环节都可供检查:连接关系、初始条件、数值计算的推进过程,以及保存的输出。它的架构有助于定位差异出在哪里。下一步采取什么行动,取决于哪个环节出了问题:纠正端子映射、重新审视初始状态、调查被拒绝的时间步,或测量实物电路。一条有说服力的波形,如果连同生成它的过程都能接受审查,就有了更多价值。
来源
- Ngspice 项目,“Documentation”中的“Ngspice Internals”一节——网表处理、电路构造、矩阵组装、仿真与输出。
- 《Ngspice 用户手册》,第 47 版,第 2 章与第 11 章——网表、初始条件与瞬态分析参数。
- KiCad 9.0 原理图编辑器文档,“Simulator”,尤其是“Pin Assignment”部分——来自独立集成项目的参考资料,解释原理图符号与模型端子之间的映射。
- H. Vogt,“Time step control in ngspice”(2025 年 11 月 23 日),DOCX——时间步的接受与拒绝。
- Ngspice 项目,“Tutorial: ngspice control language”——脚本运行、电源扫描、结果向量、文件输出,以及释放 plot 占用的内存。
- John Ardizzoni,“Which carries more weight a datasheet or SPICE macromodel?”,Analog Devices,“Rarely Asked Questions”第 47 期——关于模型局限与实物验证的独立工程评论。
- Jstapko,“2 stage amplifier with op amps”(2012 年 11 月 9 日),Wikimedia Commons——面包板照片原图、描述与署名信息。