news 2026/9/9 6:28:02

混合信号验证MSDV实战:从RNM建模到Verilog-on-Top网表落地

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
混合信号验证MSDV实战:从RNM建模到Verilog-on-Top网表落地

混合信号项目做久了,你会发现一个很扎心的事实:一款芯片里真正需要精确到晶体管级仿真的模拟电路,往往只占整个die面积的皮毛,但全芯片SPICE仿真要跑的时间,却能把整个项目组的耐心耗干。这就是MSDV(Mixed-Signal Design Verification,混合信号验证)存在的意义,也是我这次想跟你认真聊聊的东西。

MSDV这套方法论,核心就三件事:用RNM(Real Number Modeling,实数建模)把模拟行为抽象成数字仿真器能识别的实数模型,用Verilog-on-Top把数字顶层和模拟IP捏在一起搭验证环境,最后把这些验证过的模型和视图,落成一份后端真能拿去跑流程、拿去流片的网表。听起来好像不复杂,但真正操作过的人都知道,每一步都藏着不少讲究。这篇文章我就从RNM抽象怎么选型讲起,再把Verilog-on-Top的架构思路捋一遍,最后落到网表落地这条最容易出问题的路上,把我自己踩过的坑和验证过有效的做法一并写出来。

1. 混合信号验证的整体思路拆解

1.1 为什么不再全靠SPICE仿真:速度与覆盖率的死结

很多刚接触混合信号验证的同学会有个误区,觉得混合信号嘛,直接把数模接口交给模拟工程师用SPICE跑不就完了。实测下来,这个思路只适用于单模块验证,比如一个LDO带几个负载、一个ADC的前端采样保持电路。一旦把整个SoC拿过来,包含几百万门数字逻辑、几十个模拟IP、复杂的上下电时序和时钟复位策略,全SPICE仿真基本等于不可行。

我见过一个真实的项目,全芯片SPICE仿真跑一次上电流程,花了9天时间。9天跑出来的结果还是只覆盖了最高层的电源域切换,内部数字逻辑和模拟IP之间的交互几乎没验证到。等流片回来,发现DCDC纹波在特定负载下触发了数字模块的复位,而这个场景在全SPICE仿真里根本跑不到那么深。

MSDV的思路就是把验证工程化拆开:模拟IP内部的关键性能,用晶体管级仿真保证精度;数模交互行为和全芯片系统行为,用RNM抽象成实数模型,放到数字仿真器里跑。这样做的结果是,原本9天的全芯片仿真压缩到几小时甚至几十分钟。代价是你要花时间建好RNM模型,并且保证模型保真度够用。

1.2 RNM抽象的核心价值:用实数换速度

RNM的核心思想其实一句话就能说清:不把模拟信号当电压或电流的连续函数来解,而是当一个带精度的“实数”值来传递。数字验证环境里的logic四态值(0、1、Z、X)表达不了3.3V、1.8V这些模拟信息,但real类型可以,而且仿真器处理real的速度远比解微分方程快。

RNM有四个抽象级别,RNM-1到RNM-4。RNM-1最简单,只区分0和1,可以认为是带阈值的数字化表示;RNM-2引入实数值和阈值比较,能表达摆率限制;RNM-3进一步支持分段线性行为,能模拟充放电曲线;RNM-4最复杂,支持连续函数和动态行为。

实际项目中,RNM-1往往不够用,RNM-4又太重,用最多的是RNM-2和RNM-3的组合。比如做ADC的模型,输入信号用RNM-2描述模拟输入电压和采样时刻,内部转换过程用RNM-3描述比较器翻转和电荷重分配的行为。这样既保证了时序精度,又避开了在数字仿真器里写微分方程的尴尬。

1.3 Verilog-on-Top的架构定位:谁是“老大”

混合信号验证的顶层集成有几种风格:SPICE-on-Top、Verilog-on-Top、还有更少见的SystemVerilog-on-Top。我个人的项目经验是,除非你做的是一颗纯模拟芯片,否则Verilog-on-Top几乎是唯一合理的选择。

