ARTICLE DETAIL

资讯详情

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

PowerSI高速链路S参数提取全流程:从模型清理到仿真验证

PowerSI高速链路S参数提取全流程:从模型清理到仿真验证 这段时间在调一块10Gbps的背板发送端波形正常过完连接器之后眼图就散得没法看。时域上换驱动、调均衡折腾两天都没效果。后来把整条通道的S参数完整提出来在频域里一查问题清楚得不能再清楚过孔处的回波损耗在某个频点直接顶到-8dB谐振导致的插入损耗凸起正好压在信号主瓣上。做信号完整性的人手上可以没有昂贵的时域示波器但一定要有一份靠谱的S参数。PowerSI是PCB/封装级S参数提取最常用的工具之一这篇文章我按自己的实际流程把提取和转换的每一个环节展开讲。适合正在做高速链路仿真、DDR总线验证和SerDes通道评估的工程师参考也适合刚入门的SI工程师把它当成一份可以照着操作的流程清单。1. 从一块10G背板的实际问题说起S参数为什么绕不开1.1 S参数描述的是通道本身不是信号S参数全称散射参数描述线性无源网络在频域下各个端口之间的入射、反射和传输关系。拿最简单的双端口网络来说S11是1端口反射系数S21是1到2端口的正向传输系数S12是反向隔离S22是2端口反射系数。对一个无源互连结构这四个参数就完整描述了通道本身的电气行为。可以打一个比方把高速通道想成一个水管系统你往一端加压注水有一部分水会因为接口不平整、管道变径而反射回来对应S11有一部分水顺利流到另一端对应S21还有一部分可能通过管壁泄漏到别的地方对应串扰项。管道的物理结构一旦确定这个反射比例和传输比例在每一个频率上都是固定值和你实际往里灌的是自来水还是果汁没关系。S参数描述的就是这种固定特性它与具体的激励码型、驱动强度解耦。这正是S参数在高速链路设计中的价值所在只要拿到一段互连的S参数就可以在不同工具、不同算法里反复计算眼图、抖动、串扰而无需重新做三维电磁仿真。对PCB和封装这类结构复杂的目标S参数是整个信号完整性分析链条里最普适的中间产品。无论是DDR4总线读写裕量评估还是SerDes通道的插损预算分解最终都要落到一份可信的S参数上。1.2 PowerSI在提取工具里的位置做PCB/封装互连的电磁场求解业界常用工具大致有全波3D工具HFSS、CST、混合求解工具PowerSI、SIwave和快速规则检查工具三类。PowerSI属于Cadence Sigrity产品线它针对整板、多网络、多端口场景做了大量优化可以在精度可接受的范围内快速求解数十上百个端口的S参数矩阵。用什么工具取决于场景。对一个连接器本身或单个过孔做精细建模HFSS这类全波工具依然是标准答案但对一整块18层板上的DDR4总线做串扰和插入损耗评估用HFSS建模不现实PowerSI这类工具才是主选。我个人的分工是整板参数提取、链路初评用PowerSI关键局部结构连接器压接区、特殊过孔用全波工具复核两套结果相互印证。PowerSI也支持从频域结果转到时域TDR、生成等效SPICE模型这些能力让它不只是一个算S参数的黑盒子而是整个链路仿真流程的中转站。下面的实操流程我按PowerSI展开。2. 动手前的三道工序模型清理、叠层核对、端口放位2.1 导入模型后先做网络体检而不是直接摆端口PowerSI可以直接打开Allegro的.brd文件也可以读入ODB、GDS等格式。跨工具链推荐用ODB信息完整度比Gerber高很多。我习惯先在原设计工具里把不需要的测试点、调试电阻、丝印等元素清理掉再导出这样既减小文件体积也避免无谓的网格开销。文件导入之后第一件事不是新建端口而是做网络完整性检查。重点看几类问题电源地平面被分割后是否完全断开、关键信号线的返回路径是否被跨分割、走线有没有断线或悬空的过孔、地孔是否稀疏到会明显抬高回流电感。还有一个很常见但容易被忽略的点板上会有一些孤立的铜皮它们在仿真器里会形成悬浮导体既增加网格量又可能导致非物理的寄生耦合。这个步骤听起来基础但我见过不少同事直接导入文件就开始摆端口结果跑出来的S21在高频段出现莫名其妙的损耗峰排查半天最后发现是一个没接地的大面积铜皮在谐振。花十分钟做一次网络体检后面能省一天。2.2 叠层参数是误差的第一大来源S参数提取的精度上限其实在叠层参数而不是求解器。最关键的三个参数是介质介电常数DK、损耗角正切DF、铜箔粗糙度。对FR4类板材DK一般在3.8~4.4之间随频率会略有下降DF在0.014~0.025范围频率越高损耗越明显。如果板厂提供的DK/DF是1GHz下的测试值直接用在全频段仿真10GHz以上插入损耗会有明显偏差。高频下铜箔粗糙度的影响更要重视。10Gbps信号的有效带宽到5GHz25Gbps到12.5GHz以上在这个频段粗糙度导致的导体附加损耗可能占到总损耗的两到三成。PowerSI支持设置铜箔粗糙度模型常见的是Huray模型和Sunder模型。如果板厂没有给参数先按RMS 1μm左右设置等拿到实测损耗曲线再做标定回调。注意不同粗糙度模型的拟合参数不是随便填的需要知道对应型号的球径和密度实在没数据就按工具内置的常用铜箔预设值来。叠层设置里每一项都要跟板厂实际物料逐项核对特别是芯板Core和半固化片PP的树脂含量这个会直接影响DK值。有些工程师嫌麻烦直接沿用上一个项目的叠层模板这是高风险做法——不同板材供应商、不同压合工艺出来的成品DK可能相差0.2以上对高速信号来说这个偏差足以改变谐振点的位置。2.3 端口类型和参考地选择直接影响结果可信度PowerSI的集总端口Lumped Port用于在两节点之间定义激励端口。单端信号端口典型做法是信号节点连到最近的参考地节点差分端口是两条信号走线成对定义再配参考地。这里最核心的原则是端口的下端必须接到信号实际回流路径所在的那一层参考平面而不是随便找一个最近的地。如果把端口另一端接到了远处地孔就会在端口处人为引入一段回流路径电感和额外辐射得到的S参数会比真实通道偏优。端口位置还要远离过孔反焊盘、走线宽度突变等不连续区域。因为端口附近假设了准TEM传输模式如果端口放在场型剧烈变化的位置提取结果会对网格密度非常敏感。实际中我会把端口稍微移出走线拐角或过孔区用一小段等宽走线作为端口延伸部分让激励位置处于相对均匀的传输线场型中。另外端口编号是一个容易被低估的细节。多端口提取时PowerSI按你选择的顺序生成编号导出的Touchstone文件也沿用这个顺序。如果后面的链路仿真工具是按网络名逐一映射端口那么编号顺序错乱就会引发非常隐蔽的错位。建项目的第一步我就把关键网络按发送端到接收端的链路方向统一命名和排序后面数据对接会省很多事。3. 仿真执行阶段频率范围、网格密度与资源规划的妥协3.1 提取频率范围不是越高越好S参数提取频率范围要覆盖信号有效带宽。经验做法是取到信号基频的3到5倍。对10Gbps的NRZ信号基频5GHz提取到15~25GHz足够25Gbps的NRZ至少取到50GHz。PAM4信号因为对损耗容忍度更高但高频分量更密集带宽要求通常比同速率NRZ更苛刻。频率上限提得越高网格细化和求解规模增长很快所以不要盲目设定。频率扫描方式也值得讲究。我一般先用对数扫频从10kHz扫到20GHz每十倍频程取80~100个点先拿到全频段趋势在关注频段例如谐振点附近再加密频点让最终导出的S参数文件有足够点密度减少下游工具做插值引入的误差。低频点不要忽略尽量包含几百kHz以下的频点这样后续做去嵌入和时域变换时才能保留完整的低频响应信息。3.2 网格剖分能细则细但关键区域必须人工干预PowerSI的网格剖分是自动加手动结合。整体上网格密度受限于内存和求解时间。按我的习惯先把整板用相对稀疏的网格跑通流程确认端口、频率设置无误后再把关键网络的走线、过孔、连接器焊盘区域局部加密跑正式结果。这样既保证关键结构精度也避免第一次就因网格过大导致内存不足。怎么判断网格够不够最直接的方法是看S参数曲线是否光滑。如果S11在某频点附近出现小锯齿或者S21抖动明显基本都是网格不够细或者结构剖分退化导致的。另一个方法是做网格收敛性检查把关键区域网格加粗一倍和加密一倍各跑一次结果曲线重合得很好说明网格已经收敛如果两次结果有明显差异说明还在网格敏感区需要用更密的网格。网格最小尺寸一般取工作频率对应波长的1/20到1/30或者按设计文件的最小特征尺寸来限制。但过密的网格会让内存暴涨所以我的策略是整板粗、关键细配合PowerSI的局部网格加密功能把算力花在刀刃上。3.3 大规模端口提取的资源规划整条DDR4或者PCIe总线提取端口数从几十到几百不等。全波求解的时间和内存随端口数快速增长所以资源规划非常关键。我有几个实操经验端口数超过50个时优先用PowerSI的分布式并行计算多机并行比单机多核效率高得多。不要试图一次性把所有网络全部选中提取。按总线分组例如数据组、地址组、时钟组分开提取需要时再级联这样单次任务的内存可控。单机内存64GB以下时一次提取的端口数控制在100个以内通常比较稳妥超过这个规模建议分段做。以一块8层板、50个端口规模为例用16核工作站跑0~20GHz的提取通常几小时能完成。如果同样结构要跑到50GHz时间会成倍增长这时就要考虑减少频点或者分组处理。别小看这个规划我见过有人在整板200多个端口的模型上直接开跑结果算了三天还没出结果最后才发现内存换页已经把CPU拖死了。3.4 结果可信度的三个快速判定方法仿真跑完不要急着导出先用三个方法判断结果靠不靠谱。第一物理趋向检查。S21随频率应该整体缓慢下降S11在无源网络里一定小于0dB。如果出现某频点S11大于0dB或者S21在窄带内激烈振荡一定有问题。第二无源性检查。无源互连的S参数矩阵最大奇异值不应该超过1。用Python或工具直接查看整个频段内最大奇异值是否超过1超过只说明仿真存在数值误差需要排查网格和端口设置。下面是一个用scikit-rf做无源性检查的简单示例import skrf as rf import numpy as np ntw rf.Network(channel.s4p) for f, s in zip(ntw.f, ntw.s): singular_values np.linalg.svd(s, compute_uvFalse) if singular_values.max() 1.0 1e-9: print(f{f/1e9:.4f} GHz: max SV {singular_values.max():.6f})第三互易性与一致性。无源线性网络的S参数理论上满足S12约等于S21对于完全对称的差分结构SDD11和SDD22应当接近。这些检查花不了五分钟能拦住绝大多数低级错误。检查项判定标志常见原因S11应小于0dB端口参考错误、有源器件误入S21曲线平滑单调缓慢下降网格不够、悬浮导体谐振最大奇异值不超过1网格误差、端口过近S12 vs S21幅度差小于0.1dB求解收敛问题、端口排序错误4. 提取之后的数据转换Touchstone、混合模式与TDR4.1 Touchstone文件格式的那些细节PowerSI最常见导出结果是Touchstone文件。一个N端口网络导出为.sNp文件后缀的数字就是端口数。Touchstone有好几个版本1.0只支持单端S参数2.0增加了混合模式、噪声参数、带内渐增频点等支持。导出的时候要特别注意单位文件头通常写GHz、参考阻抗默认50Ω和数据格式MA、DB、RI三种。一个典型的Touchstone文件头部长这样! CREATED BY PowerSI # GHZ S MA R 50如果下游工具读不了常见原因就是版本关键字不兼容。比如某个工具导出的是Touchstone 2.0带上了[Version] 2.0这样的关键字头而下游老版本工具只认1.0就会报错。解决办法很简单用编辑器打开文件把版本头改成1.0的标准格式。但要注意如果文件包含混合模式或噪声数据改成1.0就会丢信息最好保留2.0并在下游升级支持库。用Python做格式转换也很方便。scikit-rf是一个开源的射频网络分析库读取和重写Touchstone只是基本功能import skrf as rf ntw rf.Network(channel.s4p) # 重采样到指定频点 ntw.resample(20001, 0, 20e9) # 写出新的Touchstone2.0 ntw.write_touchstone(channel_resampled.s4p)这种脚本非常适合批量转换和数据清洗比如把一套原始S参数统一重采样到同一个频率网格方便后续对比。我建议在工程目录里常备一份类似脚本遇到格式问题十分钟内就能解决。4.2 从单端S参数算差分混合模式多数高速协议用的是差分信号最终关心的也是差分S参数SDD。PowerSI可以在提取时直接输出混合模式S参数但如果手里只有单端.s4p也可以自己转。以4端口1、2为差分对正负端3、4为另一对正负端转2端口差分对为例关键的差分回波损耗SDD11由下式给出SDD11 1/2 × (S11 - S12 - S21 S22)这个式子的物理含义是在端口1分别施加差模和共模激励时反射回差模分量的比例。完整转换还包含SDD12、SDD21、SDD22、SCC以及差共模转换项。手工用Excel算容易出错在scikit-rf里可以用现成函数ntw_4 rf.Network(quad.s4p) differential ntw_4.se2gmm() # 返回4端口混合模式网络前两个是差模转换后建议立刻做两个交叉核对。一是看差分插入损耗SDD21相比单端S21是否有所改善通常差分管脚对共模噪声抑制会好一些但不绝对二是看差模与共模的远端耦合是否在合理范围。如果转换结果出现差分反射大于单端反射的异常多半是端口编号映射错了回到公式对照每一相。4.3 用S参数反推时域TDR反过来验证提取质量S参数是频域信息但可以通过逆傅里叶变换得到通道的阶跃响应或冲激响应进一步得到类似TDR的时域反射曲线。这个操作有三个用途定位阻抗突变点、验证提取端口是否正确、为后续统计眼图提供时域脉冲响应。PowerSI自带TDR仿真模板ADS和SystemSI也可以做。用scikit-rf也能快速看阶跃响应import skrf as rf ntw rf.Network(channel.s4p) ntw.plot_step_response()做TDR验证时要注意频率上限和点数。频域上限决定了TDR空间分辨率20GHz上限对应的分辨率大约在几毫米量级频点太少则时域波形会有明显振铃。所以我前面建议提取频率尽可能高、频点尽可能密不只是为了S参数本身也在为后续时域变换铺路。一个过孔引起的阻抗凹陷、一条stub引起的谐振都会在TDR波形上留下清晰特征反过来也能验证端口设置是否合理。4.4 S参数和系统级仿真工具的衔接S参数提取并不是终点它最终要进入链路仿真。常见链路工具包括SystemSI、ADS、HyperLynx等。衔接时最容易出问题的就是端口映射。举一个真实项目例子我们曾把一块板子上四对差分线的.s8p导入SystemSI做眼图结果收端眼图完全闭合。反复查了一个下午最后发现是Touchstone文件里端口编号顺序和链路工具默认映射不一致工具把差分对A的接收端口用成了差分对B的。后来我们在PowerSI导出前就统一了网络命名并且在链路工具里逐个核对端口映射表问题就杜绝了。衔接时还有一个建议尽量导出包含混合模式S参数的Touchstone 2.0文件让下游工具直接按差分对读入减少单端端口映射出错的概率。如果下游工具只支持1.0那就在转换时同步维护一份端口对照表把每条网络的物理位置、端口编号、正负端关系都写清楚。5. 高频提取常见的坑端口耦合、无源性违例与文件兼容5.1 密集端口区域的人为耦合在BGA焊盘区、连接器引脚这类空间非常紧凑的区域集总端口之间的间距可能小于网格单元尺寸提取结果中会出现人为的强耦合表现为两个本不该有关系的端口之间出现莫名其妙的高串扰。这种耦合不是物理通道真实存在的而是端口激励场型相互交叠产生的伪影。遇到这种情况我的处理手段是把端口位置稍微外移让每一段端口激励都处于相对均匀的传输线场型中或者对端口所在区域单独细化网格降低场型畸变。如果还不行可以在提取时对目标端口做分组只在关注的端口上施加激励其它端口接参考地这样也会减少人为耦合。这里要给个预防性建议在开始布端口之前先在板子上把高密度区域标出来提前规划好端口的放置策略而不是等仿真结果异常了再回头调。尤其对BGA封装的DDR颗粒信号引脚间距只有0.4mm甚至更小端口密度极高这个区域的端口处理直接决定整个提取的成败。5.2 无源性违例和因果性违例改还是不改无源性违例来自于数值误差典型特征是S参数矩阵的最大奇异值在个别频点略超过1。处理方法有两类一是用工具自带的无源性修正算法直接修正数据二是返回去调整网格和端口设置重跑。我的原则是看违例量级几十毫dB级别的微小违例在实际链路仿真中几乎没有影响超过0.1dB甚至更高时不能靠修正掩盖必须回到仿真源头去排查。因果性违例相比之下更隐蔽它表现为时域脉冲响应在激励到达之前就有非零响应这显然不符合物理因果。因果性问题大多不是场求解阶段产生而是在重采样、插值或模型拟合时被引入。避免方法就是前面说过的原始频点要足够密不要让下游工具在谐振峰附近用稀疏频点做插值。在处理这两种违例时我还要强调一个原则不要轻易修改仿真得到的数据。无源性修正、平滑滤波这类操作当时看起来让曲线变干净了但可能掩盖真实谐振信息。除非明确知道自己在做什么否则先用原始数据做链路分析。5.3 文件兼容问题的处理思路最后整理一个处理文件兼容问题的通用清单如果某个工具读不进S参数文件先用文本编辑器看文件头确认Touchstone版本和关键字是否被支持。如果中文路径或文件名包含空格某些老工具解析时也会出问题导出文件统一用英文路径、下划线命名最省心。如果是字节序或BOM问题用Python读一遍并重写通常能解决。这些看起来都是小问题但实际涉及到跨部门、跨工具协同的时候常常能卡住一整天。常备一段十几行的Python脚本用于检查头信息和重写文件属于性价比极高的投资。6. 关于S参数提取我最后想分享的三个工作习惯6.1 建立一份属于自己项目的通道基线表每次提取完关键网络我会把S21在几个特征频点比如基频、3次谐波、5次谐波的数值记录下来连同插入损耗、回波损耗一起整理成一张表。这张表跟着项目走板子每次改版后重新提取直接对比基线表哪个频点变化超过了0.5dB就能立刻定位到是哪段走线、哪个过孔结构变了。这个习惯成本极低就是每次仿真完多花几分钟填几个数字但收益非常高。有一次我们板子改版后DDR4的地址总线时序裕量下降大家怀疑是端接电阻位置变了。我翻出基线表一看确实地址总线S21在1.5GHz附近下降了约0.7dB而时钟总线没变顺着这个线索去查果然是新版的走线绕线方式引入了一段更长的stub。没有基线表这种问题排查起来就是大海捞针。6.2 数据修正要克制留好原始备份我见过有些工程师拿到S参数后第一件事就是做无源性修正、平滑滤波恨不得把曲线修到完美。但过度修正会让数据失真尤其是谐振点的幅度和频率位置一旦被平滑掉后续时域仿真就看不到真实的振铃和反射。我的习惯是原始导出文件永远保留一份任何修正操作都在副本上做文件名里标明处理方式。如果修正前后的结果差异很大那更应该回头检查仿真设置的合理性而不是信任修正后的数据。记住S参数是证据不是可以随意打磨的展示材料。6.3 让每次提取都可复现把S参数当成证据链的一部分来管理。每次提取都记录对应的叠层版本、端口定义截图、仿真频率范围、扫频点数和网格设置让结果可以复现。我见过太多这份S参数是谁跑的、用的什么设置完全说不清楚的尴尬场景一旦下游仿真发现异常连排查的起点都找不到。实际操作中我会在项目目录里保留一个与S参数同名的.txt说明文件里面写清楚提取日期、设计文件版本、叠层参数来源、端口命名规则和关键仿真设置。这个动作不花多少时间但能让整个团队的协作顺畅很多。S参数提取这件事教科书上几页就能写完但真正决定仿真质量的是那些琐碎的前提条件。把模型清得干净、叠层对得上、端口放得合理结果基本就八九不离十了。
返回列表