3. 语法兼容性核心问题:大小写敏感性、单位后缀、注释符号、续行符的跨平台差异

跨平台 SPICE 仿真中,语法层面的细微差异往往是导致网表“移植即报错”的首要原因。不同 SPICE 变体(HSPICE、PSPICE、LTspice、ngspice)对大小写、单位、注释和续行符的处理规则各不相同。本章将逐一剖析这四大核心差异,并提供可落地的兼容性编写策略。

⚠️ 常见误区:许多工程师认为“只要电路正确,语法差异不影响结果”。实际上,大小写敏感度不同可能导致器件模型无法识别,单位后缀缺失可能被解释为未知关键字,注释符号混用可能引发解析中断。跨平台调试的第一步,就是统一语法风格。

3.1 大小写敏感性:从“不敏感”到“敏感”的跨越

大小写敏感性是跨平台兼容性的首要陷阱。下表总结了主流 SPICE 平台的关键字与节点名大小写规则:

平台 关键字(.MODEL / .SUBCKT) 节点名(VCC / vcc) 器件前缀(R / r) 实例名(M1 / m1)
HSPICE 不敏感 不敏感 不敏感 不敏感
PSPICE 不敏感 不敏感 不敏感 不敏感
LTspice 不敏感 不敏感 不敏感 不敏感
ngspice 敏感 不敏感 不敏感 敏感

关键发现:ngspice 对 .MODEL 关键字和实例名(如 M1 vs m1)区分大小写,而其他平台均不敏感。这意味着在 ngspice 中,.model nmos ... 和 .MODEL nmos ... 是两个不同的模型定义。

💡 兼容性策略:统一使用小写关键字(.model、.subckt)和大写实例名(M1、R1、Q1)。这是最安全的跨平台写法,同时满足 ngspice 的敏感规则和其他平台的习惯。
// 推荐写法(跨平台兼容)
.model nmos_std nmos (vto=0.7 kp=120u)
M1 drain gate source bulk nmos_std w=10u l=0.18u

// 不推荐写法(ngspice 可能报错)
.MODEL nmos_std NMOS (VTO=0.7 KP=120U)
m1 drain gate source bulk nmos_std w=10u l=0.18u
📐 大小写敏感性影响范围:不仅限于关键字和实例名,还包括模型名称引用、子电路名称、参数名称(如 VTO vs vto)。建议在网表头部添加注释,明确约定大小写规范。
大小写敏感性跨平台对比 HSPICE / PSPICE 关键字:不敏感 实例名:不敏感 模型名:不敏感 节点名:不敏感 ✅ 完全兼容 LTspice 关键字:不敏感 实例名:不敏感 模型名:不敏感 节点名:不敏感 ✅ 完全兼容 ngspice 关键字:敏感 实例名:敏感 模型名:敏感 节点名:不敏感 ⚠️ 部分敏感 兼容性建议 关键字统一小写 实例名统一大写 模型名统一小写

3.2 单位后缀:数值与单位的“隐形分隔符”

SPICE 网表中,数值与单位后缀之间不允许有空格,且不同平台对后缀的识别范围存在差异。单位后缀的误用是跨平台移植中最隐蔽的错误之一。

单位后缀 含义 HSPICE PSPICE LTspice ngspice
M 1e6(兆) ✅ ✅ ✅ ✅
K 1e3(千) ✅ ✅ ✅ ✅
MIL 25.4e-6(密耳) ✅ ❌ ❌ ❌
U 1e-6(微) ✅ ✅ ✅ ✅
N 1e-9(纳) ✅ ✅ ✅ ✅
P 1e-12(皮) ✅ ✅ ✅ ✅
F 1e-15(飞) ✅ ✅ ✅ ✅
⚠️ 单位后缀陷阱:
  • M vs m:在大多数 SPICE 中,M 表示兆(1e6),m 表示毫(1e-3)。但某些旧版 PSPICE 将 M 解释为毫,导致电阻值偏差 1e9 倍。
  • MIL 后缀:仅 HSPICE 支持,其他平台需转换为 25.4e-6 或 25.4U。
  • 单位后缀与数字之间不能有空格:10 K 会被解析为两个独立 ,导致语法错误。
// 正确写法(跨平台兼容)
R1 vcc gnd 10K      // 10 千欧
C1 in out 1U        // 1 微法
L1 node1 node2 10N  // 10 纳亨

