在混合信号(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 的编译流程
编译步骤
- ahdlcmi 编译器
- 将 Verilog-A 源码转换为 C 代码
- 编译为目标文件(.o)
- 生成 Spectre 可直接调用的优化代码
- Unified Netlisting (UNL)
- 自动生成 Verilog-AMS wrapper
- 允许数字引擎”看到” Verilog-A 模块的端口
- 便于层次化连接
- Connect Modules 自动插入
- 在模拟-数字边界自动检测并插入
- 处理逻辑电平(0, 1, X, Z)与电压/电流的转换
Connect Modules 的作用
| 转换方向 | 功能 | 示例 |
|---|---|---|
| D2A (Digital to Analog) | 逻辑值 → 电压 | 1 → VDD, 0 → VSS |
| A2D (Analog to Digital) | 电压 → 逻辑值 | V > Vth → 1 |
仿真命令示例
基本命令
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 提供统一波形查看器
- 同时查看模拟和数字波形
最佳实践
✅ 推荐做法
- 清晰的域划分
- 明确区分模拟和数字部分
- 最小化跨域连接数量
- 简洁的 Verilog-A 模型
// 好的做法:清晰的物理模型 module resistor(p, n); electrical p, n; parameter real r = 1k; analog begin I(p, n) <+ V(p, n) / r; end endmodule - 合理的文件组织
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 编译失败
解决方法:
- 检查文件扩展名是否为
.va或.vams - 确认使用了
-veriloga选项 - 检查 Verilog-A 语法
问题 2:Connect Module 错误
1
ERROR: No connect module found for signal crossing
解决方法:
- 检查是否指定了
-amsconnrules文件 - 确认 discipline 定义正确
- 使用
-ams_info查看详细信息
问题 3:仿真性能慢
优化方法:
1
2
3
4
# 调整 Spectre 容差
xrun -ams \
-analogcontrol spectre.errpreset=moderate \
-analogcontrol spectre.maxstep=1ns
总结
带 Verilog-A 的 AMS 仿真是一个双引擎协同系统:
- Verilog-A 属于模拟域,由 Spectre 处理
- ahdlcmi 编译器将 Verilog-A 编译为高效的目标代码
- Xcelium 作为主控,Spectre 处理模拟部分
- Connect Modules 自动处理模拟-数字边界的信号转换
- 使用
xrun -ams命令统一启动仿真
这种架构使得设计人员可以在同一个仿真环境中,同时验证芯片的模拟和数字部分,大大提高了混合信号 SoC 设计的验证效率。
参考来源: Cadence Support, FAQ on Spectre AMS Designer and Xcelium Simulator