ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

数模混合芯片验证实战:RNM建模与Verilog-on-Top环境搭建

数模混合芯片验证实战:RNM建模与Verilog-on-Top环境搭建 做数模混合芯片验证这些年有一个很深的体会混合信号验证MSDV最难的从来不是某个单一工具的用法而是怎么把模拟电路的行为用一种数字验证能接受的方式表达出来并且让这个表达在从 RNM 抽象到最终网表落地的整个链条里都是一致的。RNM 抽象、Verilog-on-Top、网表替换这三件事听起来是三个环节实际上是一条线。这篇文章把我在这条线上踩过的坑、总结的方法、还有最终跑通一套混合信号验证环境的完整思路整理出来希望能给正在做或者准备做混合信号验证的同学一些参考。如果你是非数模混合领域的数字验证工程师本文同样值得读。你不需要懂模拟电路内部怎么设计但你需要理解模拟 IP 的行为边界、接口时序、以及如何在纯数字仿真器上模拟一个模拟模块的行为。这个技能在当前 SoC 芯片越来越数模融合的大背景下已经变成验证团队的硬需求。1. 混合信号验证的核心痛点为什么数字验证的套路在模拟面前失效了1.1 数字验证和混合验证的本质差异先讲一个最底层的差异数字电路的行为是离散的模拟电路的行为是连续的。数字世界里0 和 1 就是一切仿真器只需要在事件驱动的机制下处理逻辑变化而模拟世界里电压、电流、温度、工艺偏差都是连续量电路行为必须通过求解微分方程来描述。这两者从仿真引擎层面就是两种完全不同的东西。我记得第一次拿到一个包含 LDO、PLL、ADC 的混合信号芯片项目时团队里数字验证工程师的第一个问题就是模拟模块的信号我到底应该怎么给激励因为 LDO 的电源输出不是 0/1而是 3.3V、3.28V、3.31V 这种连续变化的电压PLL 的时钟输出看起来像数字波形但它的锁相环带宽、抖动、锁定时间这些指标全是模拟行为ADC 更直接输入端就是一个模拟电压输出是数字码。如果按照传统的数模混合仿真方式也就是把模拟模块用 SPICE 网表放到 Spectre 这类模拟仿真器里数字模块放到 Verilog 数字仿真器里然后用专门的混合仿真接口做 co-sim最直接的后果就是仿真速度慢到令人发指。一个中等规模的数模混合芯片如果关键模拟模块用晶体管级网表跑一个完整的寄存器读写回归用例可能一晚上只能跑几个 case。这在数字验证里是没法接受的因为数字回归动辄几千个用例。这就是 MSDV 方法学登场的根本原因。MSDV 的核心逻辑是在满足验证精度的前提下尽量把模拟模块的行为抽象成数字仿真器能够高效处理的形式从而让整个芯片的仿真可以跑在纯数字事件驱动引擎上或者退一步说把需要真正模拟仿真的模块数量降到最低。1.2 仿真器分裂Analog Solver 与 Digital Simulator 如何协作在深入 RNM 之前有必要先搞清楚传统混合仿真里 Analog Solver 和 Digital Simulator 是怎么协作的。这能帮我们理解为什么 RNM 模型能大幅提升速度。传统混合仿真中模拟部分的每个节点电压、每个支路电流都要通过 Newton-Raphson 迭代法求解非线性方程组。简单理解就是模拟求解器要反复猜测节点电压然后计算误差再修正猜测直到收敛。这个过程每做一次时间步进都要重复而且模拟时间步长往往比数字事件的时间粒度小得多。PLL 这种电路为了精确捕捉充放电过程的细节时间步长可能要到皮秒级而数字部分可能几十纳秒才有一个事件。两者通过特定接口做同步这个接口不停地做数据交换和同步等待开销非常大。RNM 模型的思路完全是另一种维度。它不求解电压电流的物理方程而是把模拟模块的输入输出关系建模成数学表达式输入输出用实数信号传递。这样一来模拟模块就被转换成类似于数字模块的行为模型可以挂载到数字仿真器的事件队列里。数字仿真器看到的是一个 real 类型的端口和一段描述行为的代码处理起来和普通数字模块几乎没有差别。不过这里有个很关键的点RNM 模型不是凭空想出来的它必须经过精度验证。也就是说你用一个 RNM 模型去近似某个模拟模块前提是你已经通过 SPICE 仿真验证了该模型在所关注的工作点上和真实网表的行为偏差在可接受范围内。这个步骤做不好后面所有的验证结果都是空中楼阁。1.3 MSDV 流程的总体架构从 RNM 抽象到网表落地一套完整的 MSDV 验证流程从上到下大致可以分成五个层次第一层是 Spec 层。验证工程师需要理解模拟 IP 的系统规格比如 ADC 的分辨率、采样率、有效位数ENOBPLL 的锁定时间、抖动容忍度LDO 的压差、线性调整率、负载调整率。这些规格是后续建模和编写断言的基础。第二层是 RNM 行为模型层。用 Verilog-AMS 的 wreal 端口或者 SystemVerilog 的 real 类型把模拟模块的行为抽象出来。这个层次主要跑系统级验证、数字逻辑和模拟模块的接口协议验证。第三层是验证环境层也就是通常说的 Verilog-on-Top。整个 testbench 的顶层是一个 Verilog 模块所有的激励产生、参考模型、功能覆盖率收集、断言检查都挂在上面模拟 IP 以 RNM 模型实例化进来。第四层是网表替换层。在短暂的 pre-silicon 验证阶段后期或者碰到某些需要精确模拟行为的场景把部分关键模拟 IP 的 RNM 模型替换成晶体管级网表通过混合仿真器 co-sim。这一步需要解决网表格式、端口映射、仿真器配置等一系列问题。第五层是板级验证层。芯片回到封装和 PCB 设计后网表它自己的芯片网表、封装网表、PCB 网表如何通过工具正确流转早期芯片团队在做系统验证时经常会用到 SPICE 网表转成 IBIS 模型再在系统级的 SI/PI 仿真里使用。这个链条很长但每一环都有坑。有了这个总览我们再逐个拆解。2. RNM 抽象把模拟电路变成数字仿真器能跑的实数信号2.1 什么是 RNM为什么用实数而不是多 bit 数字信号RNM 的完整写法是 Real Number Modeling实数建模。核心思想很朴素模拟模块的关键参数是连续变化的那就用一个 real 类型来承载这个连续值。在 Verilog-AMS 里有专门的端口类型叫 wrealwire real在 SystemVerilog 里更直接端口声明成 real 就行配合 SV 的 interface、class能够做更复杂的建模。有人可能会问为什么不用多 bit 的数字信号来表示一个模拟电压比如用 12bit 的寄存器值来近似表示 0~3.3V 的电压范围精度也差不多这个思路听起来可行实际做起来问题很多。最主要的问题是数字信号的事件驱动特性一个 12bit 总线从 0x000 变成 0x001数字仿真器认为这是一次事件但如果总线从 0x000 变成 0x010中间跳过了 0x001 到 0x00F 的所有值仿真器不会逐一遍历这些中间值它只关心最终的逻辑值。而对于模拟信号来说中间过程恰恰是最重要的。比如 ADC 的输入电压从 1.2V 慢慢上升到 1.5V这个过程是连续渐变的如果把它量化成数字码每次跳变需要仿真器产生大量事件去模拟而且精度还受 bit 宽度限制。real 类型则不存在这个问题一个 real 信号可以从 1.2 毫秒级地变化到 1.5数字仿真器在内部把它当一个双精度浮点数处理事件触发效率远高于多 bit 数字信号。此外RNM 模型的输出可以携带模拟电路的关键误差信息比如 offset、gain error、noise。这些都可以通过数学表达式叠加到输出上而不需要真正仿真底层电路。这给验证又提供了一个层次的灵活性你可以在行为模型里人为注入误差来验证数字模块对模拟非理想性的容忍度。2.2 wreal、SV 的 real 接口与抽象层次怎么选RNM 建模的载体主要有三种第一种是 Verilog-AMS 的 wreal在 Cadence 的模拟混合仿真环境里支持得最好第二种是 SystemVerilog 的 real 端口配合 SV 的 interface 和 class 使用在纯数字仿真器里的兼容性更强第三种是 Cadence 的 CNTConnectivity Net Type表通过配置工具自动在不同 net type 之间做连接转换。在这三种载体之上RNM 模型本身还有不同的抽象层级。通常分为 Macro 模型、Meso 模型和 Micro 模型三个级别。Macro 模型是纯行为级通常用数学函数直接描述输入输出关系仿真速度最快精度最低Meso 模型开始考虑一些电路级的非理想效应比如带宽限制、压摆率限制、建立时间等Micro 模型则更接近电路级甚至会把内部的关键节点电压、偏置电流都建模出来精度高但仿真开销也大。实际项目里我的经验是系统级验证和数字逻辑验证阶段优先用 Macro 模型接口时序验证和某些需要精确模拟行为对齐的阶段用 Meso 模型只有到了 sign-off 前的混合仿真阶段或者关键的模拟-数字交叠行为需要验证时才把个别模块替换成 Micro 模型或者晶体管级网表。为了管理这些不同抽象级别建议在环境里预留一个统一的开关比如通过编译选项区分USE_RNM_MACRO、USE_RNM_MESO、USE_TRANSISTOR_NETLIST。这样同一套测试用例可以跑不同抽象层级的仿真方便做 cross-check。2.3 RNM 建模的几个实操要点从 ADC 例子说起直接说一个最常见的模拟 IP——SAR ADC——的 RNM 建模方式来展示怎么把一块模拟电路变成实数模型。SAR ADC 的输入输出关系很简单模拟输入电压 Vin 经过采样保持、逐次逼近比较最后输出 N bit 数字码。理想情况下数字码与输入电压之间的关系是一个量化函数Dout clamp(round((Vin - Vref_min) / LSB), 0, 2^N - 1)其中 LSB (Vref_max - Vref_min) / 2^N。写成 Verilog-AMS 的 wreal 模型就是include constants.vams include disciplines.vams module adc_sar_rnm(input wreal vin, input wire clk, input wire rst_n, output logic [N-1:0] dout); parameter real VREF_LOW 0.0; parameter real VREF_HIGH 3.3; parameter int N 12; real lsb; real vin_sample; always (posedge clk or negedge rst_n) begin if (!rst_n) begin dout 0; end else begin lsb (VREF_HIGH - VREF_LOW) / (1 N); vin_sample vin; // 采样 dout (int((vin_sample - VREF_LOW) / lsb 0.5)); end end endmodule这段代码里面的关键点是输入用 wreal 类型接收一个实数模拟量内部在时钟上升沿采样并完成量化输出的数字码是标准 logic 类型可以直接接到数字验证环境里。整个过程没有任何 SPICE 器件也没有求解器数字仿真器可以像处理普通 RTL 一样来处理它。但实际项目里这个理想模型远远不够。你会遇到至少四个问题一是采样抖动实际 ADC 采样时钟存在孔径抖动这会导致采样点偏离理想位置模型里可以加上一个服从高斯分布的随机项来模拟二是比较器噪声导致相同电压在不同次采样时码值可能不同可以在量化之前加一个噪声项三是满量程失配VREF_HIGH、VREF_LOW 本身有偏差需要在参数里体现四是建立时间不足输入的驱动能力不够时采样电容上的电压跟不上输入变化这通常需要用 RC 冲激响应模型来模拟。建模的时候不要试图一次把所有这些非理想效应全部加进去控制复杂度很重要。我的建议是第一版按照理想模型来做先把整个验证环境跑通然后在数字逻辑和该模拟 IP 交互的用例中逐步加入某个具体的非理想效应逐个验证和调试确保每个效应都独立可控。一次性加太多噪声项出了问题根本不知道是谁引起的。3. Verilog-on-Top 环境为什么顶层必须是 Verilog以及怎么搭建3.1 为什么顶层用 Verilog 而不是其他语言Verilog-on-Top 的意思很简单整个验证环境的顶层模块用 Verilog/SystemVerilog 编写所有的验证组件包括激励发生器、参考模型、断言、覆盖率组都在这个顶层下组织起来。模拟 IP 则作为被测设计的一部分以 RNM 模型或者网表的形式被实例化进来。为什么强调顶层用 Verilog因为数字验证的主流语言已经是 SystemVerilogUVM 方法学的核心就是 SystemVerilog。如果顶层是 Verilog-AMS 或者 SPICE 网表那么验证工程师写起来就会很别扭因为 UVM 的 driver、monitor、scoreboard 组件很难和模拟域的信号自然地衔接。而顶层的 Verilog 模块可以很方便地实例化一个带有 wreal 端口的模块也可以直接实例化一个 UVM 环境。另一个原因是编译工具链。纯数字仿真器比如 VCS、Xcellium 的 digital 模式都能够直接编译 Verilog 顶层加上 RNM 模型一旦加入真正的 SPICE 网表就必须切换到混合仿真模式。Verilog-on-Top 让你可以在不改变验证环境顶层结构的情况下只替换被测模块的实现形式这对验证环境的可复用性至关重要。具体来说我的环境结构通常是这样的module tb_top(); // 系统时钟与复位 logic clk; logic rst_n; // 模拟接口信号real类型 real v_out; real v_in; // DUT 实例化 my_chip_tb_top dut ( .clk(clk), .rst_n(rst_n), .ldo_out(v_out), .adc_in(v_in) ); // 验证组件 dut_env env; initial begin env new(); run_test(); end endmodule3.2 搭建一个混合信号验证环境的关键步骤搭建一套基于 Verilog-on-Top 的混合信号验证环境按照我的经验主要分四步走。第一步是做接口信号清单。把芯片所有模拟输入输出信号、数字控制信号、电源/地信号逐条列出来标清楚信号名、电气类型、驱动方向、电压域。这个清单是后续所有工作的基石。很多人容易忽略电源/地信号在 mixed-signal 验证里的作用因为数字验证通常对电源不敏感但在模拟场景里电源噪声、上下电时序直接影响芯片行为。第二步是建立 RNM 模型库。根据接口清单和模拟 IP 规格为每一个模拟 IP 建立 RNM 行为模型。建模过程中需要和模拟设计团队充分沟通确认关键参数、非理想效应、输入输出阻抗等。这个步骤要特别注意的是模型接口必须和真实网表接口保持完全一致否则后面替换网表时会出现端口不匹配的问题。第三步是搭建数字验证环境。利用现有数字验证的成熟方法学把 RNM 模型当作一个普通模块实例化进 DUT然后构建激励、参考模型、断言、覆盖率模型。这一步的工作量大部分集中在参考模型上因为参考模型需要精确模拟模拟 IP 的理想或非理想行为以便和 RNM 模型做比对。第四步是做回归和精度校验。每一版 RNM 模型建立后需要跑一组标准用例把 RNM 模型的仿真结果和 SPICE 模型的结果做对比确认误差在可接受范围内。这个精度验证非常重要我之前做一个 LDO 的验证时RNM 模型稳态输出电压和 SPICE 结果差 20mV表面上看问题不大但下游 ADC 采样时刚好落在临界码值上导致好几条用例失败。3.3 从 RNM 模型替换为真实网表的策略RNM 模型跑通之后下一步是把关键模拟 IP 替换成网表做更精确的混合仿真。这一步的替换策略直接关系到整个验证计划的进度。替换顺序上有两个派别。第一个派别是全部替换也就是把所有模拟 IP 一次性全部换成网表跑混合仿真。这个方案听起来最完整但实际上是灾难混合仿真速度慢调试复杂一旦出问题很难定位而且有些模块的晶体管级网表在验证阶段根本还没有冻结。第二个派别是关键路径替换也就是只替换某些和数字逻辑交互密切、或者最容易产生接口风险的关键模块其他的继续留在 RNM 模型。我的建议是采取第二种方案并且按照以下原则选择优先替换的模块第一类优先替换有严格时序要求、和数字逻辑握手信号非常密集的模块比如 ADC 转换完成信号、PLL 的 locked 信号。这些信号在 RNM 模型里通常被理想化但真实芯片里它们的时序因为模拟寄生参数而有所不同最容易出接口 bug。第二类优先替换经历过多次 ECO 的成熟模块。如果一个模拟 IP 经过几次改版netlist 和原始 model 之间的行为可能已经有偏差需要验证环境能捕获到这种偏差。第三类优先替换有大的上电浪涌、DCDC 开关噪声等强干扰行为的模块。这类模块会产生明显得瞬态行为RNM 模型很难精确模拟必须用网表级仿真来验证其对数字电路的干扰。替换的过程中还有一个不能忽略的问题混合仿真器的配置。不同的混合仿真器比如 Cadence Xcelium AMS、Synopsys VCS AMS对模拟网表的支持方式不同端口映射、netlist 打包、connect rules 的配置都可能踩坑。这个话题放到第 4 部分细说。4. 网表落地的实操细节从 orcad 导出网表、allegro 导入网表说起4.1 网表导出前的检查电源、时钟与逻辑连接网表落地是一个系统工程这里先讲一个很多人容易忽略的层面在网表导出之前就必须建立一套严格的检查流程。无论是芯片内部网表还是今天很多人做系统设计时用 orcad 导出的板级网表导出前的检查都决定了后续能否顺利走下去。先说为什么芯片验证阶段也要关心 orcad 和 allegro 这一对工具链。很多混合信号芯片做系统验证时需要把芯片 model 放到一个包含传感器、运放、电源管理单元的完整系统板级环境里仿真这时候常常会用到 orcad 来画系统级原理图导出网表后再导入 allegro 做 PCB 布局布线前的仿真。也就是说一个混合信号芯片验证工程师很可能也要懂网表在 PCB 流程里怎么流转否则你做的芯片系统仿真和最终板级实现之间可能脱节。orcad 导出网表这一步最常见的坑有三个。第一个是电源与地网络命名不一致。orcad 原理图里如果电源网络叫 VCC_3V3但是芯片引脚封装上叫 VDD_3V3导出网表到 allegro 时就会出现网络连接错误的警告严重时直接导致 PCB 漏连或错连。解决办法是在导出之前跑一遍 Design Rules CheckDRC并把电源网络的命名统一规范。第二个坑是元件封装不匹配。orcad 原理图上的逻辑符号对应到 allegro footprint 时如果引脚编号对不上导入网表后会出现大量 No pin match 的报错。这块我在实际项目里遇到过好几次最后唯一的办法是逐脚核对封装图不要嫌麻烦。第三个坑是不用 orcad 的全局网络。orcad 里用 off-page connector 或者全局网络标签时如果命名有空格或者不常见的字符allegro 导入时容易在连接关系上出错。经验教训是网络名尽量用字母、数字、下划线不要用中文也不要用和实际电气属性无关的缩写。4.2 allegro 导入网表时的常见报错及应对allegro 导入网表的全过程简单概括就是生成网表、导入、检查、布局布线。实际导入的时候最常见的报错主要有这几类第一类叫 Symbol not found意思是封装库里缺少某个元件对应的封装符号。这个问题的根源通常在 orcad 导出时没有同时生成对应的 footprint 名称或者封装路径设置不对。解决方法是检查封装库路径把缺少的封装补上。第二类叫 Pin mismatch表示 orcad 原理图里元件的引脚和 allegro 封装里的引脚数量或编号不一致。这个报错几乎每次导入都不会完全避免。经验做法是先在 orcad 里就对每一个元件做 footprint 关联关联时核对引脚数量和编号而不是等到 allegro 再发现问题。第三类是连接性丢失告警。这类告警不报硬错误但会提示某些信号网络没有完整连接。它往往来源于 orcad 中一些悬空引脚或者 NCNot Connected引脚没有妥善处理。在 orcad 里给 NC 脚专门做一个 NC 符号而不是直接留空能显著减少这种告警。把这一套经验扩展到芯片内部验证你会发现本质是同一个逻辑在网表落地之前先保证格式、命名、接口这三层的一致性。芯片内部的模拟 IP 如果用 SPICE 网表替换 RNM 模型同样要先检查格式一致性。比如 Cadence 的 Spectre 网表和 HSpice 网表在某些器件模型关键字、语法格式上不一致直接混用会报错。混合仿真工具一般有 netlister可以把 Spectre netlist 转成统一的格式但转换过程中要注意衬底连接、寄生参数保留等细节。4.3 芯片流程里的网表落地从 RNM 模型到 SPICE netlist 的衔接回到芯片验证的主线。把 RNM 模型替换成 SPICE 网表中间还有很多衔接工作要做。首先是接口映射。RNM 模型是一个完整的 Verilog 模块端口类型是 wreal 或者 logic但 SPICE 网表的端口通常是没有方向的 subckt 引脚需要通过 connect rules 将电学端口电压信号和数字端口逻辑信号连接起来。connect rules 定义了模拟域信号在某些阈值/条件下如何转换到数字域比如将模拟电压经过一个施密特触发器行为转化为 0/1。这一步最影响验证正确性的是 connect module 的选择。Cadence 工具里有一些内置的 connect module例如 a2d 和 d2a。但如果你的设计中电平不标准比如模拟域用 1.8V 逻辑数字域却是 1.2V 逻辑就需要自定义 connect module。自定义 connect module 的时候必须明确转换阈值、迟滞范围、上下拉行为。其次是建模精度验证。网表替换后必须在同一组 test case 下跑一遍比对确认网表结果和 RNM 模型结果在系统级指标上保持一致。一般来说系统级行为比如寄存器配置、状态机跳转必须完全一致个别模拟指标比如建立时间、噪声指标允许有一定范围内的偏差。最后是收敛性测试。混合仿真的收敛性是一个非常重要却又容易被低估的问题。特别是包含反馈环路的电路比如带隙基准、PLL charge pump、DCDC 环路在模拟求解器里很容易出现不收敛的情况。遇到不收敛先检查模型参数是否超出合理范围再检查时间步长设置是否过大最后才考虑是不是电路本身的问题。5. 常见问题与排查技巧实录5.1 仿真卡在模拟模块无法推进混合仿真最让人头疼的问题之一就是仿真器在一个模拟模块上长时间停留仿真进度条纹丝不动。出现这种情况十有八九是模拟模块的求解器在反复迭代却无法收敛。排查的第一步是查看仿真器日志中的警告信息。通常在 non-convergence 报错前面工具会打印出当前时间点、相关节点、收敛阈值和当前的迭代误差。如果误差值一直在某个范围内振荡说明节点电压在两个候选值之间来回跳。此时把该模块的时间步长上限调小一些比如从 10ps 降到 1ps通常能让 Newton 迭代收敛。如果调小时间步长仍然无效接着检查模型中是否有突变行为。例如我在一个二极管连接 MOS 的模型里遇到过当电压跨过某个阈值时电流模型用了不连续的 if-else 表达式导致雅可比矩阵在该点出现奇异。解决方法是把突变表达式改成平滑的 tanh 过渡函数或者用 Verilog-AMS 里自带的一些平滑函数。还有一个容易忽略的原因是电源上电速度过快。如果数字仿真器控制的电源在 1ns 内从 0 跳到 1.8V模拟求解器会因为 dV/dt 过大在非线性电容模型上出现极大的瞬时电流导致收敛困难。解决办法是延长电源上升时间或者加一个限流电阻模型。5.2 时间步长不一致导致的结果失配RNM 模型和 SPICE 网表混仿时经常出现同一个 test case 在 RNM 模型下结果完全正确在网表替换后却出现时序失配。这个问题的根本原因是两边的仿真步进机制不一致RNM 模型跑在数字事件队列里时间推进粒度是事件触发的SPICE 网表跑在模拟求解器里时间推进粒度是自适应的两个引擎之间的同步由 DMIDirect Method Interface或类似机制完成。当数字域和模拟域之间频繁握手时比如 ADC 每切换一次输入通道就触发一次转换每次转换都需要跨域通信这个同步代价会被放大。仿真器为了减少同步开销有时会人为拉大两次同步之间的时间间隔这会导致模拟域看到的数字信号跳变时间点不再精确。遇到这种问题我的第一反应是查看仿真器配置里的同步精度参数把它调高虽然会牺牲一些仿真速度但能够显著提升跨域信号的时序准确性。另外一个务实的手段是把 test case 中的时钟沿和模拟域信号的变化点错开避免跨域信号在同一时刻剧烈变化减少同步压力。5.3 RNM 模型精度不足导致的误收敛这张表总结了我在多个项目里遇到的几类高频问题方便你直接对照排查症状可能原因处理思路数字逻辑认为 ADC 未完成转换RNM 模型中转换时间参数设置过短对照 SPICE 仿真结果校正转换时间加 mask 窗口重写断言不同 RNM 抽象级别下系统行为不一致Macro 模型忽略了建立时间/压摆率等效应检查是否该场景必须升级到 Meso 模型加入 RC 建立模型PLL 行为在 RNM 中锁定时间过长环路带宽参数设置不准与模拟设计核对实滤波器的极点/零点位置网表替换后 DCDC 输出纹波异常connect module 的阈值或迟滞范围不匹配重新校准 connect rules 的电压转换阈值混合仿真速度骤降模拟模块数量过多评估哪些模块可以退回到 RNM 模型只保留关键模块板级网表导入 allegro 报 PIN mismatchorcad 符号与 allegro 封装引脚定义不一致在 orcad 里逐脚核对 footprint 关联我特别想强调最后两行的问题。模拟模块数量过多导致混合仿真速度骤降这个在项目后期几乎必然出现。很多人会忍不住把全部模块直接替换成网表结果仿真慢到无法推进。比较明智的做法是保持一个分层网表替换策略系统级回归用 RNM 模型为主只保留最关键的 1~2 个模块用网表完整 sign-off 前再跑一轮全网表覆盖。这样既保证了收敛速度也不错过关键的模拟-数字交互问题。板级网表导入 allegro 报 PIN mismatch 的问题本质上是符号设计与 PCB 封装设计脱节导致的。这个在芯片公司同样常见因为芯片的封装引脚分配是由封装工程师主导的而系统级原理图是板级工程师画的两边如果不做交叉核对很容易出现一个按信号名分配、一个按引脚号分配的情况。对于验证团队来说要么引入一份统一的信号-引脚映射表要么在跑系统级仿真前强制跑一遍导入检查。6. 工具选型与仿真器配置的再思考6.1 不同混合仿真器的定位差异RNM 模型本身是可以跨工具使用的但真正到了网表落地阶段工具选型的差异就会体现出来。以市面上最常见的几款工具为例Cadence 的 Xcelium AMS 在模拟网表编译和 connect module 配置上做得比较顺滑对 Verilog-AMS 的支持尤其完整Synopsys 的 VCS AMS 则更强调和数字验证环境的集成如果你整个数字验证环境都基于 UVMVCS那它自然会更顺手。如果你的项目高度依赖 SystemVerilog 断言和覆盖率建模那么无论选哪家都要确保 RNM 模块和 SV 断言能够自由交互。有的工具在老版本里对 wreal 信号做断言检查支持不够需要先用一个 real-to-logic 的转换把连续信号变成离散事件后再跑断言这会带来额外的事件开销。我的建议是在项目初期就让工具厂商的 AE 帮你跑一个概念验证样例把你们设计里最复杂的模拟 IP、最典型的验证场景做成一个最小测试用例看它的编译速度、仿真速度、断言支持度是否达标。不要等到环境搭了一半再换工具那代价太高了。6.2 仿真器配置的黄金参数组合混合仿真的性能很大程度上由配置参数决定。下面分享一组我多次项目实测下来比较稳的配置思路供你参考具体数值需要根据你的设计规模调整数字域和模拟域同步精度默认是 1/100 时钟周期如果跨域信号时序要求高调到 1/1000否则保持默认即可模拟求解器的最大时间步长根据系统中最快的时间常数设置不要一味设小否则仿真会变得异常缓慢connect rule 更新频率通常设置成每个时钟上升沿更新即可过高会导致额外开销开启分层 netlist 编译能够显著缩短编译时间尤其是在多次迭代网表替换时仿真波形输出的信号数量要克制混合仿真的波形文件大小非常夸张只在需要调试的用例里打开全量波形输出回归用例里只输出关键状态量。6.3 关于 UVM 环境和 RNM 模型复用的一个补充在验证环境复用方面我的一个重要体会是把 RNM 模型包在一个 UVM agent 后面是保持环境可复用性的一个好方法。也就是说DUT 的外部模拟端口不直接和 testbench 顶层信号互连而是由一个高阻缓冲层做隔离。这样在系统级验证时模拟接口可以连接真实的 RNM 模型在模块级验证时可以把 RNM 模型替换成一个虚拟的 input driver。这个抽象层次是很多初学者容易忽视的但它能避免你后期为了适配不同抽象层级而大改验证环境。写在最后的实操体会如果只能给你一条建议那就是在混合信号验证环境里永远不要把 RNM 模型当成临时代码来写。它是一个需要版本管理、详细注释、精度记录和评审流程的一等公民。我见过太多项目RNM 模型是某个工程师为了赶进度临时写的没有参数化没有注释没有精度验证记录等换一个人接手或者模拟 IP 改版后整个验证环境就崩了。反过来如果每个模拟 IP 都有一个规格良好、精度验证过的 RNM 模型库不同项目之间复用起来会非常高效后续网表替换和系统验证都会顺畅得多。另一个小技巧是在你开始搭建混合信号验证环境之前花半天时间和模拟设计 team 仔细过一遍每个模拟 IP 的工作模式和 trigger 条件搞清楚哪些信号是纯模拟的、哪些是数字和模拟共享的、有没有特殊的上电时序要求。这个沟通远比你自己埋头看 Spec 效率高。模拟设计工程师往往对验证环境的理解不够深你主动问一次接下来几个月的建模和联调工作都能省下不少力气。混合信号验证这条路表面上拼的是工具和流程实际上拼的是对抽象层次的理解。RNM 模型是一种抽象Verilog-on-Top 是一种抽象网表替换也是一种抽象。你能在这个抽象链条里自由穿梭并且随时清楚每一层抽象忽略了什么、保留了什么时候你才算真正把这套方法学攥在了手里。希望这篇文章能帮你少走一些我已经走过的弯路。
返回列表