模拟IC工程师都不知道的Cross高级玩法

电子说

1.3w人已加入

描述

Cross 函数经常被用来处理仿真波形,从而获得波形通过某个特定阈值时对应的x轴数值。

仿真器

在Number of occurrences”限定为“single”的情况下,通过变换“Edge Number”,能得到何种功效呢?

Edge Number的含义

“Edge Number”你填写过什么值呢?它的含义是什么呢?

简单而言,“Edge Number”指定cross函数将返回第几个信号沿通过给定阈值时对应的x轴数值。当这个参数为正数时, 从左往右数 ;当参数为负数时, 从右往左数 。例子如下图所示:

仿真器

理论看完了,大家可以想想“Edge Number”为啥会如此设置,有哪些具体应用实例呢?尤其还能写“负数”的“Edge Number”。

例子****1:POR的释放时间

普通青年知道的。。。

POR(Power On Reset)作为一个常用的模拟模块,用来检测电源上电的情况。在上电过程中,当电源电压小于给定阈值时,POR输出高电平。当电源电压高于给定阈值时,POR输出低电平。

当POR的输出没有毛刺(Glitch)的时候(如下图所示),可以通过获取第一个下降沿的时间来获得POR的释放时间。对应的cross函数为:

cross(VT(“/POR”), 0.5, 1,“falling”, nil, nil, nil)

仿真器

资深工程师所考虑的。。。

但是当POR的输出有毛刺时,特别是毛刺的个数不确定时(受到工艺,电压或者温度的影响),那么通过使用负值的“Edge Number”参数来获取最后一个下降沿,则是一个很好的方法。

仿真器

cross(VT(“/POR”), 0.5, -1 ,“falling”, nil, nil, nil)

例子2: 闭环负反馈系统的相位裕度

普通青年知道的。。。

对于一个闭环负反馈系统,一个重要指标就是系统的稳定性。这个指标通常是通过“相位裕度”来衡量的。

相位裕度的计算是,当环路增益为1(0dB)时,对应的相移和180度之间的差值。大多数仿真工具中,默认计算相位裕度的方法为(例如:调用“phase Margin”函数):

如在下图所示的开环频响波形中:

仿真器

首先获得单位增益频率,UGF, (Unit Gain Frequency)

UGF = cross(Gain, 0, 1 ,“falling”, nil, nil, nil)

此后计算相位裕度

PM = 180 – (Phase(0) –Phase(UFG))

其中Phase(x)是给定频率下,对应的相移。

这里需要注意的是,在获取UGF时,是通过cross函数选则增益曲线中从左往右的第一个过零点。

资深工程师所考虑的。。。

下面考虑这样一种情况(简化起见,相位曲线没有做出针对性调整)

仿真器

如上图所示,当增益曲线随频率增加,穿过0dB线后,由于高频零极点的存在,再次上升,并产生一个大于0dB的尖峰。

如果仍然采用默认的相位裕度计算方法,以从左往右的第一个过零点为UGF,那么在上述情况下,会获得一个错误的相位裕度。并且因为这个开环增益在更高频率上仍有单位增益,此时可能由于大于180度的相移,而最终造成闭环后系统开始震荡。

解决方法很简单,仅仅需要把cross函数中的“Edge Number”参数从“1”,改为“-1”即可:

UGF = cross(Gain, 0, -1 ,“falling”, nil, nil, nil)

PM = 180 – (Phase(0) –Phase(UFG))

这样,永远是最高频的一个增益过零点被记为UGF。

在上面的例子中,“EdgeNumber”的参数可以为正数,也可以为负数,那么这个参数可不可以为零呢?答案是可以的。

仿真器

对应开篇举得正弦波的例子,当使用“0”作为cross函数的参数时,函数返回的是一个“list”,里面包含了波形所有通过给定阈值时对应的x轴的数值,而次序是从左往右。如下图所示的CIW窗口。Cross函数和他的返回值依次给出。

仿真器

这里简单说明下,“list”是SKILL语言中的一个数据类型,可以理解为数列。而Cadence中的API都是通过SKILL语言给出的。而且大家常用的OCEAN也是SKILL中的一部分。

如果以“0”作为“EdgeNumber”参数的cross函数,在ADE(L/XL/GXL)的表达式中直接使用,会得到“evalerr”。这是因为“list”不是ADE(L/XL/GXL)接受的数据类型。

在ADE(L/XL/GXL)可以输出的结果要么是波形(waveform),或者是个实数。在上面的截图中,cross函数是在CIW窗口中直接输入的,这个时候Cadence把他当作SKILL脚本来处理。这里返回值的类型不受限制。

那么以“0”作为“EdgeNumber”参数的cross函数有用么?答案是:非常有用。

例子3:POR的输出是否有毛刺

资深玩家所知道的。。。

为什么要设置函数来检查POR的输出是否有毛刺呢?第一个是为了效率,例如在处理大量仿真结果的时候(2000 个Monte Calro仿真),已经无法来肉眼检查每一个波形;第二个是为了可靠性,假如毛刺很靠近第一个下降沿,如果没有充分的放大,就会很容易的漏掉。

仿真器

如何来实现检查毛刺的函数:

length函数是SKILL语言中的一个基本函数,它可以用来获取一个“list”中有多少个项。那么通过length和cross函数的组合:

length( cross( VT(“/POR”), 0.5, 0 , “falling”, nil, nil, nil) )

则可以获取POR的输出中有多少个下降沿。

当下降沿个数大于1时,则表示有毛刺的产生。

除此之外,还可以利用如果以“0”作为“Edge Number”参数的cross函数获取电荷泵每个周期输出电荷的数量,然后以波形的方式输出。

由此可以很直观的观察各种外界环境(PVT)对电荷泵输出能力的影响。这样的后处理会稍微复杂一下,没有办法通过几个简单函数的组合在ADE的表达式中实现。

需要通过SKILL语言,把他包装成“User Defined Skill Function”,然后在Calculator中调用。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分