
做了这么多年模拟电路要说哪个小模块最容易被低估施密特触发器绝对算一个。它不像运放那样需要调带宽调相位裕度也不像LDO那样要算环路稳定性但几乎所有需要抗干扰的接口都离不开它。按键去抖、脉冲整形、电平检测、振荡器、ESD保护后的噪声滤除……设计里随处都能见到它的影子。而想把这个“看起来很简单”的电路调明白第一步往往是跑一下DC仿真把那条迟滞曲线给扫出来。很多刚接触迟滞仿真的人直接拿普通DC扫描去扫结果发现扫出来的曲线根本没有迟滞然后就怀疑自己电路搭错了。其实问题不在电路而在扫描方式。普通DC扫描是静态的它只求每个电压点下的数值解而施密特触发器在中间那段区域存在两个稳态解你扫出来哪个完全取决于求解器的初始条件。这就需要一个能保留电路状态的扫描方式也就是Hysteresis Sweep。这篇文章我就围绕DC仿真、施密特触发器、Hysteresis Sweep、迟滞曲线这几个核心点把我这些年调理这类电路的实际经验系统整理一遍。内容既适合刚接触模拟仿真的人用来入门也适合需要复用别人的IP、做接口输入级设计或者做可靠性检查的工程师作为参考。1. 施密特触发器为什么要做DC仿真1.1 迟滞的本质两个阈值的故事先花点时间把施密特触发器的底子说清楚。以最常见的反相施密特触发器为例它和普通反相器最大的区别在于普通反相器只有一个阈值电压输入跨过阈值输出就翻转而施密特触发器有两个阈值一个是正向阈值Vt输入从低往高走时触发翻转的电压一个是负向阈值Vt-输入从高往低走时触发翻转的电压而且Vt必须大于Vt-。这两个阈值之间的差值Vhys Vt - Vt-就是迟滞宽度。有这迟滞宽度的好处是显而易见的当输入信号上叠加了噪声的时候只要噪声峰值不超过Vhys输出就不会来回抖动。比如一个缓慢上升的传感器信号经过长走线到了接收端往往带了不少毛刺直接进普通逻辑门很容易产生误动作先进施密特触发器整形一下噪声就被吃掉了。这个行为用语言描述很抽象但放到DC仿真里就能看得明明白白在输入-输出坐标系里正向扫描和反向扫描的两条输出曲线会形成一个不重合的环这个环就是迟滞曲线。1.2 不用DC仿真行不行有人可能会说我有测试样片直接拿信号发生器扫一个三角波再用示波器看输出翻转点不也能测出迟滞吗的确实测是最真实的情况但实测有两个问题一是芯片没回来之前你没法测二是即便有样片测试波形里的噪声、探头负载、信号源阻抗都会让翻转点看起来比实际的要宽或者窄影响因素很难剥离开。仿真就不存在这些问题只要模型准确扫描条件完全可控你甚至可以单独看一下正扫和反扫各自受PVT工艺、电压、温度影响的轨迹。所以我的习惯是任何用到施密特触发器的地方不管是自己画管子还是拿标准单元上来的第一件事就是跑一个完整的DC仿真把迟滞曲线拿到手上。这个曲线能告诉你的信息量非常大除了Vt和Vt-这两个基本参数还能看出输出摆幅、翻转速率、正反扫的不对称程度、反馈是否足够强等等。这些信息在后面的系统集成阶段都很关键。2. Hysteresis Sweep双向扫描的思路和原理2.1 普通DC扫描为什么扫不出迟滞先说一个让很多人困惑的现场用Cadence Spectre或者其他EDA工具搭一个施密特触发器输入电压源做DC扫描0V扫到1.8V再扫回0V结果输出的曲线正反两条完全重合一点迟滞的影子都看不到。这时候第一反应往往是“电路是不是没接对”但更可能的原因是扫描方式不对。普通DC扫描是逐点求静态工作点。每个输入电压点仿真器都要解一组非线性方程最终得到一个满足KCL/KVL的稳态解。麻烦的地方在于施密特触发器在Vt-到Vt这个区间内存在不止一个稳态解具体落在哪个解上由求解器的初值决定。如果你没有刻意控制这个初值仿真器几乎不可能给出你期望的那个轨迹。结果就是你看到两条“拧成一股”的线迟滞完全消失。有些情况下还会出现奇怪的跳跃输出在某个电压点突然从高跳到低或者反过来原因就是这个区间内解分支发生了切换而不是电路本身出了毛病。2.2 Hysteresis Sweep的核心思想Hysteresis Sweep按照我的理解本质上不是一种全新的分析类型而是“带状态保持的双向扫描”。它的核心思想是扫描方向和电路的历史状态必须保持一致。具体来说正向扫描时输入应该从一个小于Vt-的值比如0V开始并且在此之前让电路稳定在“输入为低时对应的输出状态”反向扫描时输入应该从一个大于Vt的值比如VDD开始并且在此之前让电路稳定在“输入为高时对应的输出状态”。这句话看起来简单但操作上很容易被忽略。仿真器默认在做每个工作点计算时可能不会关心上一个扫描点是什么状态除非你显式地告诉它保持状态。所以跑Hysteresis Sweep的关键动作有两个一是不要让输入从中间某个值开始扫二是务必要让电路在扫描开始前处于正确的复位/置位分支。用通俗的话讲你扫之前得知道自己该“从哪边进门”。2.3 工具实现上的几种做法不同厂商、不同版本的仿真器对Hysteresis Sweep的支持方式不太一样但思路大差不差。我总结出三种可落地的做法你可以根据手头的环境选第一种是分段DC扫描。把一次完整的扫描拆成两段第一段从0V扫到VDD第二段从VDD扫到0V。两段扫描之间用初始条件或者预置操作把电路状态设置到对应分支。注意第二段不能用第一段的末态直接算那样大概率会把输出定在错误的状态上。正确的方法是在第二段扫描开始前先把输入源拉到VDD之外也就是让输入远大于Vt让输出稳定再开始往下扫。说白了就是每次扫描前都给电路一个“强偏置”。第二种是瞬态慢扫描。用一个PWL电压源也就是一段折线波形施加在输入端先从0V缓慢升到VDD再从VDD缓慢降到0V然后用瞬态仿真跑完整个波形输出就是带迟滞的传输曲线。这种方法最接近实测而且不需要跟仿真器做各种复杂的初始状态设置但代价是慢。扫描速率和电路时间常数之间必须拉开足够大的差距否则电容充放电跟不上输入变化曲线会被“拉歪”。我的经验值是扫描边沿时间至少要比电路主极点对应的时间常数大100倍以上。第三种是用支持双向扫描的DC分析选项。现在不少商用仿真器都内置了类似“return sweep”或者“bidirectional sweep”的功能本质上是替你把分段扫描和状态保持做了。翻一翻仿真手册找到DC分析里的扫描类型设置能省不少事。但这类功能每个工具叫法不同有时候藏在很深的选项里我也见过不少人根本没注意到它。如果身边没有现成工具直接用前两种方式效果也一样。3. 完整实操从电路搭建到迟滞曲线3.1 测试电路搭建先交代一下我常用的测试bench结构。被测对象是一个CMOS反相施密特触发器工艺按0.18微米来算VDD取1.8V。输入端接一个理想电压源vin输出端接一个很小的负载电容cl比如100fF用来模拟真实的栅极负载但不至于影响翻转点的判读。真正决定仿真成败的往往不是电路本身而是扫描前对状态的控制。我的bench里会额外加一个扫描控制电压源或者在仿真脚本里用initial condition把输出节点预置到期望的状态。以正向扫描为例输入vin从0V开始往上扫电路天然就处于“输入低、输出高”的初始状态。麻烦的是反向扫描输入从VDD往下扫之前输出应该已经处于“输入高、输出低”的状态。如果直接从上一次正向扫描的末态继续往下扫通常问题不大但保险起见我会在脚本里先用一个0.5V的瞬态预置阶段让输入稳定在VDD再开始反向扫描。3.2 正向扫描和反向扫描的设置扫描参数怎么设步长是个关键点。步长太粗翻转点定位不准迟滞宽度可能就差出几十毫伏步长太细仿真时间又成倍增加。我一般先用10mV的步长跑一遍找到翻转点的大概范围然后再把步长缩到1mV只在翻转点附近加密扫描。不过要注意有些仿真器在分段扫描里不支持局部加密那就只能统一用1mV步长跑时间虽然长一点但对判断阈值足够了。具体设置上以Spectre风格为例我会写两个DC分析第一个扫描0到1.8V第二个扫描1.8V到0V同时在第二个分析开始之前用一条瞬态语句把输入置到1.8V等输出稳定后再进入DC扫描。如果你用的工具不支持这种写法也可以直接跑一个带PWL源和瞬态分析的方案效果一模一样。扫描的起始和终止边界一定要超过两个阈值尤其要覆盖VDD范围不要让扫描止步于阈值附近否则翻转可能触发不了。3.3 把两条曲线合成迟滞曲线扫描完成之后仿真器输出的是两段输入-输出曲线。把这两段曲线画在同一个坐标系里X轴是vinY轴是vout就是一条完整的迟滞曲线。正向扫描的曲线会从左上输入低、输出高开始在vin接近Vt时急剧下拉变成右下输入高、输出低反向扫描的曲线则会从右下开始在vin接近Vt-时急剧上拉回到左上。两条曲线在中间围出来的区域就是迟滞窗口。这里有一个画图的小技巧在一些波形工具里DC扫描结果的X轴默认是扫描变量你直接对同一段数据画vout versus vin即可。但如果你跑的是瞬态慢扫描那就需要把瞬态的响应曲线再做一次坐标变换才能得到VTC。我习惯把两条曲线设置成不同的颜色正向用蓝色反向用红色这样在汇报的时候一眼就能看出不对称性。3.4 从曲线读出门限参数有了迟滞曲线下一步就是定量地提取Vt和Vt-。最常用的判据是取输出翻转过程中经过VDD/2时所对应的输入电压。在波形计算器里可以用cross函数对正向扫描曲线找vout从1.8V下降到0.9V时对应的vin值那就是Vt对反向扫描曲线找vout从0V上升到0.9V时对应的vin值那就是Vt-。这个50%判据不是说不能改如果你的输出不是满摆幅翻转比如某些低功耗设计输出只翻转到某固定电平那就取输出摆幅的中点。提取出两个阈值之后Vhys Vt - Vt-这个值就是你这次设计的迟滞宽度。实际项目里我通常还要把这个值和设计指标并排放在一起看比如要求Vhys要大于100mV那Vt至少要比Vt-高出100mV而中心点也要和期望的翻转电平对齐。这些都可以直接测量不需要事后做复杂的计算。4. 迟滞曲线怎么看设计指标与工程经验4.1 迟滞宽度和相关设计指标拿到迟滞曲线最直接要评估的就是迟滞宽度Vhys。它有多重要以按键去抖为例机械开关在闭合和断开的瞬间会有很长时间的抖动如果直接用普通逻辑门采样一次按键可能被识别成好几次。用施密特触发器做整形只要抖动幅度小于Vhys输出就保持在一个稳定状态这一下就把去抖问题解决了。但Vhys也不是越大越好。迟滞越宽意味着输入需要在Vt-和Vt之间摆动的范围更大对应到系统层面就是输入端判决的延时会增加触发频率的上限会降低。比如用在振荡器里Vhys直接参与RC充放电的时间常数计算迟滞越宽充电时间就越长振荡频率就越低。所以设计指标的制定是权衡的结果不能一味追求某一项。从曲线上还能读出另一个更隐蔽的指标正反扫描的不对称程度。如果Vt和Vt-相对于期望中心点不对称说明施密特触发器的上拉和下拉路径强度不匹配。这种不匹配可能导致在不同输入边沿速率下翻转行为不一样影响信号完整性。通过迟滞曲线你能一眼看出中心点偏移了多少而不是等系统联调时才莫名其妙地发现逻辑时序不对。4.2 PVT和蒙特卡洛下的迟滞曲线仿真不能只跑一个典型工艺角。我自己吃过大亏的地方就在这里典型tt工艺角、25度、1.8V下Vhys跑出来正好100mV看着完美无缺。结果一跑ss工艺角、85度、1.62VVhys缩到只剩40mV直接不满足接口协议里的噪声容限要求。问题出在哪里施密特触发器的两个阈值本质上是由管子的阈值电压和过驱动电压决定的而阈值电压对工艺角和温度非常敏感。通常情况下Vt和Vt-都会随温度往某个方向漂移但漂移的幅度不一样Vhys等于两者之差自然也跟着飘。所以设计的时候一定要把PVT全跑一遍取最差情况下的一版迟滞曲线来验证指标。更严谨的做法是再叠加上蒙特卡洛仿真。工艺失配会让同一个批次里不同die的施密特触发器阈值相差很大尤其当工艺节点越来越小的时候。跑200到500个点把所有迟滞曲线叠加在一张图上就能看到Vhys的分布范围。我的经验是蒙特卡洛结果里Vhys的3sigma边界也要满足设计指标如果这个边界有触线的风险就得考虑加大迟滞宽度或者调整反馈强度。4.3 曲线形态异常意味着什么迟滞曲线的一般形态大家都见过一个扁平的“Z”型环。但偶尔你会看到一些不太对劲的形态。最常见的是翻转区出现一个比较缓的斜坡而不是急剧的垂直下降。这说明正反馈不够强电路虽然名义上是施密特触发器但实际迟滞效应不明显甚至退化成普通反相器。这种情况下Vhys会很小抗噪能力形同虚设。解决办法是加强正反馈路径的驱动能力比如增大内部反馈管的宽长比。还有一种异常形态是曲线虽然围成环但环的两条边在某个电压点发生交叉形成一个“8”字或者蝴蝶结形状。这种现象往往暗示着电路在DC扫描过程中解分支发生了跳变或者扫描步长太大导致波形失真。先别急着下结论说电路坏了用更小的步长重新扫描一遍如果蝴蝶结消失了那就是数值仿真问题如果小步长下依然存在才需要怀疑电路本身是否有额外的正反馈路径或者内部状态位。5. 常见问题与排查技巧实录5.1 曲线不闭合这是后台留言里问得最多的现象正向扫描和反向扫描的曲线不构成一个完整的闭合环而是在某个点直接断开或者出现大幅度的跳跃。绝大多数情况下原因是扫描开始时电路没有处于正确的状态尤其是反向扫描前没有把电路稳定在“输入高、输出低”的分支。解决方法是在反向扫描之前先把输入信号强制设在VDD并保持一段时间等输出稳定后再开始反向扫描。如果你用的是瞬态慢扫描方案还要检查PWL源的折线是否有突变突变太大会引入额外的瞬态冲击导致曲线形态失真。5.2 正向反向曲线“串台”有时候你在波形图里看到正向扫描和反向扫描的曲线几乎完全重合唯一区别是翻转点位置略有不同但Vhys小得可怜。这种“串台”往往是因为仿真器在做DC扫描时每一个点都从同一个默认初值开始迭代导致解始终落在一个固定的分支上没有真正让电路轨迹沿着迟滞环走。解决办法是在扫描脚本里显式地设置初始条件或者改用瞬态慢扫描。如果工具支持双向扫描选项直接打开效果最好。5.3 仿真结果与实测不符有一种情况是仿真出来的Vhys是好的但回来后实测芯片翻转点完全对不上甚至迟滞方向都是反的。排查的时候先把量测方法排除掉示波器探头的地线过长会引入噪声信号源输出阻抗过高会被输入漏电流拉偏这些都会直接改变你测到的翻转点。排除量测问题之后再回头看模型。有些工艺角模型对施密特触发器的反馈路径建模不够精确尤其是在精细尺寸工艺下局部门锁效应或者衬底偏置会导致实际阈值和仿真差很多。这时候不能光看典型角要专门跑一些失配严重的仿真来预估范围。5.4 迟滞宽度调不动你加大反馈管的尺寸Vhys却几乎不变这种问题也常见。原因往往是你的策略搞反了。施密特触发器的Vhys由正反馈路径的上拉/下拉强度与主路径的驱动强度之间的相对关系决定。只单独增加反馈管尺寸可能同时拉低了阈值中心点导致两个阈值一起漂移Vhys变化不大。正确的调法是把主路径和反馈路径看成一组“跷跷板”通常需要同时调整两处。比如想增大Vhys可以增强反馈管同时稍微减弱主路径的驱动能力才会看到比较明显的效果。另外还要注意在CMOS反相施密特触发器里阈值位置和管子翻转的关系非常紧尺寸调整往往要配合仿真反复迭代几轮。5.5 问题速查表为了方便翻阅我把容易出现的问题整理成一个表现象常见原因排查与解决办法扫描曲线无迟滞DC扫描没有保持状态分支用带初始条件的双向扫描或瞬态慢扫描曲线不闭合/跳跃扫描起点处于错误状态扫描前强制预置输入先拉到VDD或GND稳定曲线呈蝴蝶结状扫描步长过大或解分支跳变缩小步长重跑检查是否有多解分支翻转点偏得离谱负载电容太大或扫描速率过快减小负载电容减慢扫描速率Vhys随工艺角漂移大阈值对PVT敏感全角扫描最差角下预留余量Vhys调不动只改了反馈管影响互相抵消同时调整主路径和反馈路径的驱动强度这张表算是我这些年反复踩坑总结出来的每次给团队做仿真培训时都会拿出来讲一遍。与其让新人对着一个奇怪的曲线发半小时呆不如直接告诉他先查哪几个地方。5.6 一个小技巧慢扫描与DC扫描交叉验证最后再分享一个我比较习惯的做法。拿到Hysteresis Sweep的结果后我会顺手用瞬态慢扫描再验一遍。两个结果放在一起很能说明问题如果两条曲线重合得很好说明DC扫描中的状态控制是可靠的如果差异很大那基本可以断定其中一种方法在设置上有问题。这种交叉验证不花多少时间但能让我在向别人汇报仿真结论的时候更有底气。写完这些我心里其实挺感慨的。施密特触发器在教科书中往往只占一小节真正用起来才发现里面的门道不少。DC仿真这种最基础的仿真手段一旦碰到迟滞电路就不再是“设个扫描范围点个run”那么轻松了。理解Hysteresis Sweep的本质亲手把那条迟滞曲线扫出来才能算真正把这个模块吃透。希望这篇文章能把你在仿真路上踩过的坑填掉一半剩下的一半就靠你在自己的电路上慢慢体会了。