3. 模拟/混合信号模型与行为级建模

在 AMS 混合信号协同验证中,数字部分通常用 Verilog/SystemVerilog 描述,而模拟部分若直接使用晶体管级 SPICE 网表,仿真速度往往无法接受。行为级建模的核心目标,是用 Verilog-A 或 Verilog-AMS 描述模块的端口电气关系,在保留关键模拟特性的同时,把仿真时间从数小时压缩到数分钟。本节围绕语言基础、精度与速度权衡、常见模块建模方法展开。

一、Verilog-A 与 Verilog-AMS 的定位

Verilog-A 是模拟行为建模语言,只处理连续时间域,适合描述运放、比较器、基准源、开关电容等模拟模块。Verilog-AMS 是 Verilog-A 与 Verilog 的超集,允许在同一模块中同时使用 analog 块和 always 块,因此适合描述 ADC、DAC、PLL、LDO 等数模混合模块。两者的核心抽象都是端口(port)、节点(node)、支路(branch):端口通过 input/output/inout 声明方向,节点通过 electrical 声明为电气节点,支路则用 branch 显式定义电压或电流关系。

一个最小可用的 Verilog-A 模块结构如下:

`include "constants.vams"
`include "disciplines.vams"

module vgain(in, out);
  input  in;
  output out;
  electrical in, out;
  parameter real gain = 2.0 from (-100:100);

  analog begin
    V(out) <+ gain * V(in);
  end
endmodule

其中 V(out) <+ gain * V(in) 是贡献语句,表示输出节点电压由输入电压线性放大得到。注意 <+ 是模拟贡献,不是赋值;它描述的是节点电压或支路电流的约束关系,而非过程式赋值。这是初学者最容易混淆的地方。

二、模型精度与仿真速度的权衡

行为级建模的本质是有意识地丢弃次要物理效应。以运放为例,晶体管级模型包含数百个寄生参数,而行为级模型通常只保留增益、带宽、压摆率、输出摆幅和失调五项。精度与速度的权衡可以从三个维度判断:

  • 时间常数:用一阶 RC 近似运放带宽,比用多极点模型快 5~10 倍,但相位裕度误差可能超过 10°。
  • 非线性:用 tanh 或分段线性近似饱和,比查表法快,但交调失真精度下降。
  • 噪声:若验证目标不涉及 SNR,可关闭噪声贡献,仿真速度提升约 20%~40%。

实际项目中建议采用分层建模:顶层用理想行为模型快速跑通功能,关键路径再替换为带限模型,最后对少数敏感模块使用晶体管级模型。这样既保证覆盖率,又控制仿真时间。

模拟模块行为级建模:精度—速度权衡与实现路径 建模层次 理想行为模型 增益/延迟/饱和,无寄生 带限行为模型 一阶RC/压摆率/输出阻抗 晶体管级模型 BSIM/寄生/噪声/失配 混合精度切换 按验证阶段动态替换 精度 速度 复杂度 三者不可兼得 按验证目标取舍 常见模块建模方法 运放 V(out) <+ A0*V(in) + 一阶极点 比较器 V(out) <+ (V(inp)-V(inn))>0 ? Vdd:0 开关电容 电荷守恒 + 时钟相位控制 ADC/DAC 量化 + 采样保持 + 数字接口 PLL/LDO 环路滤波 + 压控振荡 + 反馈

三、常见模拟模块的建模方法

运放建模:最常用的是单极点模型。用 V(out) <+ A0 * V(in) 描述直流增益,再通过 laplace_nd 或 laplace_zp 加入主极点。若需模拟压摆率,可在输出端串联一个受 slew() 函数限制的支路。示例参数:A0=80dB,GBW=10MHz,SR=20V/μs,输出摆幅 0.2V~VDD-0.2V。

比较器建模:核心是判决与延迟。用 V(out) <+ (V(inp)-V(inn)) > 0 ? Vdd : 0 实现理想判决,再通过 transition() 函数加入上升/下降时间。若需模拟失调,可在输入端串联一个 parameter real vos = 1m 的电压源。注意比较器输出通常需要与数字域接口,此时应使用 Verilog-AMS 的 logic 类型或 wreal 类型。

开关电容电路:关键在于电荷守恒和时钟相位。用 @(initial_step) 初始化电容电荷,用 @(cross(V(clk)-vth, +1)) 检测时钟上升沿,在事件中更新电荷分配。例如一个采样保持电路,采样阶段 Q = C * V(in),保持阶段 V(out) <+ Q / C。注意 cross 函数的方向参数 +1 表示上升沿,-1 表示下降沿,必须与时钟定义一致。

ADC/DAC 建模:ADC 通常由采样保持、量化器和数字编码三部分组成。量化器可用 floor() 或 round() 实现,例如 8 位 ADC 的量化步长 LSB = Vref / 256,输出码 code = floor(V(in) / LSB)。DAC 则相反,用 V(out) <+ code * LSB 重建模拟电压。若需模拟 INL/DNL,可在量化前加入非线性误差项。

建模检查清单:
  • 端口方向与电气类型是否与原理图一致?
  • 贡献语句是否覆盖所有工作区间(线性、饱和、截止)?
  • 是否定义了初始条件,避免仿真起始点不收敛?
  • 参数默认值是否合理,是否设置了范围约束?
  • 是否在关键节点添加了 probe 或 $strobe 便于观测?

四、从模型到验证的闭环

行为级模型写完后,不能直接投入大规模验证。建议先做单元级回归:用理想源驱动模型,扫描输入范围,检查输出是否与预期曲线一致。例如运放模型,扫描输入 -1V~+1V,观察输出是否在增益范围内线性放大,在饱和区是否正确限幅。确认无误后,再将模型替换到系统级测试平台中,与数字激励和检查器联调。

精度与速度的权衡不是一次性的,而是随验证阶段动态调整。早期功能验证可用理想模型快速迭代;中期性能验证需加入带限和噪声;后期签核阶段才对关键模块使用晶体管级模型。这种分层策略能在有限仿真资源下最大化验证覆盖率。