Verilog-on-Top的意思,是验证环境的顶层用Verilog/SystemVerilog搭起来,模拟IP通过行为模型或者RNM封装成黑盒挂在顶层下面。数字部分跑原生的RTL,模拟部分跑RNM模型,数模接口处用专门的模拟接口层转换信号。这样做有几个实际好处:

第一,数字验证工程师可以直接复用现有的UVM环境、断言和覆盖率收集机制,不用另起炉灶学模拟仿真器。第二,回归测试跑得动。第三,如果设计的顶层有大量数字逻辑,Verilog-on-Top能保证数字代码的风格统一,避免仿真器切换带来的兼容性灾难。

我之前参与过一个项目,顶层本来是SPICE-on-Top,每次回归要等两三天,后来切换到Verilog-on-Top,回归时间降到40分钟,覆盖率和debug效率都上了一个台阶。这个切换本身也踩了不少坑,后面细说。

2. 核心细节解析:RNM模型怎么建才靠谱

2.1 从晶体管级抽RNM模型:不是简单“翻译”

把SPICE网表“翻译”成RNM模型,听起来像是照着原理图写一遍行为描述,实际操作起来远没那么简单。RNM模型必须抓住被建模模块对系统行为影响最大的那几个特性,而把次要特性舍掉,否则模型会变得又慢又难调。

以DCDC转换器为例,系统验证最关心的是输出电压范围、负载调整率、纹波大小和上下电时的软启动行为。至于误差放大器内部的极点零点位置、补偿网络的具体RC值,系统级验证完全可以不管。所以DCDC的RNM模型我一般写成:输入侧接受电源电压和使能信号,输出侧用RNM-3描述软启动时的电压爬升、稳态时的电压输出和负载突变时的瞬态响应。

关键参数映射要特别注意。SPICE仿真里你习惯说的负载电流是安培级、电压是伏特级,RNM模型里还是要保持一样的量纲单位,因为验证环境里的断言和参考模型都按真实电气值来写。我之前见过有人图省事,把电压单位改成毫伏,结果顶层数字模块的阈值判断全部偏了,排查了两天才定位到单位问题。

从晶体管级抽模型还有个技巧:先跑一个典型corner下的SPICE瞬态波形,把波形文件导出来,用脚本提取关键特征点(启动时间、建立时间、超调量、纹波幅值等),再把这些特征点填进RNM模型的参数里。这个流程比直接回忆电路行为去写参数要准确得多,尤其适合那些性能受工艺影响较大的模拟IP。

2.2 模拟IP行为封装:黑盒里的接口协议

RNM模型建好之后,下一步是要把它封装成验证环境方便调用的东西。我常用的做法是把每个模拟IP都封装成一个独立module,统一接口风格。以ADC为例,接口至少包含:模拟输入引脚、时钟、复位、数字输出总线、转换完成标志,还有一个可选的“busy”信号方便数字逻辑做握手。

接口定义这块有个特别容易翻车的点:模拟输入引脚的信号类型。在Verilog-on-Top环境里,真实模拟IP的输入是wire类型,接的是带电气特性的模拟信号;但RNM模型里输入信号是real类型。这两种类型的转换要有一层专门的interface来做,不能直接在顶层里把real信号接到logic端口上,否则仿真器会报类型不匹配或者悄悄做隐式转换导致精度丢失。

这里我踩过一个很深的坑。某个项目的比较器模型,输入用real类型,输出是logic类型,顶层集成时我图省事直接把real信号连到logic端口,结果比较器翻转和实际电路有几十纳秒偏差。原因就是隐式转换把real值>0.5当成1、else当成0,但比较器真实的阈值是0.4V且内部有迟滞。正确的做法是在接口层明确写出阈值比较逻辑,把real信号转成logic信号。

2.3 时序与精度权衡:仿真速度vs保真度

RNM模型的精度不是越高越好。精度越高意味着模型越接近真实电路行为,但也意味着仿真速度越慢、参数越难调、收敛性问题越频繁。项目实践中要明确一个原则:RNM模型只要满足验证目标所需的最小精度即可,“过拟合”反而拖慢整个验证周期。

