ARTICLE DETAIL

资讯详情

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

使用Custom Waveform精准测量HSPICE仿真延迟与功耗的实战方法

使用Custom Waveform精准测量HSPICE仿真延迟与功耗的实战方法 做模拟IC设计的工程师基本都有这种体验HSPICE仿真跑完波形看起来很正常但一到汇报延迟和功耗数据就容易被追问一句“这个数是用什么方法测的怎么跟预估对不上”我之前就被问过好几次后来仔细排查发现问题经常不在电路本身而在测量手段。同样是测一个反相器链的延迟有的人直接在波形上拉两条游标算时间差有的人用HSPICE的.measure语句自动测量有的人在Custom Waveform里做阈值匹配测量得到的结果可能差出10%甚至更多这在高速数字电路里足以影响时序收敛判断。这篇内容我不打算讲HSPICE基础语法而是把日常用Custom Waveform精准测量延迟与功耗时踩过的坑、验证过的方法和实测数据对比整理出来给你一套可以直接上手的操作思路。适合正在做标准单元特征化、数字模块时序功耗评估或者刚接手HSPICE仿真但总被数据一致性困扰的工程师。1. 为什么同样的仿真波形不同人量出来的延迟和功耗不一样1.1 延迟和功耗看似简单其实测量口径最容易打架先说延迟。CMOS电路的延迟通常定义为输入信号翻转越过阈值到输出信号翻转越过同一阈值的时间差但这里有两个隐藏变量第一阈值究竟取多少是用电源电压的一半还是用工艺库给定的翻转点第二输入信号本身的上升沿或下降沿算不算在延迟里或者说输入端的测量点放在哪里。大多数标准单元库的特征化文档里延迟是拿输入和输出的50%翻转点之间的时间差来定义的但这个“50%”指的是VDD的50%不是某一时刻瞬时电压的50%。如果电源电压是1.8V那阈值就是0.9V。问题在于实际工艺库的翻转阈值可能略低于或高于这个值例如某些工艺在输入上升沿时的实际翻转点是0.85V左右。用0.9V去测量和用0.85V去测量延迟结果可以相差几十皮秒。在GHz级别的设计里几十皮秒可能就是hold time violation的临界问题。功耗的测量口径就更乱了。平均功耗、峰值功耗、翻转功耗、漏电功耗每个说法背后对应的积分区间和电流分量都不同。我曾经在同一份仿真结果上用三种方式去算同一段buffer链的功耗算出来分别是1.1mW、1.64mW和1.87mW差距大得让人怀疑跑的不是同一个电路。后来发现原因很简单第一种只看稳态电流第二种包含了一次翻转周期内的电流第三种把输入边沿变化前后的完整窗口都积进去了。功耗测量最核心的一点就是窗口的选择窗口没定义清楚数字就没有可比性。1.2 Custom Waveform值得当作主力测量工具而不是备用查看器很多人把Custom Waveform只当作看波形的工具打开.tr0文件看一眼输出有没有正常翻转然后关掉。这浪费了它最实用的能力手工测量和公式计算。Custom Waveform里可以针对任意节点添加游标读取精确的时间和电压值可以拉出一段区间直接查看该区间内的平均值、积分值、峰峰值还可以对曲线做数学运算比如把V(vdd)和I(vdd)相乘得到瞬时功率曲线。这些操作对延迟和功耗测量来说都是直接可用的功能。我个人习惯是先用HSPICE的.measure语句跑一轮自动测量再用Custom Waveform做人工复核尤其是当自动测量结果出现跳变、负值、或者与手算预估差异较大的时候。波形文件里往往保留着导致异常的原因比如毛刺、回沟、多周期翻转点这些细节在看数值报告时根本发现不了但在波形图上一眼就能看出来。“先看波形再信数字”这个习惯帮我避掉了不少坑。2. 用Custom Waveform精准测延迟的完整思路2.1 延迟测量的三条铁律阈值、参考点、时间范围在开始打游标之前有几个原则必须先定下来否则后边全白做。第一阈值必须与工艺库特征化条件保持一致。假如你用的是标准单元库查找库里.lib文件中的slew_upper_threshold_pct等参数看它定义的是不是50%。有些库定义的是30%到70%有些是20%到80%这些百分比对应的是信号边沿的上升时间和下降时间而延迟阈值经常就是50%。如果你只是为了对比不同方案之间的快慢那么固定用一个阈值即可但要保证大家的测量条件相同。第二输入信号的参考点要选在真正影响输出的位置。对数字电路来说输入一般接的是前一级的输出或者理想激励源理想激励源通常设定了固定的上升/下降时间。问题在于实际情况下输入信号到达阈值点之后输出不会立刻翻转而是有一个响应时间。如果你把游标放在输入信号刚启动的位置而不是越过阈值的位置就等于把输入信号的前导时间也算进了延迟这会让全部延迟数据整体偏大一个固定值。第三时间范围的选取不能只取一个边沿就下结论。延迟在真实电路里是随PVT变化的在同一仿真的多条周期波形上取多个边沿分别测量再取平均比单独测一个边沿更稳定。特别是振荡器或环形振荡器结构一个周期内的上升延迟和下降延迟往往不相等必须分开记录。2.2 具体操作游标怎么打数据怎么读打开Custom Waveform后加载HSPICE跑出的.tr0文件波形树里能看到所有保存的节点电压和支路电流。要测量从输入到输出的延迟推荐下面的操作顺序先在波形窗口里把输入电压V(in)和输出电压V(out)同时显示出来然后找到第一个上升沿对应的位置用鼠标拖出一个矩形框把输入和输出的翻转区域放大。接着在工具栏里找到游标工具通常是一个十字标或者箭头图标点击后在V(in)曲线上靠近输入信号越过阈值的位置放一个游标再在V(out)曲线上放置第二个游标。读取时间坐标时要注意Custom Waveform默认显示的是绝对仿真时间而延迟需要的是差值。可以先记录第一个游标的时间值t1再记录第二个游标的时间值t2然后计算t2-t1。更快的办法是直接在游标读数窗口里看ΔT那一栏如果工具版本支持的话打开游标信息面板它会自动显示两个游标之间的时间差和电压差。不过光会放游标还不够还有个很实用的技巧开启游标吸附功能。这个选项会让游标自动跳到鼠标附近的波形实际采样点上避免你手抖放偏位置。放好之后还要看波形边沿是否在阈值附近出现了多个采样点如果边沿太陡且采样间隔太大可能很难对准精确的阈值电压这时可以回查.tran的步长设置或者利用波形插值选项把曲线画得平滑一些。平滑显示不会改变原始数据但可以帮助定位阈值点。2.3 实测数据对比同一个buffer链三种测法结果差多少为了更直观地说明问题我拿一个由三级反相器组成的buffer链来做例子VDD1.8V输入上升沿slew设置为100ps负载电容2pF温度25℃工艺角tt。仿真时间2us步长10ps。分别用三种方式测量输入到输出的传播延迟测量方式阈值条件测得的延迟ps与方式B的偏差AHSPICE.measure默认语句从输入10%到输出10%10%-10%68273BCustom Waveform游标VDD/2到VDD/250%-50%6090CCustom Waveform游标按库文件翻转点0.84V测量0.84V实际翻转点595-14从这组数据可以看到方式A因为把输入信号从10%到50%的建立时间也算进去了所以延迟明显偏大。方式B是业界常见的测量方式。方式C用了库文件里更接近真实翻转行为的阈值结果比方式B小14ps。如果你的设计余量很小14ps就足够决定一个路径能不能收敛。这组对比想说明的是数字本身没有对错但你必须清楚自己量的是什么并且在所有对比场景里保持同一口径。3. 功耗测量怎么才靠谱从瞬态波形中抠出真值3.1 三种常见功耗测量方法为什么结果不一致HSPICE里测量功耗最常见的手段是在电源支路上加一个电压源然后对I(VDD)做积分。最常见写法大概是这样的.measure tran total_power INTEG I(VDD)*V(VDD) FROM0 TO2u .measure tran avg_power PARAMtotal_power/2u这条语句本身没问题问题出在FROM和TO的区间选择上。如果区间覆盖了整个仿真时间其中包含了电路上电和初始化的过程那初始阶段的大电流也会被平均进去导致平均功耗偏高如果区间只在稳定状态的某个周期中选了一段又容易把翻转过程中的短路电流功耗漏掉。还有人在波形里直接读I(VDD)的DC值来当功耗这种方法只适合纯静态电路对有开关动作的数字电路来说基本属于错误用法。动态功耗的核心来自负载电容的充放电和翻转瞬间的短路电流这两部分只有在瞬态波形里才看得见。3.2 用Custom Waveform做窗口积分和平均功耗在Custom Waveform里做功耗分析我通常会这样做把V(VDD)和I(VDD)两条曲线都显示出来然后使用表达式编辑器创建一个新曲线P(vdd)V(vdd)*I(vdd)。这个乘积就是瞬时功耗曲线。接着在曲线上选中一个完整工作周期作为积分窗口比如从输入信号第一次上升沿的50%点开始到第二次上升沿的50%点结束。这样选择的好处是一个完整周期里的开关动作都被包括进来不会漏掉任何翻转过程。使用窗口积分工具读出该区间的能量值再除以周期长度得到的平均功耗就是比较准确的动态功耗。这里有一个很容易被忽略的细节功耗曲线可能有非常窄的尖峰宽度只有几十皮秒例如输入翻转瞬间的短路电流峰值。如果你只靠肉眼在功耗曲线上选点取平均值几乎一定会低估功耗。正确做法是使用工具内置的积分功能让它对整个区间做数学积分而不是人工采样。我之前对比过人工取10个点估算平均功耗和用工具积分算出来的结果差距有15%到20%对于功耗优化来说这个误差不可接受。3.3 功耗数据的解读把动态功耗拆开看算出总平均功耗之后还不能直接拿去写报告最好再把它拆成三部分输出负载充放电功耗开关功耗、翻转瞬间的短路功耗穿透电流功耗、静态漏电功耗。在Custom Waveform里可以把输出节点V(out)的电容电流单独观察。负载电容的充放电功耗近似等于CLVDD^2f这是理论公式实际功耗则由波形中V(out)边沿变化时I(VDD)的电流脉冲面积决定。短路功耗则正好发生在输入信号翻转、输出还没有翻转的那段区域此时P管和N管同时导通电流直接从VDD流到GND。在I(VDD)波形上翻转时刻会看到一个很尖的电流脉冲这个脉冲的宽度与输入边沿斜率直接相关输入slew越慢短路电流持续时间越长功耗越大。以我刚测过的buffer链为例用Custom Waveform分别计算一个周期内完整平均功耗、去掉静态点后的动态功耗、以及理论上负载电容充放电功耗的估算值得到了这样的对比测量项数值mW说明完整周期平均功耗1.64包含开关、短路、漏电全部贡献仅稳态区间平均功耗1.02不含翻转动作只含漏电和静态导通由负载电容估算的开关功耗0.58CLVDD^2f忽略寄生电容翻转短路功耗由差值推得0.62总功耗减去稳态功耗再减开关功耗短路功耗占总功耗的比例接近38%这个比例对输入slew较慢的设计来说并不罕见。如果只报稳态功耗等于直接把三分之一以上的功耗给抹掉了后续电源网络设计自然无法准确。用Custom Waveform把功耗曲线展开后这些分量一目了然汇报时也能把数据依据讲清楚。4. testbench与仿真选项对测量结果的影响4.1 输入slew设错了延迟和功耗一起失真很多人在搭建HSPICE testbench时对输入脉冲的上升时间设置比较随意随手填一个1ps或者1ns就开跑。实际上输入slew是延迟和功耗测量里最敏感的参数之一。输入信号翻转变化越慢输出响应相对输入的延迟就越难界定因为输出翻转不是跟随输入即时发生的而是有一个内部的中间状态。我做过一组扫描测试同样一个反相器链输入slew从50ps变到500ps测得的50%到50%传播延迟从605ps增加到了734ps功耗从1.52mW增加到了1.93mW。这不难理解输入slew越慢P管和N管同时导通的时间越长短路电流的脉冲宽度就越大同时输出翻转时刻也越往后推。如果你的设计文档里没有写明输入slew条件那延迟和功耗数据根本无法在不同工程师之间对齐。建议在testbench里用一个参数化变量来定义slew例如设置rise_time100psfall_time100ps并在所有测量结果里标注这个条件。对标准单元特征化流程来说通常会有lib库里的input slew slew一栏一定要确认和你的激励一致否则特征化出来的时序弧完全无法匹配。4.2 .tran步长与精度设置如何干扰波形的可读性还有一个经常遇到的问题是.tran语句的步长设置。有的工程师为了提高速度把最大步长设置成1ns然后看功耗曲线发现波形像一个方波信号尖峰全都没有了。这其实不是电路没有尖峰而是仿真器跳过了那些持续时间很短的电流脉冲细节。对延迟测量来说步长太大会导致阈值穿越点不精确。假设你设置的步长是50ps仿真器在阈值点前后的两个时间点分别是499.95ps和500.05ps那游标吸附到采样点上的误差可能就在50ps量级。这个误差虽然不算大但对于本就要分析几十皮秒时序余量的电路来说足以产生误导。解决方法是分两步跑先大步长跑一遍全仿真快速看整体趋势比如.tran 1n 2u确认功能正常后再缩小步长对关键翻转区间做精细仿真例如.tran 5p 2u。如果因为电路规模太大导致精细仿真太慢可以考虑把测试点放在待测量的局部电路上只对该子电路做精确分析。Custom Waveform对波形数据的读取精度不会超过仿真器保存数据的时间点密度仿真输出本身没有足够细节波形工具再强也救不了数据。5. 实战流程一个buffer电路的延迟功耗联合分析记录5.1 电路与激励设置为了把前面讲的思路串起来我记录一次完整的实测流程。被测电路是三级反相器组成的buffer链每一级反相器的宽长比按逐级放大设计用来驱动2pF的负载电容。电源VDD1.8V输入信号为脉冲波起始电压0V脉冲高电平1.8V周期20ns输入上升时间和下降时间都设置为100ps。HSPICE网表的关键部分大致长这样VDD vdd 0 DC1.8 VIN in 0 PULSE 0 1.8 10n 100p 100p 9.9n 20n X1 in n1 INV W1u L65n X2 n1 n2 INV W2u L65n X3 n2 out INV W4u L65n CL out 0 2p .tran 5p 80n .options post probe .probe v(in) v(out) i(vdd)仿真跑完后生成了.tr0文件然后我在Custom Waveform里做详细测量。这里强调一下.probe语句里把I(VDD)列进去是功耗分析的前提别忘了保存电源支路电流。5.2 波形图上的完整分析过程打开Custom Waveform后我把V(in)、V(out)、I(VDD)三条曲线同时显示出来。从波形上看V(in)在10ns附近有一个上升沿V(out)在稍后位置翻转。按照前面说的测量流程我在V(in)上找0.9V穿越点记录时间为t1在V(out)上找0.9V穿越点记录时间为t2两次记录的时间差就是输入到输出第一个上升沿的传播延迟。实测记录里t110.071nst210.685ns所以上升沿传播延迟为614ps。注意这里的输出是从高电平变到低电平也就是说这个测量得到的实际上是高到低的传播延迟tphl因为反相器链的级数为奇数输出与输入反相。功耗测量方面我在Custom Waveform里创建了表达式V(vdd)*I(vdd)得到瞬时功率曲线P(t)。然后在输入信号一个完整周期20ns范围内做积分得到总能量再除以周期得到平均功耗。记录到的平均功耗是1.64mW。接着我又把窗口缩短到只在输出稳定段得到稳态功耗1.02mW两者相差0.62mW这部分基本对应翻转瞬间的短路电流功耗。5.3 数据记录与验证测量完成后我习惯做一次交叉验证。第一个验证点是延迟数据用HSPICE的.measure语句独立测一遍相同的阈值条件看结果与Custom Waveform读数是否一致。这次的对比结果比较理想.measure给出的高到低传播延迟是610ps与游标读数614ps只差4ps属于数学插值带来的微小误差。第二个验证点是功耗数据如果用理想的CLVDD^2f公式估算开关功耗2pF、1.8V、50MHz频率算出来大约是0.324mW但实际包含寄生电容和短路电流的功耗远不止这个数说明公式只能做粗略估算不能替代仿真结果。第三个验证点是重复性把仿真起始时间从10ns改成20ns整个测量流程再走一遍得到的延迟和功耗结果几乎不变说明测量窗口对数据的依赖很小数据一致性好。6. 常见问题与排查技巧实录6.1 测量负延迟、结果跳变——先检查这些用Custom Waveform测量延迟时偶尔会碰到测量结果为负值或者同一个边沿测两次结果不一样的情况。绝大多数时候不是电路的问题而是游标放错了位置或者波形上有毛刺。负延迟的典型场景是输入和输出的波形在显示上有时间偏移。比如你把两个波形放在同一个坐标轴里但误把输出波形拖到了输入波形的左边看起来输出翻转比输入还早实际是视觉错位。检查办法是关闭自动缩放单独拉一条参考时间线确认两个通道的时间轴完全对齐。结果跳变的另一个原因是毛刺。某些高阻节点在翻转过程中会出现回沟也就是波形先越过阈值又退回再越过一次。游标吸附到的采样点可能落在第一次越过或第二次越过两次读数就会出现明显差异。解决方法是放大波形细节观察回沟的具体位置手动把游标放在真正代表逻辑翻转的边沿处。6.2 功耗测量值为负或异常偏大——多为基准点或积分区间问题瞬时功率表达式V(vdd)I(vdd)出现负值有可能是因为I(VDD)参考方向与电压源的方向定义不一致。HSPICE里电压源电流的正方向默认是从正端流入电源而你的表达式没有做符号校正时乘积会是负的。这种情况把I(VDD)取反即可或者在表达式里写成V(vdd)(-i(vdd))。功耗异常偏大的情况基本可以锁定到积分区间包含了不想要的瞬态过程。例如仿真最开始的上电阶段VDD从0到1.8V的过程中会有很大的充电电流如果不把窗口避开这一段平均功耗会被明显抬高。我一般会把积分起点设在输入信号第一个有效翻转前至少一个周期之后确保电路已经进入稳定的周期工作状态。还要检查单位换算波形工具里默认电压是V电流是A计算出来的功率单位是W显示mW的时候别忘了缩小1000倍。6.3 CWV中使用公式和脚本来批量处理测量如果项目里需要反复测量很多个边沿纯手工打游标效率太低。Custom Waveform支持通过公式分析功能处理整个波形段你可以把计算逻辑保存为模板换一个波形文件后直接套用。一个比较实用的小技巧是对需要测量的信号定义好表达式后直接把表达式结果导出成文本文件再在Excel或者Python里做后处理。这样可以把所有关键边沿的延迟批量算出来避免手工读数引入的偶然误差。我习惯在波形文件处理结束后把所有游标位置和测量值截图存档这样出报告的时候原始依据一应俱全不用回头再跑一遍仿真找数据。在整个操作流程里我也总结过最容易忽略的三件事第一仿真输出步长不能太大否则波形细节丢失第二阈值条件必须在所有测量中保持一致项目团队内部最好统一规定第三功耗测量要区分窗口、区分分量不能拿一个总平均值解释所有问题。想清楚了这些再用Custom Waveform做延迟和功耗分析基本不会被数据打架的问题困扰了。
返回列表