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瀏覽量
83645 -
電源電壓
+關注
關注
2文章
986瀏覽量
23946 -
Cross
+關注
關注
0文章
2瀏覽量
6764
發布評論請先 登錄
相關推薦
評論