精度取舍要看被验证的是什么。如果目标是验证数字模块对ADC输出数据的处理逻辑,那ADC模型只需要保证采样时刻正确、转换结果在规定码值范围内即可,不必精确到每个码值的DNL/INL误差。如果目标是验证数字LDO的PWM调制策略,那模型需要能反映负载突变时的环路响应速度和稳定性,这时RNM-3的分段线性描述可能就不够了,需要用RNM-4的连续函数建模来保证瞬态行为逼真。

还有一个实际工程里的权衡经验:对仿真步长不要设得太激进。RNM模型在数字仿真器里跑,默认事件驱动,步长不固定。如果模型里有快速变化的信号(比如亚纳秒的边沿),事件数量会爆炸,仿真时间指数级上升。合理的做法是在模型里主动加延迟和滤波,让信号变化速率与验证需求匹配。我建PLL模型时,故意把VCO的控制电压变化速率限制在一个合理的斜率范围,既不影响锁定和失锁行为的验证,又避免仿真器被高频抖动信号折腾到虚脱。

3. 实操落地:从验证环境到能跑的网表

3.1 验证环境搭建步骤:实操记录

理论铺垫得差不多了,来说怎么一步步落地。我以一颗带DCDC、LDO、ADC、PLL和数字电源管理单元的混合信号SoC为例,把搭建整个MSDV环境的流程走一遍。

第一步,梳理数模接口清单。把芯片里所有模拟IP的数字控制信号、状态输出信号、模拟输入输出引脚列成表格,标注信号方向、电平域、时序要求。这份清单是整个验证环境的“宪法”,后续建模、搭环境、写断言都要围绕它展开。

第二步,为每个模拟IP建立RNM模型。先跑一遍典型corner下的SPICE瞬态仿真,提取关键行为特征,再用SystemVerilog的real类型写行为模型。每个模型要单独做一次“模型对标”(Model vs Schematic)——拿模型输出跟SPICE输出对比,确认关键行为一致。

第三步,搭建Verilog-on-Top环境。顶层用Verilog模块承载所有数字RTL和模拟IP的RNM模型实例化,模拟信号通过interface连到RNM模型端口,数字信号直接连到RTL端口。整个环境里只保留一个顶层testbench,负责时钟复位生成、测试激励注入和结果检查。

第四步,写断言和覆盖率模型。断言负责监控关键时序关系:比如ADC转换完成信号最多两个时钟周期内必须被数字逻辑读走、DCDC的反馈使能信号不能和PFM模式切换同时发生等。覆盖率模型重点收集数模接口处的信号翻转和跨时钟域行为。

第五步,跑回归。把MSDV环境接入原有的数字回归流程,跑全芯片的上电、低功耗、功能测试等场景,统计仿真时间、覆盖率和失败用例。

这套流程走下来,整体工作量大部分集中在第二步和第三步,因为RNM模型的质量直接决定验证结果的可信度。我第一个MSDV环境花了三周才跑出可信结果,一半时间都花在调模型与SPICE行为对标上。

3.2 网表是怎么来的:几条路径

标题里“模型怎么落地成一份能跑的网表”,这里说的网表并不只是后端用的那唯一一种SPICE网表或Verilog网表。在验证语境里,至少涉及以下几种网表的流转:

一是数字后端用的门级网表。这是从综合工具(比如Genus、Design Compiler)出来的Verilog网表,里面已经是标准单元和连线关系,不包含模拟IP的内部电路。

二是模拟IP的晶体管级网表。这是模拟工程师从电路原理图导出的SPICE网表,包含每个晶体管、电阻、电容的参数和连接关系,通常用来做后仿和版图验证。

三是全芯片混合网表。芯片级验证有时要把数字门级网表和模拟SPICE网表放在同一个环境里跑,这时需要一个顶层网表把这些片段拼起来。这个顶层网表的连接关系必须和芯片真实版图一致,才能保证后仿结果有意义。

在MSDV流程中,现网表的路径通常是这样的:RTL代码经过逻辑综合出门级网表;模拟IP的RNM模型在此期间并不同步生成物理网表,模拟IP在后端阶段通过virtuoso或者定制版图流程产生晶体管级网表。验证团队要做的就是保证两类网表之间的接口定义一致——数字网表看到的模拟IP引脚名字、方向、负载能力,必须和模拟后端提供的物理网表一致。

