4. SPICE与Verilog-AMS基础
混合信号AMS(Analog and Mixed-Signal)协同仿真的核心,在于让SPICE(模拟电路仿真器)与Verilog-AMS(硬件描述语言)在同一个仿真内核中协同工作。SPICE负责晶体管级、RLC寄生等精细模拟行为,而Verilog-AMS则负责系统级、行为级或数模混合接口的描述。理解两者的语法基础与建模思维,是掌握AMS协同仿真的第一道门槛。本章将围绕SPICE网表结构、Verilog-AMS的模块化语法、行为级建模方法展开,并通过一个实际的PLL环路滤波器案例,演示两种语言如何在同一仿真环境中交互。
上图展示了AMS协同仿真的基本架构。左侧是SPICE域,负责晶体管级精度;右侧是Verilog-AMS域,负责行为级描述;中间通过接口进行电压/电流/逻辑电平的转换。在实际工程中,这种架构允许设计者将庞大的数字控制逻辑用Verilog-AMS描述,而将敏感的模拟前端(如LNA、PLL电荷泵)保留在SPICE网表中,从而在仿真速度与精度之间取得平衡。
4.1 SPICE网表核心原理与结构
SPICE网表是模拟电路仿真的“母语”。一个标准的SPICE网表由标题行、电路描述语句、分析控制语句和结束语句组成。对于AMS协同仿真而言,我们最关心的是如何将SPICE子电路(.subckt)封装成可被Verilog-AMS调用的模块。
一个典型的SPICE子电路定义如下:
.subckt charge_pump VOUT VIN CLK GND
M1 VOUT VIN N1 GND NMOS W=2u L=0.18u
M2 VOUT CLK N1 GND PMOS W=4u L=0.18u
C1 VOUT GND 1pF
R1 VOUT N1 10k
.ends charge_pump
在AMS环境中,这个子电路会被视为一个“模拟块”,其端口(VOUT、VIN、CLK、GND)需要与Verilog-AMS模块的端口进行映射。关键点在于:SPICE网表中的节点命名必须全局唯一,否则在顶层连接时会发生短路或开路。
| SPICE元素 | AMS协同仿真中的角色 | 注意事项 |
|---|---|---|
| .subckt / .ends | 定义可复用的模拟子电路 | 端口顺序必须与调用处一致 |
| .model | 定义器件模型参数(如MOS的Vth) | 模型文件需在仿真前正确include |
| R/L/C | 无源器件,影响时间常数 | 在行为级模型中可用理想元件替代 |
| .tran / .ac | 瞬态/交流分析控制 | AMS仿真通常使用.tran,步长由AMS控制 |
4.2 Verilog-AMS语法基础与模块化设计
Verilog-AMS是Verilog-HDL的模拟扩展,它允许使用electrical节点表示连续电压/电流,使用wreal表示实数信号。其核心语法结构如下:
module vco_behavior (out, ctrl);
output out; electrical out;
input ctrl; electrical ctrl;
parameter real freq_center = 1e6;
parameter real kvco = 1e5; // Hz/V
real phase;
analog begin
phase = idt(2*3.14159*(freq_center + kvco*V(ctrl)), 0);
V(out) <+ sin(phase);
$bound_step(1e-9); // 限制最大步长
end
endmodule
上述代码展示了一个行为级VCO模型。V(ctrl)读取控制电压,idt()函数对频率积分得到相位,<+是模拟贡献运算符,表示将值驱动到节点上。$bound_step是AMS中最重要的函数之一,它告诉仿真器在信号快速变化时强制减小步长,保证精度。
V1 n1 n2 DC 1.8,而Verilog-AMS中则是V(n1,n2) <+ 1.8。前者是声明式,后者是行为式(可包含表达式、条件、循环)。
4.3 行为级建模入门:从抽象到具体
行为级建模的核心思想是“忽略不必要的晶体管细节,保留关键数学关系”。例如,一个运算放大器在SPICE中可能需要20个晶体管,但在Verilog-AMS中只需几行代码:
module opamp_ideal (out, inp, inn);
output out; electrical out;
input inp, inn; electrical inp, inn;
parameter real gain = 1000;
parameter real slew_rate = 1e6;
real vin, vout;
analog begin
vin = V(inp) - V(inn);
vout = gain * vin;
// 限幅
if (vout > 3.3) vout = 3.3;
if (vout < 0) vout = 0;
V(out) <+ vout;
end
endmodule
这种建模方式在AMS协同仿真中极为常见:模拟前端用SPICE精确建模,而数字控制逻辑、ADC/DAC接口、锁相环的环路滤波器等,则用行为级模型加速仿真。
4.4 案例拆解:PLL环路滤波器的AMS协同仿真
我们以一个二阶PLL环路滤波器为例,演示SPICE与Verilog-AMS的混合建模。该滤波器包含一个电荷泵(SPICE实现)和一个RC网络(Verilog-AMS行为级实现)。
背景与约束:设计目标是在10μs内完成锁定,相位裕度45°。电荷泵电流为50μA,VCO增益为10MHz/V。传统纯SPICE仿真需要模拟整个PLL闭环,耗时约2小时;而AMS协同仿真可将时间缩短至15分钟。
初始现象:纯SPICE仿真中,由于VCO和分频器包含大量晶体管,仿真速度极慢,且难以调试环路稳定性。
关键输入参数:
- 电荷泵电流:Icp = 50μA
- 滤波器带宽:ωc = 2π × 100kHz
- 相位裕度:PM = 45°
- VCO增益:Kvco = 10MHz/V
分析判断过程:根据环路带宽公式,选择R1=10kΩ,C1=100pF,C2=10pF(用于抑制纹波)。在AMS环境中,我们将电荷泵保留为SPICE子电路,而将RC滤波器用Verilog-AMS描述:
module loop_filter (vctrl, icp);
output vctrl; electrical vctrl;
input icp; electrical icp;
parameter real R1 = 10k;
parameter real C1 = 100p;
parameter real C2 = 10p;
analog begin
// 电流源对C1充电
I(icp, vctrl) <+ V(icp) / 1k; // 简化电流检测
// 实际应使用 idt 积分
V(vctrl) <+ idt(V(icp)/R1, 0) / C1;
// 增加零点
V(vctrl) <+ V(vctrl) + R1 * idt(V(icp), 0);
end
endmodule
实际操作步骤:
- 在Cadence Virtuoso中创建cellview,将电荷泵SPICE网表导入为analogLib子电路。
- 编写上述Verilog-AMS滤波器模块,并定义端口映射。
- 在顶层原理图中,将SPICE电荷泵输出连接到AMS滤波器输入,滤波器输出连接到VCO(行为级)。
- 设置仿真器为AMS,选择spectre作为SPICE引擎,ncsim作为Verilog-AMS引擎。
- 运行瞬态仿真,观察vctrl电压在10μs内是否稳定到目标值。
结果对比:AMS仿真结果显示,锁定时间约为8.5μs,相位裕度约42°,与纯SPICE结果误差小于5%。但仿真耗时从2小时降至12分钟,效率提升10倍。
风险与代价:行为级滤波器模型忽略了寄生电容和电阻的温度系数,在极端温度(-40°C~125°C)下可能产生10%的偏差。因此,在最终tape-out前,仍需对关键路径进行纯SPICE验证。
$bound_step设置过小(如1e-12),导致仿真时间爆炸。建议初始设为信号周期的1/100,再逐步减小。另外,idt()函数需要提供初始条件,否则默认从0开始积分,可能导致瞬态仿真初期出现非物理的电压跳变。
4.5 常见误区与总结复盘
在SPICE与Verilog-AMS混合建模中,以下问题最为常见:
- 端口方向不匹配:SPICE端口是双向的,而Verilog-AMS端口有input/output/inout之分。若将SPICE输出连接到AMS的input端口,会导致仿真器报错或收敛失败。
- 时间步长冲突:SPICE的默认步长控制与AMS的
$bound_step可能冲突。建议在AMS模块中统一使用$bound_step,并关闭SPICE的自动步长(通过.option step=1e-9)。 - 单位制混乱:SPICE默认使用伏特、安培、欧姆、法拉,而Verilog-AMS允许使用
1u、1n等后缀。务必在模块开头声明`timescale 1ns/1ps,并统一单位。
$display在AMS模块中打印关键节点电压,其作用类似于SPICE中的.print,但更灵活。
本章节通过SPICE网表结构、Verilog-AMS语法、行为级建模方法以及PLL滤波器案例,建立了AMS协同仿真的基础认知。下一阶段,我们将深入探讨如何配置仿真器、处理收敛问题,以及如何将数字Verilog代码与模拟模块无缝集成。