1. 信号完整性问题的代价:样板回来才发现问题就晚了
很多工程师对Altium Designer的使用,长期停留在画原理图、布线、出Gerber这三板斧上。直到某天高速板子打样回来,示波器一测信号,过冲居然拉了快1V,串扰在相邻线上看得一清二楚,才意识到SI仿真不是EDA厂商拿来宣传的噱头,而是一个能提前发现问题的工具。
我最早接触Altium里的信号完整性仿真,就是被一块DDR2的板子逼的。当时跑在200MHz左右,布线密度又大,等长约束做了,但端接完全靠经验。样板回来后,DQS和DQ之间的时序裕量所剩无几,个别颗粒在温度升高时直接报错。那时候才明白,所谓“先打样再调试”的模式,在高速电路里代价太高了——一个版本的PCB从改板、重新打样到再验证,周期是按周算的。
1.1 反射、串扰和振铃,在仿真里到底能看到什么
信号完整性这个名词听着高大上,实际上核心就几件事:反射、串扰、振铃、时序偏移、电磁辐射。在Altium的SI仿真里,最常见的是前四类。
反射是阻抗不连续导致的。信号在传输线上跑,遇到阻抗变化的地方,一部分能量继续前进,一部分反射回来,叠加在原信号上就形成过冲、下冲,严重时变成振铃。反射系数公式很简单,( \Gamma = (Z_L - Z_0)/(Z_L + Z_0) ),但实际中最大的麻烦不是算这个公式,而是你根本不知道关键网络的实际阻抗是多少。
串扰则是相邻走线之间的电磁耦合。一根线上的信号跳变,会通过互容和互感在邻近线上感应出噪声。这个在仿真波形上看得非常直观:安静的那根线上叠了一个跟主动线上波形形状相似的毛刺。Altium的SI工具可以直接输出串扰波形,不需要自己搭模型算耦合系数。
振铃的本质是反射在源端和负载端之间来回反弹。PCB上的走线、过孔、连接器焊盘,每一处都是一个阻抗不连续点。信号在这些点之间来回反射,就会在上升沿附近产生衰减振荡。如果振铃幅度过大,落在逻辑阈值附近,就会造成误触发。
做SI仿真不是说要把这些现象全部变成零——实际上也不可能变成零。我们需要做的是把这些参数控制在器件手册允许的范围内,把过冲压在VIH/VIL极限之外,把串扰噪声控制在噪声容限以内,把时序裕量留够。这就是仿真的目的。
1.2 什么样的板子值得用Altium做SI仿真
不是所有板子都需要SI仿真。我做过的项目里,低速板、纯模拟小信号板、电源板,几乎没有必要花时间折腾信号完整性。判断标准不是频率,而是信号上升沿。
高速信号的本质是上升时间,而不是时钟频率。一个1MHz的方波如果上升沿只有2ns,它的高频分量照样能激励起传输线效应。工程上常用带宽估算公式:带宽 (BW = 0.35 / T_r),其中 (T_r) 是上升时间。再结合传播时延判断,如果走线长度对应的时延大于信号上升时间的六分之一,就值得做端接和SI检查。
举个例子,一块板子上有100MHz的时钟线、一组DDR数据线、若干SPI和I2C,那么值得做SI仿真的就是时钟线和DDR线,SPI、I2C这类低速接口就不必太操心。先把精力花在最容易出问题、出问题后最麻烦的地方,这才是工程思维。
2. 仿真前的摸底:层叠、模型和规则是结果可信度的上限
Altium的SI仿真和其他专业仿真工具一样,遵循GIGO原则——Garbage In, Garbage Out。你输入的数据有多准,输出的结果就有多可信。很多人第一次用SI仿真跑出来的结果波动巨大,根本原因不是工具不行,而是准备阶段的数据一塌糊涂。
我在Altium里做SI仿真前,一定会做三件事:打开层叠管理器核对每一层的物理参数、给关键器件分配IBIS模型、检查信号完整性设计规则。这三件事,任何一件没做好,仿真结果都不值得参考。
2.1 层叠设计:Dk、铜厚、线宽,三个数据缺一不可
层叠管理器里的数据,直接影响传输线阻抗的计算结果。Altium的信号完整性分析需要使用实际的层叠参数来推算出走线阻抗。每个参数出现问题,阻抗计算就会偏离真实值。
首先是介电常数Dk。FR4板材在不同频率下Dk有差异,低频时通常在4.2到4.8之间,频率升高后会下降到4.0左右。普通的FR4在Altium里直接用默认值4.2到4.5通常就够了,但如果是高速板材,比如Megtron 6、RO4003之类,一定要把板材厂商提供的Dk值填进去,而且在高速频点下的Dk值跟静态Dk完全不同。板材商的数据手册里通常会有不同频率下的Dk曲线,要选用接近你信号主要频段的那个值。
其次是铜厚。外层铜厚一般1oz、内层0.5oz或者1oz,这直接影响走线截面面积和阻抗。很多人填层叠的时候不仔细看铜厚单位,Altium里默认是oz,但有的PCB厂提供的叠层表上写的却是um,1oz对应大约35um。这个转换错误会导致阻抗计算偏差几个欧姆,直接让仿真结果失去参考意义。
最后是线宽。Altium里信号完整性分析用的线宽,一部分来自设计规则里设置的宽度约束,一部分来自实际布线后的铜皮宽度。如果你的规则里设置了最小6mil、首选8mil、最大10mil,但实际布线走的是8mil,仿真工具根据规则取的是首选值,这个没问题。但如果某些特殊信号线你单独设了规则,而仿真时选择的网络又不在这个规则范围里,计算结果自然就错了。
提示:每次打开SI面板之前,先在层叠管理器里把每一层的“介电材料”、“厚度”、“铜厚”都核对一遍,再点击“阻抗计算”看每层的主要阻抗值是否合理,确认无误后再进入仿真。这个习惯能帮你省掉大量排查结果异常的时间。
2.2 IBIS模型从哪里来,怎么挂到Altium里
SI仿真需要有源器件的电气行为模型。Altium支持多种模型格式,最常用的是IBIS(Input/Output Buffer Information Specification)。IBIS模型不包含电路内部的具体晶体管结构,只描述输入输出端的电压-电流特性和开关行为,所以仿真速度快,也保护了芯片厂商的知识产权。
IBIS模型去哪找?主流的FPGA厂商(Altera/Intel、Xilinx/AMD)、MCU厂商(TI、NXP、ST、Microchip)官网上都有专门的模型下载页面。下载的时候要注意选择与封装和电压等级匹配的版本,比如同一个芯片在3.3V和1.8V下的IBIS模型可能不同,选错模型的后果就是仿出来的波形跟实测对不上。
拿到IBIS模型之后,要在Altium里给相应的元件分配。操作路径是:原理图或PCB中选择目标器件,打开属性面板,找到“Signal Integrity”或者“IBIS模型”相关的选项,选择对应的模型文件。如果多个器件使用同一个模型,可以一次批量选中再统一指定。
还有一种情况,核心器件的模型厂商没有提供,或者根本找不到。这时候Altium里也能通过器件手册里给出的输出阻抗、上升时间等参数手动创建简化模型。但说实话,手建模型的精度有限,只能用于定性看趋势,不能用来精确判断时序裕量。我的做法是,手建模型只做前期评估,一旦拿到官方IBIS模型,就立刻替换重跑。
2.3 信号完整性规则:别以为只有DRC才需要规则
Altium的SI仿真和设计规则是联动的。在“设计→规则”里有一整类“Signal Integrity”规则,包含了信号脉冲沿、过冲、下冲、飞行时间、建立时间、保持时间等参数。这些参数一方面用来做设计规则检查DRC,另一方面也是SI仿真时判断结果是否合规的基准。
我建议在跑仿真之前,就把关键信号的约束规则填好。比如DDR3地址线,上升沿最大时间、过冲最大阈值、飞行时间上限,都提前写好。仿完之后直接调用分析结果里的合规检查,就能一目了然地看到哪些网络超出约束,哪些网络虽然没超但裕量已经很小。
这一步做与不做的差别在于,不做的话你拿到波形后还要自己对着数据手册一条条比对,费时费力;做了的话仿真结束直接看报告,效率高得多。而且规则里填好的这些数值,后续在布线时也能作为约束条件参与交互布线,算是为整个设计流程加分。
3. 一步步跑通Altium里的SI仿真流程
准备工作做完,可以正式进入仿真环节了。Altium里的SI仿真入口在菜单栏“工具→信号完整性”,整个操作流程实际上不复杂,步骤也不多。
3.1 从PCB切换到SI模式,先检查网络状态
打开信号完整性面板时,Altium会先对PCB做一次扫描,列出所有网络的状态。这一步实际上是导入SI仿真所需的网表和参数。如果PCB比较大,网络数量多,扫描需要一点时间,不用着急。
扫描完成后面板里会出现三个窗口:左边是网络列表,中间是器件-模型分配状态,右边是状态汇总。这时候要做的第一件事不是赶紧跑仿真,而是先看状态汇总里有没有红色错误项。
常见的红色错误有两类:一类是器件没有模型。对于电阻、电容、电感这些无源器件,Altium会自动从元件库里提取封装和数值信息来建模模型;但对于IC,如果没有指定IBIS模型,就会显示“No Model”。这时候就要回到第2.2节的操作,把模型补上。另一类是网络没有参考平面,比如网络跨越了电源层分裂区域,这种情况在混合信号板里特别常见,需要回到PCB里处理平面分割。
状态检查没有红色错误后,选中目标网络。如果是总线,可以多选。Altium支持同时选中多个网络一起仿真,方便对比。选好之后,点击“分析”按钮,会弹出信号完整性仿真配置对话框。
3.2 配置激励源和终端方式
Altium的SI仿真里,激励源决定了注入到网络上的测试信号。默认情况下是一个上升沿触发的阶跃信号,参数包括高电平电压、低电平电压、上升时间、周期等。这些参数要尽量贴近实际驱动芯片的输出特性。
举个例子,一个3.3V的LVCMOS接口,高电平就填3.3V,低电平0V,上升时间填器件手册里给出的最大值或者典型值。如果手册里没写,可以参考同类工艺器件的通用值,比如标准LVCMOS通常是1ns到3ns。上升时间设置得越短,对传输线的考验越严酷,仿真出来的过冲也会更明显。所以不要刻意填一个很慢的上升沿来“粉饰”结果,那就失去仿真的意义了。
终端方式也在这个窗口里配置。Altium提供几种常见端接拓扑:串联电阻端接、并联到地端接、上拉到电源端接、戴维南端接、AC端接。这里先不用纠结哪个最好,按你设计意图来选。如果你只是想看裸传输线的反射情况,可以直接选None,先得到一个最原始的波形,然后再尝试不同端接方式对比效果。
提示:做端接方案对比时,我会把仿真配置里面的“扫描”功能用起来。填写一个端接电阻的起始值、终止值和步长,Altium会自动跑出一系列的波形来。这个方式非常适合用来确定串联匹配电阻到底选22欧还是33欧。
3.3 跑一个反射仿真,把波形里的过冲和时延读出来
配置完成后点击运行,Altium会进入波形视图,输出网络驱动端和接收端的电压波形。一个新手的常见困惑是不知道看哪个窗口、哪个波形。
其实重点看两点。第一是接收端的波形:上升沿到高电平之后有没有明显超过高电平的尖峰,也就是过冲;降到低电平之后有没有冲到地以下的下冲。过冲如果超过接收芯片的绝对最大额定值,哪怕只持续几纳秒,也可能造成芯片内部闩锁效应或者长期可靠性问题。
第二是时延:从驱动端波形开始上升,到接收端波形跨越接收阈值(通常取VCC/2),这个时间差就是信号在该传输线上的飞行时间。飞行时间加上器件自身的建立时间、保持时间,就可以核算整个链路的时序裕量。
Altium的波形窗口中可以直接拉标尺测量任意两个点之间的差,也可以让工具自动标出过冲峰值。波形里还能看到振铃——接收端信号在达到稳定电平之前来回摆动的现象。振铃幅度大、持续久,说明阻抗不连续点多,有必要从布线层面优化,而不是单纯靠端接去压。
4. 仿真结果有没有说服力:关键参数校准与误差来源
我在跑完第一版仿真、拿到一份“看起来挺漂亮”的波形时,心里其实留着个底——仿真只能提供“相对准确”的结果。相对谁?相对同等条件下不同方案的对比。Altium的SI引擎定位是快速评估工具,不是全波电磁场求解器,因此它的精度天然有上限。
但这不意味着仿真没用。关键是你得知道哪些参数是可信的,哪些参数看看就行,千万不能把仿真数字直接拿去跟数据手册里最严格的要求硬碰硬。
4.1 阻抗估算与实际板材偏差
Altium里计算走线阻抗用的是2D场求解器,比经典公式准,但和真实PCB依然有差距。差距主要来自三方面:一是板材Dk的实际值和标称值不完全一致,同一个批次不同位置的板材也可能有波动;二是阻焊层对微带走线阻抗的影响,高频下尤其明显,而Altium的默认计算模型中阻焊层的影响往往是简化的;三是玻纤布编织结构引起的Dk各向异性,这种差异在10GHz以上会变得非常明显。
所以做高速板时,我会把板厂给出的阻抗控制目标作为基准,再在Altium里把线宽线距设置成能满足这个目标的值。仿真结果里看到的阻抗是一个参考,而不是拍板依据。到最后发板前,还会让板厂做阻抗条测试,实测数据返回后反过来校核仿真模型,这样以后再仿同类板材时,准确度会明显提升。
4.2 串扰仿真里的奇偶模和间距敏感性
跑串扰仿真时,Altium会把主动网络和受害网络作为一对来仿真。如果你是第一次操作,会发现问题不如想象中直观——相同间距下,有的夹角处的串扰大,有的方向串扰小,因为走线之间的耦合既有电场耦合也有磁场耦合,二者叠加结果跟信号的模式有关。
两条平行线如果同时朝相反方向跳变,称为奇模模式,它产生的串扰和同时同向跳变的偶模模式不一样。Altium的串扰分析工具里虽然没有把这种模式分析像专业场求解器那样展开,但你可以在配置信号极性时观察不同设置下的结果差异。
从工程经验上讲,解决串扰最有效的手段不是靠仿真一次次试,而是靠规则。小于3倍线宽的间距在大多数低频数字电路里风险不大,但到了高速信号之间,尽量拉开到4W以上,或者在关键信号两侧布地线做隔离。仿真在这里的作用是验证,不是探索。
4.3 Altium SI仿真的精度边界:什么时候当参考,什么时候交给专业工具
Altium的SI仿真引擎长于反射和基本串扰评估,对过孔、连接器、封装等三维结构的建模能力就比较弱。在设计中如果有大量的BGA过孔、板对板连接器,或者涉及差分对之间的高速串行链路,我通常不会继续在Altium里死磕,而是把PCB导出去,用专业的信号完整性分析工具如HyperLynx、Cadence Sigrity这一级别的工具来深入验证。
这就像做结构分析,用手算公式快速估算梁的受力没问题,但遇到复杂节点还得上有限元。工具分工不一样,没必要互相替代。
另外,如果项目里只有一两对高速差分走线,整体速率也没超过1Gbps,Altium的快速SI评估已经足够帮助你判断端接方案是否需要改动。这条边界值是我在实践中逐渐摸索出来的,当然也取决于整板的噪声裕量设计是否宽松。
5. 我在仿真中踩过的坑,以及对应处理
5.1 元件没有模型,SI面板输出一片红色标记
我第一次完整跑SI仿真的时候,选好网络准备分析,结果面板里一片红色。仔细看,几乎所有IC都提示“No Model”。当时第一反应是软件坏了,后来才搞明白是模型没有关联上。
Altium本身自带的库里只有少量常用74系列逻辑芯片的简化模型,对于真实项目里的MCU、FPGA、DDR颗粒,都必须手动关联IBIS模型。优先级最高的操作是先看型号是否在官网有官方模型,其次看是否能在同系列中找到兼容模型,最后才考虑手建,顺序不要颠倒。
顺便提醒一下,有些封装相同、功能相近的芯片,IBIS模型可能不能直接互换,因为引脚内部的开漏输出、上拉电阻、ESD结构可能完全不同。这些差异在高阻态仿真时会显现出来,所以尽量找精确型号。
5.2 差分信号网络怎么处理才不会走弯路
Altium的SI仿真接口中,差分对的处理比单端网络麻烦不少。软件支持差分对分析,但在配置时需要先将差分对定义好,并且确保两个网络在组件模型上正确对应。一个容易踩的坑是:差分对的两条线被分配了不同的模型或者不同的激励,出来的波形完全错乱,差分信号变成了两个独立的单端信号在跑。
解决方式是在PCB面板里先检查差分对设置,“设计→类”里看看差分对是否成组。然后进入SI仿真时,把差分对作为一个整体网络选择,不要分别选择P和N网络。在仿真配置里确认激励源的极性设置是一正一负,这样才能正确看到差分电压波形。
5.3 仿真收敛性差、波形毛刺多,先查这几处
有时候仿真跑完了,但波形看起来乱七八糟,上升沿附近满是高频毛刺,完全没法用。这时不要急着怀疑工具,大概率是你设置的参数有问题。
查三处。第一处是激励源的上升时间设置得过短,比如填了0.1ns。上升沿简单看可以从时钟信号的三次谐波估算,没必要追求极端的陡峭边沿,信号源本身的驱动能力也不可能做到。上升时间填得太短,会激发出大量根本不存在的反射。第二处是查看模型的引脚封装寄生参数是否合理,某些默认模型的引脚电感和电容值可能明显偏离实际封装,导致仿真中引入过度振铃。第三处是网络长度和拓扑检查,如果Altium识别出来的走线长度明显偏长,可能是网络跨了很长的过孔或者绕线,这时需要重新检查布线,而不是在仿真参数上调来调去。
6. 几条值得记住的实战心得
6.1 仿真不是终点,关键信号要预留端接料位
我遇到过一种情况,仿真结果很好,波形漂亮,但样机出来后环境温度一变,时序裕量就崩了。原因是仿真用的是理想条件和典型参数,而实际芯片在温度、电压变化时输出驱动能力会有波动。
所以我的习惯是:仿真确定端接方案后,在PCB上不单贴一个固定阻值的端接电阻,而是采用“0欧或串阻预留”的方式。比如串联匹配电阻,画封装时预留两个并联焊盘位,一个位置放匹配电阻,另一个位置留空或者放一个备用电阻。这样如果样板实测发现过冲严重,可以方便地调整阻值而不需要重新改板。
这算是SI仿真最有价值的产出之一——不是它帮你算出了“最优解”,而是帮你把风险控制在了可调整的范围内。
6.2 把SI规则写进DRC,比单次仿真更实用
仿真是一次性的动作,规则是持续起作用的。我会建议你在Altium里把信号的完整性的关键约束写进设计规则,比如最大过冲百分比、最大飞行时间、网络阻抗范围。把规则写好之后,后续每走一根线,DRC都在实时帮你检查。
从这个角度看,Altium的SI仿真不只是分析工具,它同时也是规则生成器。你可以先仿真几个关键网络,根据仿真结果反推出合理的约束值,把这些值固化进设计规则,再把这些规则应用到整个设计流程中去。这是一种比“跑一次仿真看一次结果”更高效、更工程化的用法。
我个人的实际操作习惯是:每块高速板子至少跑两次SI仿真,第一次在布局布线中期,目的是快速发现重灾区网络并调整拓扑;第二次在布线完成之后,用最终版PCB跑一遍全网络扫描,输出一份完整报告留存归档。两次仿真之间的变化,就是整块板子在信号质量方面的改进记录。
Altium Designer里的SI仿真功能,门槛没有想象中那么高,上限也没有那么低。把它用在合适的地方,理解了它的能力和局限,它就能成为你高速设计流程中一个高效的助手。