这块最容易出的问题就是引脚命名不一致。数字综合时用的是行为模型里的端口名,比如vin、vout、enable、busy;模拟后端却习惯用原理图里的网络名,比如AVDD、DVDD、VOUT_ANA、ENB。两边不统一,握合的时候要么手动改网表要么加转换层,非常痛苦。

3.3 网表一致性与前后仿验证

网表生成后不能直接送去流片或做板级验证,至少要做两类检查。第一类是LVS(Layout vs Schematic)检查——版图提取出来的网表要和原理图网表网络一一对应;第二类是前仿/后仿一致性检查——门级网表跑出来的行为要和RTL行为一致。

在MSDV环境里,网表一致性检查我特别建议用“模型对标”的思路来做:把RNM模型跑出来的行为作为基准,再让门级网表和模拟SPICE网表在同一个测试激励下跑,对比关键输出波形。做过几个项目后,我认为这个方法能在流片前发现大量接口时序和负载匹配问题。

有一个很典型的case:某项目的ADC输出总线在RTL级仿真里一切正常,门级网表后仿却偶发出现数据毛刺。追查后发现是总线翻转时间跨度过大,数字逻辑采样时采到了中间态。RTL仿真里总线是理想瞬间翻转的,RNM模型也是理想行为,但门级网表有真实的门延迟和走线延迟,导致数据保持时间不足。这种问题只有在网表级仿真才能暴露,所以“模型落地成网表”之后的仿真绝对不能跳过。

3.4 从芯片网表到板级系统:还有个容易被忽略的环节

网表不光在芯片内部流转,到了系统级和板级验证阶段,网表的导出和导入也是个高频操作。你搜索里看到的OrCAD导出网表、Allegro导入网表,就是板级设计里最常见的网表传递动作。

这块虽然偏封装和PCB方向,但芯片验证工程师偶尔也要配合。芯片的IO pad排列、关键信号在封装上的分布、电源引脚的去耦策略,往往要从芯片网表导出后转到板级设计工具里做联合检查。我遇到过不止一次,芯片仿真里完美的电源域管理,到了板级导入网表之后发现去耦电容摆放离得偏远,导致电源完整性问题,又要反馈回芯片设计调整引脚分配。

所以建议验证团队在MSDV环境里预留一个“板级可导入”的端口信息文件,至少包含每个IO pad的电气特性、方向、供电域和ESD等级。方便后续跟板级工具链对接时直接导出和导入,不用回头翻设计文档。

4. 踩坑实录:混合信号验证中的常见问题与排查

4.1 RNM模型不收敛:仿真器直接卡住或报错

RNM模型在数字仿真器里跑,理论上不应该出现SPICE那种不收敛问题,但实际经常遇到的是“事件风暴”——模型里的某个信号在两个值之间高频振荡,导致仿真器事件队列爆满,看起来就像死循环。

我遇到最典型的一次是LDO的RNM模型,负载电流突然减小时,模型内部的反馈环路在realtime域产生了一个极限环,仿真器卡了一个晚上没跑完。排查下来是模型里的环路增益参数设得过高,且缺少对电压变化速率的限制。解决办法是给模型加一个一阶惯性环节,也就是low-pass filter,限制输出电压的deltalim。经验值是把deltalim设为输入电压变化步长的2-3倍,振荡就消掉了。

这类问题的排查要点:看仿真器警告里事件频率最高的信号是哪个,再用波形把那个信号的局部放大,基本能锁定是哪个模型内部的反馈路径出了问题。

4.2 数模接口时序错位:数字侧和模拟侧各说各话

数模接口的时序问题在MSDV里几乎无法避免,尤其是跨时钟域的信号同步。模拟IP往往有自己独立的时钟或内部延迟,数字侧主时钟和模拟时钟之间没有确定的相位关系。RNM模型如果忽略了模拟时钟的异步性,就会把实际硬件中不可能发生的事件序列变成可能,或者反过来。

我有过一个ADC模型的教训:采样时钟建模成和数字主时钟严格同步,仿真里数字逻辑在采样完成信号上升沿后立刻读取数据总线,一切正常。但实际芯片因为时钟偏移,采样完成信号到达数字逻辑时数据总线还没完全建立,导致偶发读到错误数据。后来在模型里加了固定的采样保持延迟,并且设定采样完成信号与数据有效之间的最小间隔,回归立刻拦下了这个问题。