// 错误写法(跨平台不兼容)
R1 vcc gnd 10 K     // 空格导致解析错误
C1 in out 1MIL      // MIL 仅 HSPICE 支持
L1 node1 node2 10m  // 小写 m 表示毫,可能被误解
💡 最佳实践:使用科学计数法替代单位后缀,这是最安全的跨平台写法。例如 10e3 替代 10K,1e-6 替代 1U。虽然代码稍长,但彻底消除了单位后缀歧义。
单位后缀解析流程与陷阱 网表输入:R=10K 解析器识别后缀 "K" ✅ 正确:10 × 1e3 = 10000 ❌ 错误:10 × 1e-3 = 0.01 ⚠️ 旧版 PSPICE 将 "M" 解释为毫(1e-3),而非兆(1e6),导致电阻值偏差 1e9 倍

3.3 注释符号:看似简单,实则暗藏玄机

注释符号的跨平台差异虽然不如大小写敏感那么致命,但在大型网表中,注释符号混用会导致整段代码被误解析或忽略。

注释类型 HSPICE PSPICE LTspice ngspice
* 行首注释 ✅ ✅ ✅ ✅
$ 行尾注释 ✅ ✅ ✅ ✅
// 行注释 ❌ ❌ ✅ ✅
/* */ 块注释 ❌ ❌ ✅ ✅
# 行注释 ❌ ❌ ❌ ✅
📌 核心规则:
  • 跨平台通用:行首 * 和行尾 $ 是所有 SPICE 平台都支持的注释符号。
  • LTspice/ngspice 扩展:支持 // 和 /* */,但 HSPICE 和 PSPICE 会将其解析为语法错误。
  • ngspice 特有:支持 # 作为行注释,但其他平台完全不识别。
// 跨平台兼容的注释写法
* 这是行首注释,所有平台都支持
R1 vcc gnd 10K $ 这是行尾注释,所有平台都支持

// 仅 LTspice/ngspice 支持的写法
// 这是 C++ 风格注释
R1 vcc gnd 10K /* 这是块注释 */

// 仅 ngspice 支持的写法
# 这是 Python 风格注释
R1 vcc gnd 10K
💡 注释兼容性策略:
  1. 行注释统一使用 * 或 $,避免使用 // 和 #。
  2. 如需多行注释,每行以 * 开头,不要使用 /* */ 块注释。
  3. 在网表头部添加注释块,说明该网表的目标平台和兼容性注意事项。
注释符号跨平台兼容性矩阵 注释符号 HSPICE PSPICE LTspice ngspice * ✅ ✅ ✅ ✅ $ ✅ ✅ ✅ ✅ // ❌ ❌ ✅ ✅ 💡 跨平台兼容注释:统一使用 *(行首)和 $(行尾),避免使用 // 和 #

3.4 续行符:长语句的跨平台断行规则

当网表语句过长时,需要使用续行符将一行拆分为多行。不同平台对续行符的支持和语法要求存在显著差异。

平台 续行符 续行符位置 续行行首要求 最大续行数
HSPICE + 行首 必须从第 1 列开始 无限制
PSPICE + 行首 必须从第 1 列开始 无限制
LTspice + 行首 必须从第 1 列开始 无限制
ngspice + 行首 必须从第 1 列开始 无限制
📌 续行符统一规则:所有主流 SPICE 平台均使用行首 + 作为续行符,且要求 + 必须位于行首(第 1 列)。这是跨平台兼容性最好的语法特性之一。
// 正确续行写法(跨平台兼容)
.model nmos_std nmos (
+ vto=0.7
+ kp=120u
+ gamma=0.5
+ lambda=0.01
+ cgso=3e-10
+ cgdo=3e-10
+ cj=5e-4
+ mj=0.5
+ pb=0.8
+ )

// 错误续行写法(跨平台不兼容)
.model nmos_std nmos (
  + vto=0.7    // + 前有空格,某些平台会报错
  + kp=120u
  )
💡 续行符使用建议:
  • + 必须位于行首:不要在前面加空格或制表符,某些平台(如 HSPICE)对列位置敏感。
  • 续行行首不要加空格:续行内容直接从 + 后面开始,或空一格后开始。
  • 避免在参数中间续行:尽量在逗号、括号或完整参数后断行,提高可读性。
  • 子电路定义续行:.subckt 的端口列表过长时,同样使用 + 续行。
续行符使用规范流程图 语句长度超过 80 列? 需要续行