在混合信号(Mixed-Signal)芯片设计中,AMS (Analog Mixed-Signal) 仿真是验证模拟和数字电路协同工作的关键技术。本文将深入探讨当设计中包含 Verilog-A 模型时,AMS 仿真的工作原理和流程。

什么是 AMS 仿真?

AMS 仿真是一种协同仿真(Co-simulation)技术,能够同时处理:

  • 模拟信号:连续时间域,如电压、电流
  • 数字信号:离散时间域,如逻辑电平 0/1

这种仿真对于验证 ADC、DAC、PLL 等混合信号模块至关重要。

核心架构:双引擎协同

Cadence AMS Designer 采用双引擎架构:

1. Spectre(模拟求解器)

处理对象:

  • 晶体管、电阻、电容等模拟器件
  • Verilog-A 模型
  • SPICE 模型

关键点:Verilog-A 被视为模拟语言,由 Spectre 引擎处理,而不是数字引擎。

2. Xcelium(数字引擎)

处理对象:

  • Verilog
  • SystemVerilog
  • VHDL

角色:在现代 AMS 流程中,Xcelium 通常作为”主控”,管理整体仿真时间并调用 Spectre。

3. Mixed-Signal Kernel(混合信号内核)

负责协调两个引擎之间的:

  • 时间同步
  • 信号传递
  • Connect Modules 插入

Verilog-A 的编译流程

编译步骤

  1. ahdlcmi 编译器
    • 将 Verilog-A 源码转换为 C 代码
    • 编译为目标文件(.o)
    • 生成 Spectre 可直接调用的优化代码
  2. Unified Netlisting (UNL)
    • 自动生成 Verilog-AMS wrapper
    • 允许数字引擎”看到” Verilog-A 模块的端口
    • 便于层次化连接
  3. Connect Modules 自动插入
    • 在模拟-数字边界自动检测并插入
    • 处理逻辑电平(0, 1, X, Z)与电压/电流的转换

Connect Modules 的作用

转换方向 功能 示例
D2A (Digital to Analog) 逻辑值 → 电压 1VDD, 0VSS
A2D (Analog to Digital) 电压 → 逻辑值 V > Vth1

仿真命令示例

基本命令

1
2
3
4
5
6
# 单步命令运行 AMS 仿真
xrun -ams \
     digital_top.v \          # 数字设计
     analog_block.scs \       # Spectre netlist
     my_model.va \            # Verilog-A 文件
     -ams_info                # 显示 AMS 信息

完整示例

1
2
3
4
5
6
7
8
9
xrun -ams \
     -v digital_design.v \          # 数字设计
     -top digital_top \              # 顶层模块
     -veriloga my_adc.va \          # Verilog-A ADC 模型
     -veriloga my_dac.va \          # Verilog-A DAC 模型
     -spicessub analog_circuit.scs \ # Spectre 子电路
     -amsconnrules my_connect.vams \ # 连接规则
     -access +r \                    # 允许信号探测
     -gui                            # 启动 SimVision GUI

Verilog-A 编译选项

1
2
3
4
# 指定编译器选项
xrun -ams \
     -ahdlcopt "-sv -honorvams" \   # ahdlcmi 编译器选项
     -veriloga model.va

实际应用:ADC 仿真示例

Verilog-A ADC 模型

// my_adc.va - Verilog-A ADC 模型
module adc(input vdd, vss, analog_in, output [7:0] digital_out);
    electrical vdd, vss, analog_in;
    output digital [7:0] digital_out;
    
    analog begin
        // ADC 转换逻辑
        digital_out = (V(analog_in) / V(vdd)) * 255;
    end
endmodule

信号连接

  • analog_in → 连接到模拟电路(Spectre 处理)
  • digital_out → 连接到数字逻辑(Xcelium 处理)
  • 在边界处自动插入 A2D Connect Module

关键技术点

1. 时间同步机制

挑战:模拟使用连续时间,数字使用离散时间

解决方案

  • 自适应时间步进(Mixed-Signal Kernel 管理)
  • 事件驱动同步
  • 两个引擎并行运行,仅在边界信号变化时同步

2. 性能优化

Verilog-A 编译优化:

  • 编译为 C 代码后优化
  • Spectre 矩阵求解器高效处理
  • 远快于解释执行

3. 信号探测

模拟信号(Verilog-A 内部):

1
spectre -probe my_model.va:internal_node

数字信号:

1
simvision &

混合信号:

  • AMS Designer 提供统一波形查看器
  • 同时查看模拟和数字波形

最佳实践

✅ 推荐做法

  1. 清晰的域划分
    • 明确区分模拟和数字部分
    • 最小化跨域连接数量
  2. 简洁的 Verilog-A 模型
    // 好的做法:清晰的物理模型
    module resistor(p, n);
        electrical p, n;
        parameter real r = 1k;
           
        analog begin
            I(p, n) <+ V(p, n) / r;
        end
    endmodule
    
  3. 合理的文件组织
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    project/
    ├── testbench.v          # 数字测试平台
    ├── analog_models/
    │   ├── adc.va
    │   ├── dac.va
    │   └── pll.va
    ├── digital_rtl/
    │   └── *.v
    └── config/
        ├── connect.vams     # 连接规则
        └── discipline.vams
    

❌ 应该避免

  • 频繁的模拟-数字信号切换
  • 在 Verilog-A 中实现复杂的数字逻辑
  • 过度嵌套的条件语句

常见问题排查

问题 1:Verilog-A 编译失败

解决方法:

  1. 检查文件扩展名是否为 .va.vams
  2. 确认使用了 -veriloga 选项
  3. 检查 Verilog-A 语法

问题 2:Connect Module 错误

1
ERROR: No connect module found for signal crossing

解决方法:

  1. 检查是否指定了 -amsconnrules 文件
  2. 确认 discipline 定义正确
  3. 使用 -ams_info 查看详细信息

问题 3:仿真性能慢

优化方法:

1
2
3
4
# 调整 Spectre 容差
xrun -ams \
     -analogcontrol spectre.errpreset=moderate \
     -analogcontrol spectre.maxstep=1ns

总结

带 Verilog-A 的 AMS 仿真是一个双引擎协同系统

  1. Verilog-A 属于模拟域,由 Spectre 处理
  2. ahdlcmi 编译器将 Verilog-A 编译为高效的目标代码
  3. Xcelium 作为主控,Spectre 处理模拟部分
  4. Connect Modules 自动处理模拟-数字边界的信号转换
  5. 使用 xrun -ams 命令统一启动仿真

这种架构使得设计人员可以在同一个仿真环境中,同时验证芯片的模拟和数字部分,大大提高了混合信号 SoC 设计的验证效率。


参考来源: Cadence Support, FAQ on Spectre AMS Designer and Xcelium Simulator