结论就是,RNM模型的时序参数不能“太乐观”,必须留出真实的物理延迟余量。

4.3 网表导入后的电气规则错误

网表从数字后端导出,或者从模拟版图提取出来之后,导入MSDV环境或者板级工具时,最常遇到的问题是电气规则检查报错。电源引脚悬空、信号方向不匹配、未连接端口数量超过阈值等等,每个都能让工具直接拒跑。

这类问题大多是网表生成阶段的连接关系问题,本质是信号命名和端口属性在多次转换过程中被弄丢了。有一个我常用的排查思路:先做一次“端口名对比”,把网表里所有端口和验证环境里的接口定义逐条对比,找出多出来或缺失的端口,再重点看这些端口附近的逻辑连接。做过两次后,你会发现大部分网表导入问题的根因都出在顶层实例化的端口映射抢,而不是网表本身的电路错误。

还有个细节是电源地的处理。数字网表有的用全局net命名(比如VDD、VSS),有的用带层次化路径的命名。Allegro导入网表时对这种层级命名的解析非常敏感,差一个斜杠就是开短路。建议在整个流程里统一使用平铺式的电源地命名规范,避免用层次化命名。

4.4 复位与上电时序:最容易“假通过”的验证项

MSDV环境里最容易“假通过”的验证项就是上电复位和电源域切换。为什么?因为RNM模型里电源电压是理想电压源,数字逻辑的复位信号也是理想驱动,所有事件都是确定性的,仿真结果当然整整齐齐全绿。

真实芯片里电源上电是一个渐进的斜坡过程,不同电源域之间还有先后顺序,复位释放跟随电源域状态,稍有不慎就会产生毛刺和亚稳态。验证时如果只用理想上电激励,流片后大概率会有复位时序问题。

我的建议是至少在MSDV环境里构造一个非理想上电场景:电压斜坡用RNM-3描述,每个电源域的开启时间错开几十微秒,复位释放延迟到所有电源域都稳定后再发生。在这个场景下把整个系统初始化流程跑通,再看有没有因为电源域未就绪导致的错误行为。

这个方法在我们的项目里抓到一个真实的bug:某个IO控制模块在上电时因为电源域未稳定就收到了使能信号,内部寄存器进入了一个错误的初始状态,导致后续所有配置都错位。如果只做理想上电测试,这个bug根本不会被发现。

5. 模型选型与团队协作的进阶心得

5.1 建模抽象的层次怎么定

每个团队对RNM模型抽象程度的把握差异很大。我见过有的团队把DCDC建模成了纯数学公式,输出和负载完全按公式算,和真实电路行为相差太远;也见过有的团队在一个LDO上倾注了半年的建模心血,精度接近晶体管级,但验证没跑几次就被弃用了。

我的实践经验是,RNM模型的抽象层次要按“被外部电路感知的行为”来定。所谓被外部感知,就是其他模块能不能通过端口信号观察到模型的内部状态变化。以PLL为例,外部电路最关心的是锁定指示信号的翻转时机、输出时钟频率的精度和抖动特性,至于电荷泵里充放电电流的失配多大,外部模块并不关心,建模时就简化掉。

按照这个原则,每个模型都先列一个“外部可见行为清单”,只对清单上的行为建模,其他的全部忽略。这样搭出来的模型速度快,验证频次高,真实效果反而比追求精确的庞大模型要好。

5.2 与数字团队、模拟团队的项目协作模式

MSDV环境的搭建和维护,天然需要数字验证工程师和模拟设计工程师坐在一起对需求。我刚开始做的时候习惯拉一个共享文档,把所有模拟IP的行为模型参数表放在里面,模拟工程师填写,验证工程师使用。但效果很差,参数更新不同步,经常模型里用的参数和最新仿真结果不一致。

后来改成每周一次“模型评审会”,验证工程师和模拟工程师逐个IP过参数状态:哪些参数已经冻结、哪些还在调、哪些可能影响系统行为。会议开起来之后,因为参数不一致导致的返工少了一大半。

