
数模混合仿真是很多IC验证工程师绕不开的一道坎。纯数字的Verilog仿真跑得飞快一旦设计里出现了ADC、DAC、PLL、LDO这类模拟模块或者需要验证芯片和外部模拟器件的交互行为仿真器就得同时处理连续时间的SPICE方程和离散事件的Verilog逻辑。我最早接触这类需求是在一个电源管理芯片的项目上数字控制逻辑用Verilog写功率级和反馈网络是SPICE模型当时用纯数字仿真根本跑不出正确的环路响应波形完全对不上。后来切换到VCS-XA配合Verdi的流程才算真正把数模混合仿真的效率提上来。这篇文章就围绕这套组合拳展开从环境搭建、接口处理、仿真配置到波形调试把我在实际项目中踩过的坑和总结的经验完整分享出来。不管你是刚接触混合信号仿真的新手还是已经用过VCS-XA但总觉得调试效率不高的老手应该都能从中找到一些可以直接复用的东西。1. 数模混合仿真到底难在哪里1.1 数字仿真器和SPICE引擎的本质差异数字仿真器的核心是事件驱动。Verilog代码里的always块、assign语句本质上都是在特定时刻触发状态更新仿真器维护一个事件队列按时间戳依次处理。信号只有0、1、X、Z四种状态时间推进是离散的可以跳着走。这种机制让数字仿真在几十毫秒的仿真窗口内处理数百万门电路成为可能。SPICE引擎则完全不同。它求解的是连续时间的微分方程组用数值积分方法比如梯形法、Gear法一步步推进时间。每一步都要迭代求解非线性方程组的收敛解时间步长受限于电路动态特性可能小到皮秒级。一个包含几百个晶体管的模拟电路仿真1毫秒的物理时间可能需要几分钟甚至几小时的CPU时间。这两套机制要协同工作核心矛盾就在于数字侧希望大步长快速推进模拟侧需要小步长保证精度。VCS-XA的做法是在数字仿真器的框架下嵌入一个SPICE求解器通过接口层在两者之间传递信号。数字信号到模拟侧需要经过D2A转换模拟信号回传到数字侧需要经过A2D转换。这个转换过程的时间步长控制、收敛判断、信号映射就是数模混合仿真所有麻烦的根源。1.2 VCS-XA在仿真流程中的角色定位VCS-XA不是简单地把VCS和某个SPICE仿真器拼在一起。它是在VCS内核基础上集成了XA系列的快速SPICE引擎。XA本身是Synopsys的快速SPICE仿真器采用了一些加速技术比如自适应时间步长、事件驱动求解、表格化模型评估等在保持可接受精度的前提下比传统SPICE快一到两个数量级。在VCS-XA流程里数字部分照常用Verilog或SystemVerilog描述模拟部分用SPICE网表描述。两者通过一个顶层模块连接数字侧看到的模拟模块就是一个带时序信息的黑盒模拟侧看到的数字信号就是经过整形和电平转换的激励源。VCS负责调度整个仿真时间轴XA在需要求解模拟电路时被调用求解完成后把结果回传给VCS。这种架构的好处是数字仿真性能几乎不受影响模拟部分只在必要时才消耗计算资源。但代价是接口处的信号处理需要特别小心尤其是当模拟信号变化较快、数字侧采样率不够高时容易丢失关键信息。1.3 Verdi在混合信号调试中的不可替代性纯数字仿真调试Verdi的用法大家都很熟加载FSDB波形看信号跳变追驱动源用nTrace交叉探测。但混合信号仿真里波形不再是干净的0和1模拟节点是连续变化的电压或电流曲线。Verdi的nWave工具支持在同一时间轴上显示数字波形和模拟波形这是它最核心的价值。更关键的是Verdi的nAnalyzer和混合信号调试功能。你可以把模拟波形和数字信号放在一起做光标测量看某个数字控制信号跳变后模拟输出经过多少时间才响应。也可以把SPICE节点的电流波形和Verilog里的状态机信号对齐分析功耗和状态的对应关系。这些在纯数字调试工具里是做不到的。我见过一些工程师试图用SPICE仿真器自带的波形查看器来调试混合信号设计结果数字部分的层次化信号根本看不清楚追信号要手动翻网表效率极低。Verdi在这方面的优势是压倒性的。2. 环境搭建与工程结构设计2.1 工具版本匹配与License配置VCS-XA和Verdi的版本匹配是个容易被忽视的问题。我遇到过VCS 2019.06配Verdi 2020.12结果FSDB波形里模拟信号显示异常折腾了半天才发现是版本不兼容。建议的做法是VCS、Verdi、XA三个组件使用同一发布周期的版本比如都是2022.06或都是2023.03。安装路径下通常会有版本说明文件部署前先确认一下。License方面VCS-XA需要额外的XA license特性。有些公司的License服务器上VCS和XA是分开授权的如果只check out了VCS的feature仿真跑到模拟求解那一步会报license错误。这个错误信息有时候不太直观可能显示为simulation kernel failed之类的容易被误导为代码问题。建议在环境变量里显式指定License队列或者在脚本里加一个license预检查步骤。环境变量配置示例export VCS_HOME/tools/synopsys/vcs/2023.03 export VERDI_HOME/tools/synopsys/verdi/2023.03 export XA_HOME/tools/synopsys/xa/2023.03 export PATH$VCS_HOME/bin:$VERDI_HOME/bin:$XA_HOME/bin:$PATH export LM_LICENSE_FILE27000license_server export SNPSLMD_LICENSE_FILE27000license_server注意LM_LICENSE_FILE和SNPSLMD_LICENSE_FILE同时设置时某些版本会优先读取后者。如果遇到license找不到的问题先检查这两个变量是否冲突。2.2 混合信号工程的目录组织一个清晰的目录结构能省掉很多后续的麻烦。我习惯按下面的方式组织project_root/ ├── rtl/ # Verilog/SystemVerilog源文件 │ ├── digital_top.v │ ├── control_fsm.v │ └── ... ├── spice/ # SPICE网表和模型 │ ├── analog_top.sp │ ├── models/ │ │ ├── bsim4_model.lib │ │ └── diode_model.lib │ └── subckt/ │ ├── opamp.sp │ └── comparator.sp ├── tb/ # 测试平台 │ ├── tb_top.sv │ └── stimulus/ ├── sim/ # 仿真运行目录 │ ├── run_vcs.sh │ └── Makefile └── wave/ # 波形输出目录关键点是SPICE模型文件和子电路要单独管理。模拟模型经常需要根据工艺角TT/FF/SS切换如果把模型路径硬编码在网表里换工艺角时就要改网表。更好的做法是用.include配合参数化路径或者在仿真脚本里通过define传递模型路径。2.3 数字侧和模拟侧的接口文件准备接口文件是连接数字和模拟的桥梁。VCS-XA支持几种接口方式最常用的是通过connectmodule和connectrules来定义。数字侧需要声明哪些信号要连接到模拟侧模拟侧需要声明对应的端口。一个典型的接口声明示例// digital_top.v 中的接口声明 module digital_top ( input wire clk, input wire rst_n, output wire ctrl_out, input wire analog_in ); // 声明模拟连接 connectmodule analog_interface (analog_in, ctrl_out); endmodule对应的connectrules文件connectrules mixed_signal_rules; connectmodule analog_interface; // 定义D2A和A2D的转换参数 resolveto electrical; // 数字输出到模拟输入的转换 connect ctrl_out electrical; // 模拟输出到数字输入的转换 connect analog_in electrical; endconnectrules这里有个容易踩的坑connectrules里的信号方向必须和实际连接一致。如果数字侧是output而模拟侧也是output仿真会报冲突。另外转换规则里的电压阈值、上升下降时间等参数需要根据实际工艺调整默认值往往不适合具体设计。3. 模拟模型与数字逻辑的协同设计3.1 SPICE子电路的封装与参数化在混合信号仿真中模拟模块通常以子电路形式提供。一个设计良好的SPICE子电路应该具备清晰的端口定义、可配置的参数、以及合理的默认值。我见过一些从工艺厂拿到的模型端口顺序混乱参数命名随意直接用在混合仿真里很容易出错。封装子电路时建议遵循以下原则端口顺序按功能分组电源和地放在两端关键参数用.param定义并给出典型值内部节点用局部命名避免与顶层冲突添加必要的.ic初始条件防止收敛问题一个参数化的比较器子电路示例.subckt comparator inp inn out vdd vss .param vth0.5 .param trise1n .param tfall1n .param rout1k * 差分输入级 M1 n1 inp n3 vss nmos w10u l0.18u M2 n2 inn n3 vss nmos w10u l0.18u M3 n1 n1 vdd vdd pmos w20u l0.18u M4 n2 n1 vdd vdd pmos w20u l0.18u * 输出级 M5 n3 nbias vss vss nmos w5u l0.18u Rout n2 out rout Cout out vss 10f * 输出限幅 D1 out vdd dmod D2 vss out dmod .model dmod d(is1e-14 n1.05) .ends comparator这个子电路里vth参数实际上没有直接用到因为比较器的阈值由M1和M2的尺寸比决定。如果要精确控制阈值可以在输入级加一个失调电压源或者调整尾电流。实际项目中比较器的阈值往往需要根据系统需求微调所以最好把关键尺寸也参数化。3.2 数字控制逻辑的时序约束数字侧的逻辑在混合仿真中需要特别注意时序。因为模拟侧的响应时间可能是纳秒到微秒级数字控制信号的脉冲宽度、建立保持时间都会影响模拟电路的行为。举个例子一个开关电容电路的控制信号如果脉冲太窄电容可能充不满电如果脉冲太宽又会影响下一个周期的建立。在纯数字仿真里这些时序问题可能被忽略因为数字模型是理想化的。但在混合仿真里模拟侧会真实地响应这些时序缺陷。我的做法是在数字侧加一个时序检查模块用$setup、$hold等系统任务监控关键信号。同时在测试平台里用$display或$fwrite记录关键事件的时间戳方便后续和模拟波形对照。// 时序监控示例 module timing_monitor ( input wire clk, input wire ctrl, input wire analog_ready ); time ctrl_time, ready_time; always (posedge ctrl) begin ctrl_time $time; end always (posedge analog_ready) begin ready_time $time; if (ready_time - ctrl_time 100) begin $display(WARNING: analog_ready too early at %t, ctrl at %t, ready_time, ctrl_time); end end endmodule3.3 接口信号的D2A和A2D转换细节D2A转换是把数字的0/1信号变成模拟的电压源。VCS-XA默认的转换规则是0对应0V1对应VDD电压上升下降时间由connectrules指定。但实际电路中数字输出驱动模拟输入时驱动能力、电平标准、上升时间都会影响模拟侧的行为。如果数字输出是推挽结构驱动能力强上升时间可以设短一些比如100ps。如果是开漏输出加上拉电阻上升时间就取决于RC时间常数可能需要设到纳秒级。这个参数设错了模拟侧的响应会完全不对。A2D转换是把模拟电压变成数字的0/1。这里的关键是阈值电压和迟滞。如果模拟信号在阈值附近有噪声没有迟滞的话数字侧会疯狂翻转仿真速度急剧下降。VCS-XA支持在connectrules里设置迟滞窗口建议根据模拟信号的噪声幅度来定一般取信号摆幅的5%到10%。connectrules mixed_signal_rules; connectmodule analog_interface; resolveto electrical; // D2A转换参数 connect ctrl_out electrical d2a(vlow0.0, vhigh1.8, trise100p, tfall100p); // A2D转换参数带迟滞 connect analog_in electrical a2d(vil0.4, vih1.4, vth0.9, hysteresis0.1); endconnectrules提示迟滞窗口设得太大会丢失小信号信息设得太小仿真速度会受影响。建议先用默认值跑一遍观察波形后再调整。4. 仿真配置与运行效率优化4.1 VCS-XA编译选项的取舍VCS-XA的编译选项直接影响仿真性能和调试能力。常用的选项包括选项作用建议-xa启用XA混合信号仿真必须-spice指定SPICE网表文件必须-connectrules指定连接规则文件必须-debug_accessall开启全部调试访问调试阶段用会降低性能-fsdb生成FSDB波形配合Verdi使用-kdb生成KDB知识数据库加速Verdi加载-lca启用有限客户访问特性某些高级功能需要编译命令示例vcs -full64 -sverilog \ -xa \ -spice analog_top.sp \ -connectrules mixed_signal_rules.cr \ -debug_accessall \ -fsdb \ -kdb \ -timescale1ns/1ps \ -f filelist.f \ -o simv_xa这里有个经验-debug_accessall在调试阶段很有用但会让仿真速度下降20%到30%。如果设计已经稳定只是跑回归可以去掉这个选项只保留-fsdb和-kdb。另外-kdb生成的KDB文件可以显著加快Verdi加载大型设计的速度建议一直开着。4.2 模拟求解器的精度与速度平衡XA求解器的精度控制主要通过时间步长和收敛容差来实现。在VCS-XA的仿真选项里可以设置以下参数xa_timestep最大时间步长xa_reltol相对容差xa_abstol绝对容差xa_method积分方法trap、gear2、gear3默认情况下XA会根据电路动态自适应调整步长。但如果电路里有快速开关或高频振荡自适应步长可能会频繁回退导致仿真变慢。这时候可以适当放宽容差或者指定一个合理的最大步长。我的经验是对于开关电源这类周期性电路最大步长设为开关周期的1/100到1/200比较合适。对于PLL这类需要长期仿真的电路可以放宽到1/50但要注意捕获瞬态过程。相对容差一般设1e-3到1e-4绝对容差设1e-12到1e-9具体取决于节点电压和电流的量级。# XA仿真选项示例 xa_timestep10p xa_reltol1e-4 xa_abstol1e-12 xa_methodgear2 xa_maxiters50注意xa_maxiters设得太小收敛失败会导致仿真报错设得太大每次迭代时间增加。一般50到100之间比较合理。4.3 仿真加速的实用技巧除了求解器参数还有一些工程技巧可以显著提升混合仿真效率第一减少不必要的模拟节点保存。默认情况下XA会保存所有模拟节点的波形数据量可能非常大。如果只关心几个关键节点可以在SPICE网表里用.probe指定或者在仿真选项里用xa_save控制。第二合理划分数字和模拟的边界。有些模块既可以放在数字侧也可以放在模拟侧。比如一个简单的RC滤波器如果放在数字侧用行为级模型仿真会快很多如果放在模拟侧用SPICE模型精度更高但速度慢。根据验证目标来取舍。第三利用XA的表格化模型。XA支持把复杂的晶体管模型预先表格化仿真时直接查表速度比实时求解快很多。这个功能对大规模模拟电路特别有效但需要额外的模型准备时间。第四分阶段仿真。先跑一个短时间的仿真确认功能正确再逐步延长仿真时间。不要一上来就跑几十毫秒的仿真万一有问题浪费的时间太多。5. Verdi混合信号波形调试实战5.1 FSDB波形中模拟信号的加载与显示VCS-XA生成的FSDB文件里数字信号和模拟信号是混在一起的。用Verdi打开后数字信号默认显示为0/1波形模拟信号需要手动添加到nWave窗口。添加的方式是在nWave里选择Add Signal然后从层次结构里找到模拟节点。模拟信号在nWave里默认显示为模拟波形但有时候会被误识别为数字信号。如果发现模拟信号显示成方波检查一下信号类型设置。在nWave里右键信号选择Signal Type改成Analog。另外模拟信号的显示范围需要手动调整。默认的Y轴范围可能太大或太小导致波形看不清。可以用Zoom Fit自动适配或者手动设置Y轴范围。对于电压信号一般设为0到VDD对于电流信号根据实际量级设置。5.2 数字事件与模拟波形的对齐分析混合信号调试的核心场景是某个数字控制信号跳变后模拟输出经过多长时间响应响应幅度是否满足要求。在Verdi里可以用光标Cursor来测量时间差。具体操作在nWave里放置两个光标一个对准数字信号的跳变沿另一个对准模拟波形的关键点比如达到90%终值的位置然后读取两个光标的时间差。这个时间差就是模拟电路的响应延迟。如果需要更精确的分析可以用Verdi的nAnalyzer工具。nAnalyzer支持对模拟波形做数学运算比如求导、积分、FFT等。比如要分析一个LDO的负载瞬态响应可以对输出电压波形求导找到最大变化率然后和数字侧的负载切换信号对照。5.3 常见波形异常与排查思路混合信号仿真中波形异常往往比纯数字仿真更难定位。以下是我遇到过的几个典型问题问题一模拟输出一直是0或者一直是VDD。可能原因模拟电路的电源没接对或者初始条件设置有问题。检查SPICE网表里的电源节点是否正确连接.ic初始条件是否合理。问题二数字信号在模拟侧没有响应。可能原因D2A转换规则里的电平设置和实际不符。比如数字侧是1.2V电平转换规则里设的是1.8V模拟侧可能识别不到。检查connectrules里的vhigh参数。问题三模拟信号在数字侧疯狂翻转。可能原因A2D转换没有迟滞或者模拟信号在阈值附近有噪声。在connectrules里加迟滞窗口或者检查模拟电路的噪声性能。问题四仿真速度突然变慢。可能原因模拟电路出现收敛问题XA在反复迭代。检查仿真日志里的收敛信息看看是哪个节点或哪个时间点出现问题。常见的原因是电路里有浮空节点、或者开关瞬间的电流突变。问题五FSDB文件过大。可能原因保存了太多模拟节点或者仿真时间太长。用xa_save限制保存的节点或者分段保存波形。排查这些问题时Verdi的nTrace功能很有用。可以从异常的数字信号出发追到驱动它的模拟节点再追到模拟电路内部的晶体管级节点。这种跨域的信号追踪是纯数字或纯模拟工具做不到的。6. 从项目实践中提炼的经验教训6.1 接口信号命名规范的重要性在混合信号项目里数字侧和模拟侧的信号命名如果不统一后期调试会非常痛苦。我建议在项目初期就制定命名规范比如数字侧用d_前缀模拟侧用a_前缀接口信号用x_前缀。这样在Verdi里看波形时一眼就能分辨信号来源。另外接口信号的位宽和类型要严格对应。数字侧是wire还是reg模拟侧是电压源还是电流源这些细节在connectrules里都要明确。我见过因为数字侧用了reg而模拟侧期望wire导致仿真结果完全错误的情况。6.2 仿真时间与精度的权衡策略混合信号仿真的时间预算是有限的。一个包含几百个晶体管和几千门数字逻辑的设计仿真1毫秒可能需要几小时。如果每个回归用例都跑完整仿真时间成本无法承受。我的策略是分层验证先用行为级模型快速验证数字逻辑和接口时序再用晶体管级模型验证关键模拟性能。行为级模型可以用Verilog-AMS或者Verilog-A写仿真速度快很多。只有在需要精确评估模拟性能时才切换到SPICE模型。另外仿真时间窗口要精心选择。比如一个DC-DC转换器启动过程可能需要几百微秒但稳态特性只需要几个开关周期就能看出来。如果只关心稳态效率就没必要跑完整的启动过程。6.3 版本管理与回归测试的配合混合信号设计的版本管理比纯数字设计复杂因为涉及Verilog、SPICE、connectrules、仿真脚本等多种文件。我习惯用Git管理所有文本文件SPICE模型库如果太大可以用Git LFS或者单独的文件服务器。回归测试方面混合信号仿真的回归用例不宜太多因为每个用例的运行时间较长。建议挑选覆盖关键功能路径的用例比如启动、稳态、负载切换、保护触发等。每个用例的通过标准要明确不能只看仿真是否跑完还要检查关键波形的参数是否在规格范围内。可以用脚本自动提取波形参数并和规格对比比如用Python的scipy库读取FSDB文件需要相应的解析工具计算效率、纹波、响应时间等指标然后和预期值比较。这样回归测试就能自动化减少人工看波形的工作量。6.4 团队协作中的接口约定混合信号项目通常需要数字和模拟工程师协作。数字工程师负责Verilog逻辑模拟工程师负责SPICE电路。如果接口约定不清晰两边的工作很难对接。我建议在项目启动阶段就明确以下内容接口信号的名称、方向、电平标准、时序要求模拟模块的端口定义和参数范围仿真平台的版本和配置波形调试的分工和流程。这些内容最好写成文档随着项目进展持续更新。另外数字工程师和模拟工程师应该定期一起看波形。数字工程师关注控制逻辑是否正确模拟工程师关注电路性能是否达标。在Verdi里一起调试能快速发现接口问题比各自看各自的波形效率高很多。7. 进阶话题行为级模型与晶体管级的混合使用7.1 Verilog-AMS在混合仿真中的定位Verilog-AMS是专门为混合信号建模设计的语言它同时支持数字的always块和模拟的analog块。在VCS-XA流程里Verilog-AMS模块可以像普通Verilog模块一样例化但内部可以包含连续的模拟行为描述。使用Verilog-AMS的好处是仿真速度快。一个用Verilog-AMS写的ADC模型可能比晶体管级SPICE模型快100倍以上而精度在系统级验证中已经足够。缺点是模型需要自己开发而且需要验证模型的准确性。一个简单的Verilog-AMS比较器模型include disciplines.vams module comparator_ams (inp, inn, out); input inp, inn; output out; electrical inp, inn, out; parameter real vth 0.9; parameter real trise 1n; parameter real tfall 1n; analog begin if (V(inp) V(inn) vth) begin V(out) transition(1.8, 0, trise); end else if (V(inp) V(inn) - vth) begin V(out) transition(0.0, 0, tfall); end end endmodule这个模型的行为和SPICE比较器类似但仿真时不需要求解晶体管方程速度快很多。在实际项目中我通常用Verilog-AMS模型做功能验证用SPICE模型做性能验证。7.2 模型精度与仿真速度的折中方案混合信号仿真的一个核心挑战是什么时候用行为级模型什么时候用晶体管级模型。我的经验是功能验证阶段全部用行为级模型快速迭代接口验证阶段数字侧用RTL模拟侧用行为级模型重点验证时序和电平性能验证阶段关键模拟模块用晶体管级模型其他用行为级签核阶段全部用晶体管级模型确保精度这种分层策略可以在保证验证覆盖度的前提下把仿真时间控制在可接受范围内。当然行为级模型本身也需要验证确保它在各种工况下的行为与晶体管级模型一致。可以用一组典型的激励同时跑行为级和晶体管级模型对比输出波形偏差在可接受范围内才使用。7.3 混合仿真的未来趋势与个人展望从最近几年的工具发展来看混合信号仿真的趋势是更紧密的集成和更智能的调度。XA求解器在不断优化支持更多的加速技术Verdi的混合信号调试功能也在增强比如支持模拟波形的自动测量和参数提取。另一个趋势是云仿真和分布式仿真。混合信号仿真的计算量很大单机跑大型设计越来越吃力。把仿真任务分发到计算集群上可以显著缩短回归时间。不过这需要工具支持分布式求解目前还在发展中。从我个人的使用体验来说VCS-XA加Verdi的组合已经能覆盖大部分混合信号验证需求。关键是要理解工具的工作原理合理配置仿真参数并且建立清晰的调试流程。工具只是手段真正决定验证效率的还是工程师对设计的理解和调试思路。我在实际项目中最大的体会是花时间在前期把接口和模型理清楚比后期在波形里大海捞针要划算得多。每次看到数字信号和模拟波形在Verdi里完美对齐那种感觉就像拼图最后一块落位所有的折腾都值了。