ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

HSPICE精准测量延迟与功耗:Custom Waveform与.measure实战

HSPICE精准测量延迟与功耗:Custom Waveform与.measure实战 做过模拟或者数模混合仿真的工程师应该都有过这样一幕HSPICE跑完tran打开波形窗口拿光标卡一下输入和输出的交叉点估一个延迟再瞄一眼电源电流的波形心里默默折算一个功耗。这个流程快是快但真到了提交报告、对比工艺角、评估版图前后仿真差异的时候就很容易被问住——你的延迟是用什么阈值测的为什么同一个波形两次量出来的结果不一样平均功耗的积分窗口到底取了多长时间如果这些问题回答不上来那测出来的数字只能算“参考”离“可信”还差得远。这篇文章我用自己的实测数据把这些坑挨个踩了一遍讲讲如何用HSPICE自带的Custom Waveform以及配合.measure语句把电路延迟和功耗测准。内容不是那种照着手册念的操作说明而是从误差根源讲起把网表怎么写、阈值怎么定、窗口怎么取、数据怎么复核全部串起来。适合刚接触HSPICE仿真、或者长期靠肉眼读波形但想提升数据可信度的设计验证工程师读完至少能让你的测量结果具备可复现性。先把“测不准”的根源说清楚。1. 延迟与功耗测量误差究竟出在哪1.1 手工光标测量为什么经不起推敲我先说一个自己的实测例子。同一轮仿真同一个输出信号对我用波形窗口里的两个光标去卡输入、输出分别到达50% VDD的时刻。第一次没怎么放大波形读出来tPLH是157.6ps把波形放大之后重新卡变成了153.2ps换同事来量他习惯把阈值线拖到自己认为的翻转点结果又变了一个数。光是人手和人眼这一步误差就能到3%~5%。这个误差的来源很直接。波形窗口里的光标本质上就是你在屏幕上选中的两个采样点之间做线性插值放大不够时工具只显示有限数量的数据点插值得到的时间戳本身就是近似。放大之后视觉上更精确了但很多人是“看到哪算哪”并没有让光标强制对齐到某个电平阈值。阈值线不一致更是会让不同人测出的传播延迟差出几十飞秒。后来我在网表里写了.MEASURE TRAN语句一次性得到一个精确到仿真步长之内、完全可复现的数字。那个数字和Custom Waveform里用固定阈值线测出来的几乎一致而手工光标始终在“漂”。Custom Waveform能做到精确是因为它内部会做逐点扫描加插值求解计算阈值交点的精确时间而不是靠人的眼睛去猜。1.2 功耗测量平均不是“取个中值”那么简单功耗比延迟更容易测错。很多人看I(VDD)的波形说“电流峰值有2.3mA那功耗就是2.3mA乘以1.2V等于2.76mW”这是把瞬时峰值当成了功耗。如果用来评估电池寿命或散热应该看的是平均功耗对瞬时功率P(t) VDD * I(t)在目标时间窗口内求积分再除以窗口长度。而峰值功耗又是一个独立指标它和短路电流尖峰、仿真输出步长的关系非常大步长不够密峰值功耗会被严重低估。这三种概念必须分开平均功耗、峰值功耗、能量。平均功耗用于热设计和电源预算峰值功耗用于评估IR drop和电源噪声能量用于衡量单次开关事件的成本。Custom Waveform里要做的无非三件事构造瞬时功率表达式、选定时间窗口、用Average/Max/Integral做统计。操作不难难的是明白为什么要这样算以及在什么条件下得到的结果可信。从网表设置开始把这些问题一个一个串起来。2. 网表准备与仿真设置测量精度从这里定死2.1 激励源、负载与瞬态仿真参数要测延迟和功耗先得有一个干净的测试环境。这里用一个三级反相器链作为例子电源电压1.2V输入方波周期80ns上升沿和下降沿都设为100ps输出挂50fF负载电容。网表骨架如下实际使用时替换成自己的模型库和管子尺寸即可。* delay_power_testbench.sp .param vdd1.2 .option post2 probe0 VDD vdd 0 dc vdd VIN in 0 pulse(0 vdd 5n 100p 100p 40n 80n) X1 in n1 inv X2 n1 n2 inv X3 n2 out inv CL out 0 50f .tran 1p 200n .end注意输入激励的上升沿和下降沿设置。如果输入信号本身的斜率比被测电路的延迟还慢那测出来的“传播延迟”里就混入了输入斜率的影响数据会偏高。所以做延迟仿真时输入沿要设得比预期延迟短一个量级比如这里100ps的沿对应期望几十到一百多ps的延迟才有意义。.tran 1p 200n的意思是仿真步长1ps总时长200ns。1ps的输出步长意味着上升沿100ps里有100个采样点插值误差可以压到亚ps级别对延迟精度来说非常充裕。但代价是数据量大200ns的仿真会产生20万个点波形文件会比较大。如果电路规模大、仿真时间太长可以适当放宽一个经验法则是仿真步长至少小于最小上升/下降时间的1/50最好到1/100这是精度和数据量之间的折中。2.2 节点命名、电源探针与结果输出网表里有一个容易被忽略的细节节点命名。HSPICE里用纯数字做节点名比如1、2很容易和内部节点混淆而且Custom Waveform里看起来很不直观。建议用有实际含义的字符串比如in、out、n1、n2一目了然。再一个关键点要测功耗必须在电源路径上放一个独立的理想电压源VDD这样才能用I(VDD)取电流探针。很多人做版图后仿真时喜欢把电源网络当成理想节点直接连最后发现功耗测不了还得回头改网表。这个准备工作做在前面能省很多事。此外.option post2必须打开这样才能输出二进制结果文件Custom Waveform加载才快。如果忘了写默认输出格式可能非常古老且混乱后续测量全是空谈。还有一个小建议在做正式测量前先把波形整体扫一遍确认电路进入了稳态。比如这个例子中200ns的仿真窗口对应两个半周期左右如果前面几个周期波形不重合说明还有上电瞬态测量窗口要往后挪。3. 用Custom Waveform精准测量延迟完整操作与实测对比3.1 先明确延迟的定义阈值、起点、终点测延迟之前必须把定义敲死。传播延迟tPLH和tPHL指的是输入信号到达某一阈值电平的时刻到输出信号到达同一阈值电平的时刻之差。在数字电路里最常用的阈值是50% VDD而在模拟电路里也可能用实际翻转点。这里我们统一用50% VDD也就是0.6V。上升时间和下降时间则是另一个概念通常用10%到90%或者20%到80%。很多人会把传播延迟和上升/下降时间搞混测传播延迟时用了10%和90%的阈值线那测出来的就不是传播延迟而是从输入起点到输出终点的总行程数值会偏大。这个混淆是评审报告时最容易被抓的漏洞先把定义理清。3.2 Custom Waveform测量操作步骤在HSPICE仿真完成后打开Custom WaveView老版本里叫CosmosScope菜单位置略有差异但逻辑一样。加载结果文件把in、out、I(VDD)这些信号拖进波形窗口。接下来按这个顺序操作在波形上右键打开属性面板把电压阈值设为vdd*0.5也就是0.6V。这一步是保证测量可复现的关键不设固定阈值后面所有测量都是空中楼阁。打开Measurement工具栏选择Delay测量类型。源信号选in目标信号选out沿类型分别选上升沿到上升沿对应tPLH和下降沿到下降沿对应tPHL。执行测量结果会落在Measurement Table里可以一并导出CSV。这个流程里最容易出问题的是阈值设置。很多版本默认阈值是0如果你不手动改成0.6V工具会在信号穿越0V的时刻做判定测出来完全不是你要的东西。另外Measurement Table里每一行测量都会记录具体的源信号、目标信号、阈值和结果这些信息导出后可以直接贴到报告里答辩时非常有说服力。3.3 实测数据对比光标、Custom Waveform与.measure为了说明问题我在同一轮仿真结果上分别用三种方式测量传播延迟数据如下表。测量方式tPLH (ps)tPHL (ps)可重复性手工光标未放大157.6175.1差随缩放和操作者变化手工光标放大后153.2170.9一般仍然依赖手感Custom Waveform50%阈值151.34168.52好同数据多次测量结果一致.measure语句151.28168.47好完全可复现差异很直观。手工光标的两次读数差了4ps以上而Custom Waveform和.measure之间的差距只有0.06ps完全可以忽略属于插值算法的时间戳精度差异。这里真正想强调的是不管用什么工具输出数据的密度决定了测量上限。如果把.tran的步长从1ps改成10psCustom Waveform的测量结果也会开始漂因为底层数据稀疏后任何插值算法都补不出真实波形。4. 功耗测量的正确姿势平均功耗、峰值功耗与能量4.1 三种功耗分别解决什么问题功耗不是一个单一指标。平均功耗用于评估芯片长时间工作的发热量单位是瓦特W或者微瓦uW峰值功耗是瞬时功率的最大值用于评估电源供电能力和IR drop风险能量是瞬时功率对时间的积分单位是焦耳pJ或fJ衡量完成一次开关事件真正消耗了多少能量。三者的数学关系是能量E ∫P(t)dt平均功率P_avg E / T。如果只看单个周期内的能耗直接用能量更有意义。这里有个常见误区有人用电压平均值乘以电流平均值来算平均功耗这在交流信号下是错的。因为瞬时功率是V(t)和I(t)的乘积乘积再求平均不等于各自平均后再相乘。开关电路里电压相对恒定而电流是尖峰状两种算法能差出不少。正确做法就是构造瞬时功率波形再做时间积分。4.2 在Custom Waveform里构造瞬时功率表达式在Custom Waveform的表达式计算器里输入v(vdd) * (-i(vdd))就会得到一条瞬时功率随时间变化的曲线。这里的关键是电流方向。HSPICE里独立电压源的电流正方向定义不同版本可能有差异如果表达式算出来是负值说明方向定义反了把-i(vdd)改成i(vdd)就行。我自己的习惯是先试一次看功率曲线是否在开关沿附近出现合理的正峰值再决定方向。添加表达式波形之后还有一步重要操作选定时间窗口。测平均功耗时一般取稳态后的整数个周期避免把初始上电的瞬态过程也积进去。以这个三级反相器链为例输入周期80ns仿真200ns我取20ns到180ns作为积分窗口正好两个完整周期。窗口选好之后用Measurement工具栏的Average、Max、Integral三种统计方式就能分别拿到平均功耗、峰值功耗和能量。为了做交叉验证我同时在网表里写了一段.measure语句.MEAS TRAN avg_pwr AVG v(vdd)*(-i(vdd)) FROM20n TO180n .MEAS TRAN peak_pwr MAX v(vdd)*(-i(vdd)) FROM20n TO180n .MEAS TRAN energy INTEG v(vdd)*(-i(vdd)) FROM20n TO180n这样Custom Waveform和网表.measure各测一遍如果两组结果对不上就能立刻发现表达式窗口或者方向设置有问题。4.3 实测数据对比不同方法下的功耗结果同一轮仿真我用三种方式统计功耗数据如下。测量方式平均功耗 (uW)峰值功耗 (mW)能量 (pJ)看电流波形“毛估”约3.2约2.0无法量化Custom Waveform 表达式3.4712.3860.555.measure语句3.4682.3910.554手工毛估的问题一目了然峰值功耗只看电流波形最高点但不知道那一点对应的准确电压相位数值完全靠猜能量更是没法算因为人眼没法对曲线做积分。Custom Waveform和.measure的结果几乎一致说明表达式构造和窗口选择都正确。这里还有一个非常重要的实测结论峰值功耗对仿真步长极其敏感。我把.tran的步长从1ps放宽到10ps后平均功耗变化不到1%但峰值功耗从2.386mW掉到了1.79mW。原因是开关电流尖峰非常窄步长不够密时采样点恰好错过尖峰的最高点。所以如果你的报告里要写峰值功耗务必先确认步长足够细否则数据没有可比性。5. 常见翻车场景与排查技巧实录5.1 瞬态仿真不收敛延迟和功耗全是假的做HSPICE仿真久了一定会遇到“Transient analysis failed to converge”或者波形发散的情况。这种情况下测出的任何延迟和功耗数字都没有意义先解决收敛问题再说。常见的几个检查点电路初始化状态对不对.ic语句是否和真实工作点一致电源上升时间是不是设成了0导致上电瞬间电流冲击过大仿真步长上限是否太大让仿真器跳过了关键瞬态。如果确实是数值问题可以通过.option调整收敛参数。比如reltol默认1e-3对精度要求高时可以设成1e-4abstol和vntol分别控制电流和电压的绝对精度gmin从默认值调整到1e-12甚至更小能改善某些高阻节点的收敛性。积分方法也可以试trapezoidal方法速度快但容易在硬开关处产生数值振荡gear方法更稳但可能有数值阻尼。这些参数的实际效果和电路强相关没有万能配置只能对比不同设置下的波形来判断。5.2 测量结果“看起来不对”的排查清单如果Custom Waveform测出来的数字明显偏离预期先不要怀疑工具大概率是设置问题。我整理了一份排查清单按频率从高到低排列电流方向反了表达式算出来是负功耗赶紧确认i(vdd)的方向。节点名拼写错误测出来是恒定0V或者不相关的信号Custom Waveform里还很难发现。阈值设置错误明明要用0.6V却误设成了0.5V或者默认的0V。测量窗口包含了上电瞬态前几个周期波形不重合说明还没进入稳态窗口需要往后挪。输出数据密度不足底层的.tran步长太稀疏任何测量工具都无能为力。这些坑我基本都踩过其中最隐蔽的是阈值设置。因为Custom Waveform允许每个信号独立设置阈值如果你给in设了0.6V给out误设成0.5V工具不会报错测出来的延迟却完全不正确。每次改完设置都要回到Measurement Table里核对该行测量的阈值字段。5.3 批量提取与数据导出技巧如果只是测一组数据Custom Waveform手工操作完全够用。但要做工艺角扫描、电源电压扫描或者对比多个版图方案时手工点选效率太低这时候应该在网表里用.measure配合.alter自动提取。HSPICE会把每次仿真的.measure结果写入.mt0文件一个文件汇总所有数据后续处理非常方便。Custom Waveform的Measurement Table也支持把结果导出为CSV适合做少量数据的整理。我的建议是重要结果一定双保险网表.measure先算一遍Custom Waveform再复核一遍两组偏差超过1%就要回头查设置了。这个习惯看起来多花几分钟实际上比事后发现数据问题去返工要快得多。最后说一点个人体会。凡是进报告的数据我一定在网表里写.measure同时用Custom Waveform在波形上复核一遍。以前我图省事只在波形上手工卡几个点结果有一次把输入阈值0.6V和输出阈值0.6V的时序关系搞反差点把一个错误延迟填进设计文档。后来不管多忙我都会在仿真完成后先打开波形扫一眼整体趋势确认没有不收敛、没有电源电流方向反了再开始批量提取数据。这个习惯帮我挡掉了很多低级错误也建议你们试试。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进