协作中还有一个关键角色是数字后端工程师。网表落地时必须是验证团队先用RNM模型把接口行为定义好,再交给数字后端去综合和做物理实现。如果验证环境里还没有明确的接口行为定义,数字后端就只能自行脑补模拟IP的时序边界,出来的网表八成有问题。

5.3 扩展思考:MSDV还能往哪个方向走

MSDV这套方法论用熟了之后,可以往两个方向扩展。一个是往更高层次走,也就是把MSDV环境接入虚拟原型或者系统级仿真平台,和嵌入式软件联合验证。这样能在芯片回来之前就把驱动代码跑通,对项目进度帮助很大。另一个是往下走向模拟IP的良率分析和可靠性验证,RNM模型可以嵌入统计参数来做蒙特卡洛仿真,虽然比纯SPICE快很多,但因为模型本身做了抽象,统计结果的精度需要在建模时预留参数变化区间。

我个人更看好的方向是前者,因为芯片复杂度的瓶颈越来越转移到“硬件-软件-模拟交互”上,纯RTL验证只是第一关。MSDV环境里的RNM模型可以直接复用成系统级仿真的模拟IP模型,这在工具链上是一致的,把验证资产的价值真正延伸到项目后端,而不是流片就作废。

最后再分享一个实际工作中的小技巧:RNM模型里所有可能影响系统行为的参数,都要集中定义在模型头部,并加上注释说明来源和适用条件。坚持半年下来,你会发现排查问题的时候翻模型参数远比翻SPICE仿真报告要快。混合信号验证这个方向,入门门槛不高,但每个小决策都能带来蝴蝶效应,沉淀下来这些经验和规范,才是项目能否顺利流片的关键。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/9 6:27:16

SpringBoot驾校预约管理系统开发实战:从表设计到上线部署

驾校预约管理系统,这个选题我前后正经做过两版。第一版是纯Servlet思路,页面用JSP拼,登录态用Session硬扛,结果还没上线就被并发预约的冲突问题搞到怀疑人生。第二版全部推到重来,用SpringBoot做后端,把预约…

作者头像 李华
网站建设 2026/9/9 6:26:02

opencode实战指南:从安装配置到AI编程代理的高效工作流

从去年开始,我陆续试了一堆终端 AI 编程工具,一开始觉得新鲜,用多了就发现一个问题:很多工具要么绑定单一模型生态,要么只能在 IDE 里面用,换个项目就像换个 IDE 一样难受。最后真正留在我日常工作流里的&a…

作者头像 李华
网站建设 2026/9/9 6:25:38

AI元人文是什么?制造、部署、养护AI的完整能力栈

去年我在一个AI产品群里,看到有人抛出一个词:“AI元人文”。问了一圈,有人觉得是新造的概念,有人说是“会用AI的人”。后来和一位做企业AI落地的朋友深聊,才明白这个词不是轻飘飘的标签,它说的是三种能力的…

作者头像 李华
网站建设 2026/9/9 6:24:43

用SQLite和Python打造Ave Mujica个人资料库

第一次接触 Ave Mujica 少女时代这类跨媒体企划时,最先留在记忆里的往往是舞台和音乐带来的冲击:舞台氛围很爽,音乐能力很强,成员互动很可爱。这些观感如果没有及时沉淀,几天后就会变成几条截图和一堆收藏夹链接&#…

作者头像 李华
网站建设 2026/9/9 6:23:51

STM32H750+RT-Thread实战:从环境搭建到多线程应用完全指南

简介:正点原子STM32H750北极星开发板与RT-Thread 4.1.1结合的完整工程包,面向希望基于Cortex-M7高性能芯片开展嵌入式RTOS开发的工程师和院校学生。资源包含完整的源码、构建脚本及HAL库文件,共418个文件,以258个.h头文件和137个.…

作者头像 李华
网站建设 2026/9/9 6:23:17

S7-200 SMART恒压无负压供水系统:从硬件选型到调试全解析

1. 项目认知:管住压力,才是这套系统设计的主线 做供水控制不少年头了,经常有朋友或同行拿着一套“恒压供水(无负压供水)全套图纸程序”来找我,问的东西其实都差不多:这套程序能不能直接用&#…

作者头像 李华