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中调用。
-
仿真器
+关注
关注
14文章
1016浏览量
83627 -
电源电压
+关注
关注
2文章
983浏览量
23939 -
Cross
+关注
关注
0文章
2浏览量
6764
发布评论请先 登录
相关推荐
评论