SERDES通道分析三部曲

前言:

本司日前完成開發測試並釋出了數款可免費使用的網上應用程式以應通道分析的一些步驟所需 (相關資訊請按此) 雖然這些軟體個自的產品網頁對其功能及使用上都有單獨的介紹, 但我們認為若也能在一套流程裡把它們串連起來則使用者就更能有個完整的概念並對背後的設計理念能有更深的了解。所以寫此篇貼文有雙重的目的: 首先我們希望對一般通道分析(channel analysis)的流程做個介紹,其次也希望展示讀者我們的這幾款APP可如何應用於其上。相較之下,一般要開發AMI模型並得到可做此類分析的仿真程式沒有十數萬美金起跳是不可得的, 現在直接從網頁就可免費執行!

概觀:

[Fig. 1, A SERDES system]

  本文係以上圖的SERDES系統做為案例, 至於其它的界面如DDR, 則請見上篇貼文對有關本流程適用性的探討; 上圖中中間的藍色區塊所涵括的部分即為通道的部份(channel), 其主要的構成為被動元件如封裝、傳輸線、導孔、連接器甚至是cable等等,話雖如此, 主動元件如TX及RX端的類比前端也應被包含在內, 這些主動元件的模型一般都是IBIS或與製程或有相關的Spice設計呈現。另一種可能的做法是把這些主動元件排除在藍色塊通道的定義之外, 而將其與TX EQ, RX EQ等連在一起做;這種做法下的通道(藍色部份)即可以一S參數來描述。之所以會這樣做有可能是因為主動元件的IBIS模型不可得或是要得到通道響應的仿真器對手上現有的主動元件模型並不支援, 例如現今網上的免費仿真器以我所知都不直接支援IBIS。而如此因而和TX EQ及 RX EQ相結合的類比前端級就會加上AMI模型設計的複雜度所以可謂是收之桑榆但失之東隅。一般而言,這中間的通道部份的確是會把TX/RX的主動元件所包含內的。

有了透過仿真所得的通道響應之後, 接下來就是對TX EQ 及RX EQ的部份加以建模。最常見的模型格式是IBIS-AMI, 有關這些本司之前的大部份貼文都已有許多探討故在此不再多加著墨。

最後有關通道分析的部份, 首先仿真器會將通道的時域響應或S參數轉為突波響應, 而後取決於所選定的Statistical 或bit-by-bit模式,或者將此直接送入TX EQ也或者先和PRBS的位元列先做卷積再送入, 而後把TX EQ的輸出再送入RX EQ後把最終結果以眼圖或bath tub的形式呈現。之前有談到中間含主動元件的通道部份, 其整體來說雖是有源而非被動, 但在通道分析上仍是以線性非時變(LTI)為假設, 所以當EQ部份也都是LTI時, 光用一個位元波(single bit response)就可以拿來透過各種排列組何來算出所有可能位元序列的機率函式PDF, 從而再積分得到CDF而畫出bath tub曲線並能對不同BER下的眼高或眼寬做一量測。但若是EQ部份為非線性或時變(NLTV), 則就只能乖乖地跑上數萬至數百萬的位元再把如此所得的時域波形疊合起來形成眼圖再依此量測。於此尚未提到、本司釋出軟體也尚未內含的、是抖動(jitter)及噪聲(noise)的部份, 理論上而言也是將其各自的PDF再和現有的PDF做卷積而得到加乘的效果, 至於實務上的考量他日再以專文探討。

由上所述的通道分析流程細節可見於第IBIS規格文件的十章第二節裡。簡單地總結來說,一個通道分析的三部曲包括了1.得到通道響應、2.得到或產出EQ模型、及3.把這些都放到通道仿真器裡得到分析結果。

 

一、 通道響應:

通道分析第一步的是對通道做時域仿真以得到其響應,如前所說我們也把TX/RX的類比前端包括在仿真的原理圖或網表裡,並以全部響應會是LTI為假設。如果現有欲分析的通路是佈線後的結果,則第三方的全波場解程式則為必需, 因為諸如VIA或連接器等都需以全波的形式場解(field solve)才能得到精確的描述;broadband spice也常是需要的, 因其可將場解出的頻域轉成如RLC/EFGH的仿真器內建元件而於時域上使用;若通道是為佈線前的分析, 則這些Via/Connector的模型仍為必需但傳輸線的部份則可以現有元件代替。如果S參數會一同參與仿真的話則這裡沒做更多說明的部份、即藏在魔鬼裡的細節、包括了調適S參數以期為passive, causal, symmetric and asympotic  以及最終將單端的S參數轉成差分的形式。當所有的模型都就緒之後, 則可到我們的[SPISim_IBIS 程式]端並把IBIS 轉成免費仿真器可支援的格式:

再來到Analog Device的官網免費下載LTSpice仿真器或直接用我們的SPILite:

而後或是編輯原理圖或是用網表把所有不含EQ的通道的部份都建出來,再以時域做階波響應的仿真;若是一位元終將會有N個取樣點的話(這個設定值用戶可自行決定,一般是32 或40…以可整除整個bit-time為主,等一下分析設定裡會用到),那階波從0至1的變化就需以在這個取樣點所代表的時間裡完成, 仿真出來的結果(不論是LTSpice或是NGSpice, SSovler等,均為SPISim_IBIS所支援)會是.raw的波形格式而可為本司免費的SPILite來觀看確認。

 

二、 EQ模型:

如果沒有EQ電路參與其中, 則用戶大可直接在上述的輸入裡更改相關的設定或激勵信號以而直接以傳統的SI分析方式在時域做多位元的仿真,再將結果做後處理及分析。但對SERDES或即將到來的DDR規格而言,EQ多為必要才能把眼圖打開, 而通道分析(一般是以StatEye的理論為基礎)之所以成為必要,即是因為其可在短時間內以卷積的方式把大量的位元和EQ模組做運算而得到可分析的結果, 也就是說, EQ模組(Fig.1裡綠色的TX及橙色的RX部份)也必需支援這種(以端點高阻抗High-Z為前提)的運算方式才能一起運作。現今這種EQ的模型多是以IBIS-AMI, Behavioral或是Spice的格式存在, 其中又以AMI為主流因其能為各不同廠家的通道仿真器所接受。所以分析流程的第二個步驟就是要得到或產生相對應的EQ AMI模型。

若是從無到有的話, 一般的做法是要以C/C++的語法透過合乎AMI API的格式來把動態函式庫開發出來, 所需不是三到六個月就是要更久;但用戶現在就可直接到本司的 [SPISim_AMI程式] 直接產生..完全毋需寫CODE及編譯:

把TX端及RX端的EQ參數填入之後,甚至還可以直接在程式裡用內建的PRBS或用戶可提供的波形(唯一的前提是需為固定均時步uniform time step)來對所欲產的的AMI模型加以驅動:

如果結果波形不合所需, 則回到參數設定處加以更改後再度即時測試, 最後按下”Generate” 按鈕相對應的AMI模可就產生了。這個模型不僅是可在本司的軟體上跑,拿到其它廠家的軟體(如ADS, HyperLynx, HSpice等一樣可以操作且結果都應一致;即便是用戶需要其它作業系統的AMI模型格式(如Windows 32, Linux 64)等,也可透過相同免費的SPILite以同樣的GUI操作而得之。

在本段落之初我們有提到很多EQ的其它形式是諸如behavioral或spice等(不論有無編碼加密), 在那種情況下,其很多含有細節的EQ響應(諸如有ringing等等)就無法透過如之前所示的預設AMI模型加以實現,則可以採用的做法是透proxy(代理人介面)的形式, 這點我們的免費SPILite也有支援且設計理代已揭諸於2017年的IBIS峰會中, 其概念是這代理介面AMI(Proxy AMI)會把用戶現有的spice檔案”包起來”, 而在仿真過程中透過用戶現有且指定的時域仿真器把這spice EQ的響應取出來,最後再以AMI API相容的格式傳會原始呼叫的通道仿真器, 以此形式的AMI建模以下圖簡示:

 

三、 通道分析:

當TX EQ, RX EQ及通道時域響應都在前兩步驟取得之後,接下來就可把它們都放入 [SPISim_Link 程式]做通道的Stat-Eye格式仿真了:

基本上就是把各模型及資料填入相關的tab裡, 再設定仿真運算模式(statistical or bit-by-bit)而後直接按”Simulate”加以計算;要注意的是如果所用EQ為非線性或時變(NLTV)如DFE/CDR之類的話,則仿法無法以statistical方式進行。凡此種種的程式詳細操作在其產品網頁已有視頻展示及說明, 故於此不再贅述。仿真數秒之後, 結果就會直接呈現:

其它資訊如bath tub曲線等也會同時產生:

其實直到這裡才做的說明是通道分析的前兩步驟(取得響應及產出AMI模型)都可直接在這個程式裡進行,用處其中之一是可以直接對所要有的EQ參數就其對通道整體的影響直接做更改後再重新仿真, 而不用回頭先以SPISim_AMI產生模型再以本程式跑之; 比如說用戶可以直接透過簡易快速設定頁來更改TX端的TAB加權值:

更改後再次仿真當就可見其在RX輸出端形成的效應:

其次,對一系統設計工程而言,其也把從所用的IC設計商處得到的AMI模型置入本程式加以仿真;而對於IC供應商而言,如此產出的AMI模型即可馬上提供給下游的系統用戶在其所擁有的通道仿真器裡測試使用;本文討論至今,這一切的軟體都可直接透過所連結的網頁取得並使用, 用戶完全不用花一毛錢甚至是提供諸如EMAIL的個人資訊。

以上..一個經濟又快速有效的通道分析流程或可做為您設計流程上的考量, 也歡迎舊雨新知繼續提供本司意見及建議。

IBIS-AMI: 案例研討

IBIS-AMI的建模通常是在IP研發快完成時才執行;也就是說, 一般是先有如用Transistor設計的IP出來, 再開發出AMI模型以便一同釋出。模型之所以需要是因為IP智財商一般不會把設計的細節揭露、但其用戶又需要有相對應的模型才能做分析。在實務上, 我們也會看到倒過來的情形:即先有如behavioral之行為模型或加密過的spice模型,甚或是Lab裡量測出來的數據後,再回頭來想做出AMI模型的案例。這種需求之存在大都是因為原智財商或者沒有AMI模型或者索價甚高。當然也有可能是用戶想先用能不同的參數找出在其設計裡最佳化的組合後再回頭來找是否有相對應的元件或向原智財商要求調校等。

在這篇文章中, 我們將就一最近碰到的、上述情況中的後者來做案例研討,我們的目的是要來示範建模的一般流程並以本司的軟體做為示範。下列為討論的大綱:

  • 相關IP資料
  • 建模標準及需求
  • 建模流程
  • 模型之釋出
  • 其它想法

相關IP資料:

對此案例的設計而言, 我們收到的資料是一以此design IP架在一般SERDES的通道的一網表(netlist), 其設計如下:

在TX及RX端都是含有可調參數的加密過後的HSpice, 當我們挑其中一組參數組合來進行仿真時, 可得到有效(即有意義無誤)的波形如下:

由於這是HSpice的網表, 所以我們可以很自由的去probe不同的節點並視需要去改變仿真的形式(如從瞬態改成小信號AC或是轉移函數等)。

建模標準及需求:

客戶自原IP商所拿到的除了上述網表外, 只有一個簡單的檔案約略說明各方塊及參數的意義和範圍。其中, Tx, Rx封裝模型均是spice sub-circuit. 通道(channel)是一S參數。而Tx/Rx都各含有Typ/Min/Max corners。其次, 在TX端有可調振幅電壓的參數, 有一分為7-Bit及6-Bit各可做為振幅乘數及EQ幅度的參數, 也另有一個boost = on/off旳參數來開關EQ的運作。

針對這些設計參數, 我們的建模目標是要產生相對應的AMI模型以對應不同的參數效能, 也就是模型使用者要能透過AMI本文檔的部份來調整模型效能。其次, 由於本司的軟體係做為建模工具, 所以建模者需要能以不透過寫任何C/C++程式或編譯的形式來達成建模的需求。

建模流程:

以此”逆向工程”來建模的案例來看, 原IP使用者大致是沒有最原始IP的設計的。也就是說, 諸大EDA商(如SystemVue, SimuLink)等的Top-down流程在這種案例上可能沒什麼用武之地; 因為沒有原始設計、自然也就沒有可以自動產生AMI C/C++碼的可能;取而代之的,我們得先依仿真結果來倒推出原IP 的設計架構, 再用試誤法來推出在某組效應下應有的AMI參數。這建模細部可又略分如下:

  • 建立Tx/Rx測試設計(test bench)

原廠所附完整通道(full channel)的網表裡含有建模並不需要的部份, 比如說封裝及通道的S參數就是依設計不同而不同的, 所以建模的第一部就是把實際相關的TX/RX部份萃取出來;其次, AMI模型的一項假設是所有模型的輸出入阻抗都是很高的,所以抓出的設計也就不需含有負載的部份而只與其輸入輸出有關。

就TX而言, 其輸入為PRBS而輸出為簡單的50Ohm

跑出的仿真圖形如下:

當我們把TX直接連到RX的輸入時,跑出來的輸入輸出眼圖如下:

由於眼圖中並未看到如DFE般因force zero而產生特有的突降, 故我們可推測RX端約略是由像是CTLE般的boost filter所組成;依此我們可假定RX test bench如下:

依此跑出的頻響如下:

其次, 由於下一步我們需要依現有的輸入來套到我們假設的AMI模型上, 再將其輸出來和由HSpice跑出的輸出來做比較,所以在此準備階段, 我們由透過本司的VPro來把輸入值轉出成單獨的波型檔案。下面會提到的SPISimAMI.exe就要利用到這個檔案來驅動AMI_Init 或是AMI_GetWave函式。由於HSpice是一variable time-step 仿真器, 要在其輸出probe得波形中得到相同時步間隔(fixed time-step)的資料,我們還得加上此一選項敍述:

  • 定義模型架構

有了測試電路, 下一步就是來倒推出可能有的模型架構並看看我司現有的Spec模型可否支援此一設計。

對於利用HSpice進行的TX的仿真結果, 我們可以看到兩個特點:

  1. 有de-emphasis, 其發生點在peak值之後
  2. 振幅和原輸入並不在同一位準:輸入是0~1, TX輸出是-0.5~0.5, 其次, TX的輸出在上升及下降端都有如RC的充放電效應而非方波, 也就是有應是有AFE(類比前端, Analog Front-End)的存在。

對於de-emphasis的部份, 我們利用本司Spec-AMI的what-if功能來看看在不同的pre/post-cursor情況下輸出的效果為何, 我們依次單獨把某一de-emphasis值調-0.1:

再透過即時的測試驅動來看對PRBS的效應:

可得如下比較波形:

由於我們的實際波形de-emphasis是在峰值之後, 且延遲只有一UI, 故和上圖中間者相合, 也就是確定為1 statge FFE with PostCursor 1 only的存在。

而類比前端部份加在前述FFE之後, 在本司模型中, AFE將對上下端的峰值加以箝制, 所以實際波形的峰值也就是我們模型的high/low rail voltage參數;剩下的就是調整RC參數來得到對應的slew rate了:

經過幾次的調整試誤, 我們可以利用FFE+AFE兩級來和某一參數組合的HSpice結果來對對照, 其結果如下 (藍為HSpice, 紅為AMI結果):

RX部份也是同樣的步驟, 我們利用之前已截取的RX輸入信號來驅動CTLE級,並對部份參數做試誤法的調整,即可以很快地得出一相仿的波形:

下圖中綠為HSpice結果,黃為AMI結果。

也就是說,在這一步驟中,我們針對某一特定參數組合下的HSpice仿真結果, 來逆向推出AMI模型應有的架構, 再透過一些試誤及參數的調整,使得現有的AMI模形得以產出和原仿真近似的結果。結論便是:本司現有的AMI模型,是足以供此建模所用的;而接下來的挑戰, 便是如何快速有效地針對不同的參數組合找出其所對應的AMI參數並產生可用的模型供釋出。

由於RX較為簡化(沒那麼多參數組合)且以下的步驟兩者相似, 故下述的討論單以TX端進行。

  • 制定仿真計劃

在制定計劃並進行大量仿真前, 我們也先針對TX端那有6-bit及7-bit旳參數部份單獨做一維掃描,並不需要掃所有的2^7=128及2^6=64個值, 只要挑一些來看看它們是否相互獨立, 結果如下:

可注意到的是slew rate及峰值部份並未因EQ值的設定而改變, 可見其相互獨立性;再者,這些值的間距也似與所設定的BIT值呈線性類比的關係, 這也就揭示了毋需全面sweep而可透過linear interpolation減少工序的可能。

以此例而言,欲為TX部份的五個參數做全域掃描, 所需進行的仿真可達2^6(de-empasis elvel) * 2^7 (swing level) * 3 (corner) * 2 (boost flag) * 3 (voltage rails) ~ 150000個, 由於線性類比可內插性, 我們加大間距而只掃部份的bit組合,依此想法, 我們透過了SPIPro的MPro制定了產生2403個仿真的計劃:

這2403的case是原150000case的近六十分之一, 其次,我們把TX測試電路參數化, 如下所示:

也就是說, 變數可以用%來含括(如%XVPTX%)而在稍後做取代; 上面表格的第一行(header)即為變數名稱, 其下每一行(row)裡都有該變數在那個行所代表組合裡的值;這裡描述的流程有點像是一般SI裡DOE的步驟; 當我們有一樣板化的TX測試電路及這一表格後,MPro即可據以產生相對應的兩千多個spice檔並以HSpice進行批次仿真, 因為只是驅動電路而無channel的存在, 所以仿真跑得很快…一個小時內所有的兩千多個結果就都出來了。接下來的就是要對每一個結果找出對應的AMI參數。

  • 參數的搜尋及調效

之前我們已證明對某一參數組合,我們可以”兜”出其對應的AMI參數以得到和HSpice相仿的結果, 故在這一步驟中, 所要做的便是對已跑出的2403結果裡的每一個都做同樣的動作。其流程如下:

如果是要用人工進行的話,這2403個CASE當然還是太多…得再減少到成只有50~100左右, 若用程式自動化來跑則無此顧慮。從結果來看, 因為即使不同的CASE其輸入的PRBS波形都一樣, 也就是說在輸出端會出現峰值及EQ變化的時間點也都一樣,所以我們大可透過程序來自動進行。

在我們的做法中,我們首先先把之前證明可行的FFE+AFE架構的AMI檔參數化如下:

其次我們觀查某一組EQ及峰值掃描的結果:

決定的做法是:先讀取HSpice仿真值裡的峰值設定, 由此決定了上面樣板化AMI檔裡的%SWING%變數,其次,再以仿真結果的EQ值為目標, 透過二分搜尋法來變化樣板AMI裡的%FFE_PARAM_POS1%變數, 一旦有新的AMI檔後就把最開始抓下的等步輸入來透過SPISimAMI.exe驅動此AMI檔及.so/.dll, 結果自動和仿真值相比直至其差相近或二分法未收歛為止。

我們的SPIProPro有支援類似的自動化步驟,即使沒有SPIProcPro, 這部份的自動化程序用perl, python或matlab來做都遠比寫C/C++的AMI程式碼來得簡單,其結果, 我們能在約一小時內就把所有的2403個結果處理完並找到對應的AMI參數值。

這是SPIProcPro的部份設定:

對於2403個每個CASE, 其後處理之後每個都會有個別的、內含有找出AMI參數的csv及log檔產生,而這些檔案也被程式自動組合成一個含有2403行的CSV檔,最後用MPro把原始輸入參數和此計結果檔左右相結合, 所得到的就是一個不同情況下的輸入及找出AMI對應參數的對照表。

模型之釋出:

上一步驟的CSV檔案結果如下所示:

其中右邊藍框內的參數是本司SPISim AMI模型所需的參數,這些欄位的第一行, 即表頭部份,有著和AMI參數完全相同的名稱; 而之下的每一行就是不同設計參數下由之前步所驟所找出的相對應的AMI參數。

記得在之前定義架構完成後所產生的AMI檔有著我們內建模型所特定的參數如下:

我們所希望釋出的模型能有和原IP同樣的設計參數, 這些參數為上面CSV表格中紅框的部份, 其也為在產生TX兩千多個不同測試檔案中所用到的變數, 而最左邊黑框的部份則是(可有可無)的索引預設(preset)。

我們SPISim內建模型有一個特點: 其可透過此種預設表格的方式來為所需的參數提供資料, 且這設定可很簡單地透過我們AMI的GUI完成:

上圖中用的是PCIe的例子,其TX有十一個預設值定義於spec裡, 所以利用這麼一個表格,用戶可只用PRESET的AMI參數便來為其它的, 模型所必需要有的FEE_PARAM_PRE, FFE_PARAM_POS0等變數來提供數值。

而在這個案例裡,我們要用的不是這Preset值,而是各原始IP的設計參數如下所示:

則做法是把Preset值設為 -1, 而後提供如原始IP等相對應的欄位名(上面AMI檔內紅框所示), 在運作啟始階段,我們的內建模型會把這些變數來在CSV表格內去找出過濾出來的行(row), 然後再把那行裡相對應的內建 AMI模型參數套用進去, 如果這些原IP參數裡有至多兩個數值型(而非字串型)的變數沒有找到, 則模型會把最接近的兩行找出來來做線性內插, 而再把內插出來的值傳給模型使用。

也就是說,我們可利用本司模型裡數客戶自訂參數來找出對應內建AMI參數的功能, 以及至多可做二維線性內插的功能來為產出簡單明瞭的模型供釋出。

由這些步驟所產生的最終結果是一個.ami檔, 一個.csv 檔(內含所有對應表, 此.csv檔可為明文或經SPIPro編碼加密), 及一組早就編譯好的.dll/.so檔案。在上述的過程中,完全毋需寫任何C/C++碼或在不同作業系統上編譯來產生AMI二進位檔;即便是.tr0後處理的階段,用人工做至多五十至一百個參數的搜尋、抑或是用簡單perl/python/matlab來進行和SPIProcPro相似的運作,都仍遠比從頭寫AMI模型及編譯來得簡單。

其它想法:

在此案例中,我們透過的是如”逆向工程”般的方式來產生一對照表(.csv)以便為定義好的AMI架構來供值。由於廠家提供建模用的IP是Spice檔, 另一種可能是透過我們SSolver或NGSpiced來直接對所供的Spice檔來仿真(這仿真引擎是內建在AMI模型裡的)並為AMI_Init或AMI_GetWave提供輸出波形。這樣就不用透過各種掃描(sweep)而可提供更直接的對應。但要能如此做的前提是:原Spice檔未經加密(加密過的網表只有HSpice能讀), 未牽涉到製程檔案(要不然大概仍是非HSpice不行)且其網表的語法能輕易地轉換成SSolver/NGSpice所支援的格式。其次, 在參數搜尋方面, 因為我們只有一個EQ參數需要找值,所以用二分搜尋法就可以很快地收斂。但若是有兩個或二維以上的變量需要搜尋…比如說同時有pre-boost及de-emphasis參數等, 則若二維曲面每一點找值不可行(要仿真的case過多),便要考慮使用如gradient descent等的差分/最小能量似的優化algorithm。

仿真器之研發:建模 (S-參數及Port元件)

系統上的channel及很多個別元件都是以S-參數來表示,其可能是用三維場解器依實體結構(導孔或連結器等)算出、也有可能是利用我們SPro的工具一級一級串結計算(cascade)而成。再加上LTI (Linear, time invariat即線性非時變)的假設,很多工具便可依channel單一脈衝(pulse)的波形來模擬數以百萬計位元的相疊加而得到如眼圖或BER圖形等的資料;無疑地,不論是單一脈衝波行的計算(在含IBIS情況下,未必都能用IFFT的方式來達成)、抑或是針對一些特定位元樣式(bit pattern)時域響應,一仿真器都應有能支援的能力。除此之外,在很多情況下我們所得到的spice電路是由頻域轉換而來、但其原始頻域資料又已不可得;故也常會有要能重現其原來S-參數資料的需要。這篇貼文裡,我們將簡單談談S-參數及相關的port 元件在SPISim使必信 SSolver裡是如何建模的。

S-Element… S-參數

近十數年的研討會或學術論文裡,多有許多對S-參數時域建模仿真的研究;在最基本的概念上,S-參數是在不同頻域點的輸出入相關資料,其可被視為一頻域的轉換函式(transfer function)或是濾波器;故可套用數位信號處理的基本應用:在頻域上和輸入做相乘等於是在時域上做捲積(convolution):

一旦轉成時域(如上圖的最底部方程右邊)則等號右邊則可進一步改寫分成兩項:一個是由元件過去的歷史值算出、亦即由-infinity積分至前一步t=n-1的項目;以及在現今時步t=n和當下輸入有關的項目。前者因是歷史值已發生,故可被視為是一常數而在牛頓迴圈裡不再更動;後者則因和當下輸入有關,故需在Solve及Stamp的熱迴圈裡不斷更新。總的來說,這兩者寫在一起便有了諾頓等效電路I = Y * V + J的形式。其中的Y和輸入V是連在一起的而J則可被視為常數不變。這兩者的值算出後便可自系統矩陣內更新來求解。

有興趣的讀者可參考HP多年前所出版的文件,其中對以這種捲積方式求S-參數解的過程及數學有更詳細的解釋:

Integration of Transient S-Parameter Simulation into HSpice

其中的第「18」及「19」式即為上述有關等效電路的部份。

因為捲積的基本理論是在每一時步之末,常數的值都需更新為-infinity to t=n以便為下一時步t=n+1所用,再者捲積是一種IFFT的樣式而在時域上的時步是固定的,這種要求限制了仿真器運行的速度,也就是為何近來有許多研究論文建議以不同方式來進行S-參數時域仿真。

其中的一種可能是利用之前所提、用在傳輸線建模上的的vector fitting技巧:先利用如Pade approximation 般將S-參數頻域資料透過不同極零點的選取而轉成有理式(rational function),而後利用同一種basis function在不同極點頻率對時域的轉換而得到相對應的形式;這過程的一個附加效果是若原有的S-參數資料有non-causal的情況,便可在有理化的過程中得到修正;與為傳輸線建模同樣地:極零點數目的多寡和是否與原始頻域資料相近似、以及轉成時域後的仿真速率都有相關;再加上原始S-參數資料在某些點可能是ill-behaved,故在實務上常得用如pseudo-inverse的方式以minimum-square-error sense的方式來求得近似有理方程式。

P-Element… 埠(port)元件

系統上許多元件、諸如晶片封裝package, 導孔via,連結器connector等等設計過程都是先有立體設計;而後用三維場解轉出S-參數,最後再用如broadband spice等的工具轉成相對應的spice 基本元件以便能在時域上仿真。對系統完整性分析人員而言,也在很多情況下所得到的元件模型多是這種已透過轉換得到的spice形式而其原始頻域資料並不可得;與其就直接把元件置入channel中來進行分析,較好的做法是先看看其頻域響應為何、頻寬是否足夠及是否有連結性上的問題等等。透過仿真的方式將spice subckt轉出S-參數在此便用應用的空間;而由於S-參數之轉出是植基於小信號頻域分析的,故一旦系統元件的AC模型建構完成,則轉出其S-參數也就近乎水到渠成了。

在此我們談的S-參數轉出是小信號部份,也就是在DC操作點附近的頻域分析,故而步驟上是先在輸入埠元件定義的地方先而對DC求解、加上AC信號後對其它埠測量,而後再進行下一個埠以至所有埠都掃過為止。

一般而言,埠元件(port element)都有幾個參數:DC偏壓、參考負載(reference impedance)、埠序(port order)及埠名(port name)等等;在輸入埠有DC偏壓時,其它的輸出埠都是連到參考負載的;在不同的頻率上求解後,輸入輸出埠間功率的關係可透過對埠的電壓及輸出入電流的量測而算得,而後依S-參數的測量公式:

S-parameter measurements

便可得到輸入埠i對其它埠j的Sij值;重覆這程序掃過所有的i後(不同的輸入埠可能有不同的偏壓)不同頻域點的Sij就都有值了,最後再依之前定義的埠序把資料寫出(至touch-stone format)且在表頭註記埠名則S-參數轉出的程序即算完成了。若是有進一步的需要要將S-參數轉成其它如Y, 或Z參數的形式,則可透過公式(雖是只有雙埠,但若假設S-參數是廣義的2-n port 也可適用)或是如本司SPro的工具達成。

 

回到仿真器的部分:

除了至今所提的各個元件物理模型的建模外,回到仿真器的階層則又有如下列的相關的課題:

  • 記憶區(memory pool)之管理:分配,擴張及清除
  • 多執行緒
  • 模組化外掛架構以支援新元件
  • 其它種種。。

不難想見這清單可很長地列下去,而之中的編程的工作也未必簡單;即便如此,對於系統分析的方法及流程而言,仿真器的完成及支援實有其不可取代的價值:對很多日後的分析,我們都不用(很多情況下也不可能)再得事先導出所有的算式了,我們大可透過直接形成網表後呼叫仿真器後再後處理資料的方式達成。這不僅有助於軟體的模組化,在穩定性(仿真可在另一執行緒或透過simulation farm完成)甚或是可測試性上都很有幫助, 對於一以研發系統EDA的公司如我者而言,是一項值得的投資。

仿真器之研發:建模 (IBIS及傳輸線元件)

元件在仿真器內運作的順序大致上是:先將網表上所給的原始設定轉為仿真過程中內部所需的資料結構(Parse)、在DC未開始之前將物理模形轉成(Model)諾頓等效電路之形式,而後在每一時步或每一時步的牛頓迴圈中更新(Solve)等效電路參數值並將其填入(Stamp)系統矩陣中,最後在每時步或仿真結束前將其資料傳給上層以便記錄後處理或直接寫成波形檔(Query)。這其間的“Model”與”Solve”的設計便是仿真器設計中需對元件物理要有的理解才能順利完成的。

在這兩篇貼文中,我們將大致談談系統元件中IBIS、傳輸線及S-參數等是怎麼被建模(Model)及求解(Solve)的。

B-Element… IBIS:

我們之前已對IBIS寫過幾篇貼文,同時也由下面的IBIS結構中便可對如何建模猜得一二:

這幾組IV曲線: pull-up, pull-down, power clamp and ground clamp基本上就是非線性電阻,亦即其電阻值隨著兩端點的瞬態電壓而改變;故在牛頓迴圈裡,程式只要利用其電壓差來在之前Parse得的曲線做線性內插即可。實務上因為這種內插要進行很多次。。若每次都從第一點開始掃描點落在的區間則效率不佳,故可先建成線性方程以增進查值速度。

上述IV曲線之外,瞬態波形轉出的切換係數switching coefficient及合成電流composite current 兩者都是與時間點有關的,其作用可視為是一個乘數來對靜態算出的電流再加以限制。切換係數的目的是要確認IBIS在連到表定的負載時,在端點會有如waveform table一樣的響應。而這係數是在仿真過程中只要事先計算一次即可的,故可在Model步驟中完成。最後至於C_Comp,若可能的話可直接加入仿真器已有的電容器串列中而不需要自行管理有關error prediction及積分等的事宜。

大致上來說,為IBIS元件編程較複雜之處多是因為不同的模型參數可能有不同的skew,而其間可能的不同組合(比如說fast 和slow就會由不同參數中typ, min, max組合而成)便得對簿計先事先規劃;其次,因為在同一元件裡,除主IBIS外也可能會有submodel, driver schedule等的附加IBIS模型以達成pre-emphasis等的等化功能,故在軟體的設計上可能也得考慮如composite pattern以便能以一模版來遞迴地加入主要及附加IBIS模形部份。最終而言,IBIS元件的建模是相對容易的。。尤其是如果跟即將要提的傳輸線相比的話。

W-Element… 傳輸線

每本電磁學教科數裡都會列出如下傳輸線單位長度dx上的RLGC基本模型:

在含HSpice的許多仿真器裡,上述的模型多以U-element建成,即(Uniform distributed model);由於使用者得事先決定要以多少單位長度(dx)來建模,再加上仿真效率上的考量,這種U元件多已不被使用了。話雖如此,傳輸線的基本模型資料(frequency dependent tabular model, or tab model)仍是以這種形式儲存的:

這種tab model一般是由二維場解器依PCB疊層、走線寬度、疊層間界質之物理特性(如導電度,介電常數等等)甚至是粗糙度後處理(surface roughness treatment)等照Maxwell的邊界值條件在不同頻率上解出而來;一般上也都必需要有低頻(近DC)、高頻(50G或100G)及其間不同的頻率點的值才算完整。那要如何將這原始資料轉成可仿真的線性模型呢?一般可從電報者等式 Telegrapher’s equations 開始著手:藉由解出單位長度下RLGC的KCL/KVL,我們可得到一階導數式:

而這兩列微分方程的解,即如上述wiki連結裡所示,為一含有傳播函數Gamma T的波方程 :

當把這系統模型之解寫成有如線性式時,便有如下的諾頓等效電路:

在傳輸線近端及遠端的電路裡,都有兩個部份:其一是在瞬態當下的電抗Z(s),其二是由彼端入射或反射、經傳播遲延而傳來的電流源。這兩者在上圖都仍是頻域值,故在時域仿真時,均需再進一步地轉化成可積分的形式才能在不同時步中stamp入矩陣。綜上而言,傳輸線元件的仿真步驟為:

  • 讀取並儲存原始的tabular model;
  • 利用上者最高頻率值(或利用外插)來算出此線之傳播遲延及特性阻抗,這兩值將使用在後面的時域仿真中;
  • 在頻域中建模出上面系統模形裡的阻抗響應Z(s)及傳播響應r(s),因傳輸線可能是有多條線藕合在一起的,故這些響應式多是多維的矩陣;
  • 利用Vector fitting 的技巧以數個極零點來模擬上述Z(s)及r(s)的曲線,在大多數的情形下(尤其是當原始模型資料不足或ill-behaved時)要很完美的能去map這些曲線可說是不太可能的,則需採minimum-square-error等的方式如來求近似曲線的極零值;
  • 一旦有極零點,便可將每個term都轉成相對應的時域函數,而這所有的term在時域上的組成即是其在時域上的響應。例如Pade’s approximation就是同樣的原理;
  • 在時域仿真時,每一時步中都對彼端在傳播遲延時間前的歷使值利用內插的方式來得現值r(t),這現值再和當下的Z(t)一起組成等效電路填值於矩陣中;
  • 在頻域仿真則簡單得多:可跳過vector fitting及轉成時域積分式的步驟而可直接內插出當下頻率的Z(s), r(s)來使用。

對於前三個步驟,我簡單地寫了兩個Matlab scripts 來模擬兩條藕合線的情形:

阻抗函數:

傳播函數:

輸出:

以matlab編程的話則上面的程式看起來簡單得多;實務上多數的仿真器(含SPISim的SSolver)為了仿真速度上的考量都是以原生碼(C/C++)編程而成,故在matlab裡簡單呼叫即可的矩陣操作如inverse, eigen value, LU decomposition等等都會因在原生碼語言中所用函式庫不同而多顯得冗長複雜許多。

最後,很少剛為元件建模完成即可直接運作無誤的,很多情況後面除錯所花的時間精力會較前面開發的期間更多;對傳輸線而言,因其多為多條線藕合、且由極零方程轉到時域的方程又有很多項、再加上有些信號得等上傳播遲延後才會由另一端傳來,故在除錯上是極具挑戰性的。一般上我們是用divide and concour的方式先把問題簡化到最少再一項一項來修正:比如說先除錯單線,阻抗完全匹配(故無反射),且特性阻抗為已知(故可查入射的振幅)再從DC位準來的除錯等等,這樣便會顯得有頭緒許多:

SPISim SSolver傳輸線建模的根據論文和HSpice所本的是同一篇,有興趣的讀者可依下查閱:

“Optimal Transient Simulation of Transmission Lines” by Dmitri Borisovich Kuznetsov, Jose E. Schutt-Aine, IEEE Trans. on Circuit and Systems, I Feb. 1996

教科書方面個人則以為Dan Oh:“High-speed Signaling”, 也就是我們相關書籍選列中的第S6 於第五章部份解釋得較詳細;這也可能是因為原著者也在相近時期與上述論文第一作者自同一學校畢業之故;最後也值得一提的是上述傳輸線的建模方法也常可應用到其它不同的元件,比如說是同是均質被動、以S-參數表示的system channel。在將頻域資料利用vector fitting轉成有理化式的過程中,一些原有的S-參數問題(causality)即可透過這個程序來修正。

仿真器之研發:界面

在前則貼文中,我們提到電路仿真器的核心部份是有由線性代數方法, 來對由節點電流及網目電壓方程所形成的矩陣做求解;我們也提到靜態及瞬態的運算中,元件部份被呼叫最多次的函式是”Solve”及”Stamp”兩式,也就是元件先依在那一時步的那牛頓迴圈中的端點電壓電流情況針對元件本身的物理方程求解,而後再將解出值填入矩陣式中的步驟。由於在熱迴圈(hot loop)內而被呼叫次數眾多,元件裡的這兩個函式便需務求精簡迅速必要以使仿真器整體運作能穩定、易維護且具延展性。

在前文底所列的經典電路分析教科書中 “Computer Methods for Circuit Analysis and Design” :第170頁列有元件值是如何被填入矩陣裡的:

從上表可見,在第一層的界面定義中(也就是元件的Solve函式裡)最主要的工作是不論單獨元件物理特性為何,均能由當下端點偏壓或所流經電流值而轉應成相對應的基本元件(如電流I、電壓V、電應G及電抗A)形式再依上表填入系統矩陣中。除此之外,由於牛頓法裡也要求要能提供一階導數以便在下一迴圈裡能更新自變數,故元件也要有能依端點情況提供一階導數(i.e. partial derivative)的能力;否則,仿真器將被迫以數值方式來對系統矩陣求導數,也就是在某一點情況下固定一自變數但依續變動其它自變數的方式來求數值上的導數(dV/dI 或 dI/dV),如此以來,將導致仿真速度明顯變慢且更不穩定(易不收歛)。

在理論上,不論一元件(即便如場效體或傳輸線等複雜元件)是否為非線性,其都可以藉由固定維持大多數自變數為常數的方式而得其線性化模型;比如說在某一時步(故t在此為常數不變)的某一牛頓迴圈(故端點情況為固定不變)的情況下,便可利用諾頓(Norton circuit)戴維寧電路(Thevenin circuit)來達到簡化模型的目的:

上圖中,簡化後的模型已可用上述的基本元件(I, V, G, A)來表示而可依表填值;在我認為:這簡化的過程就是元件物理和仿真器相交集之處。

舉例來說,簡單的元件如R, V, I等等,程式只要依表填入到系統矩陣相對應之處即可;被控元件如E, F, G, H等也可被視為受控電阻或電感來依樣填值。較複雜的元件如之前提及的場效體、傳輸線或S-參數等當然就要事先導出數學式來表示其物理意義。專piecewise-linear電路或元件而應用的Katzenelson algorithm或可在此派上用場,即便是諸如電容或電感等的元件也得規畫一番才能填值;這兩者一般是用數值積分/微分器及Predictor來達成此一目的的:

從上述式裡可見:電容及電感沒有直接的電應或電感值可用, 而是得利用如數值微分的方式來進行;比如說簡單的Backward Eular dV/dt = (V0-V1)/(t0-t1)就可使電容C的電流變成有諾頓電路般I=Y*V+J的形式,而這J的部份則是由此電容過去的歷史值演算來而來。在固定時步的仿真器裡,這種簿計(book keeping)尚稱容易,但對非固定時步的仿真器而言dt的取捨則影響了仿真的精確度。而某些元件如傳輸線等,其線長也決定了信號傳輸的遲延故而也就限制了dt的值,否則若時步差過大,則由另一端入射或反射而傳來的信號變會被跳過了。綜上所述,可見一仿真器的研發真的必需由許多面向來考慮。

下面所示的截圖即為仿真器裡電容元件在熱迴圈裡的函式,讀者可由黃色文字的加註看到前述不同的處理:

仿真器設計裡第二層的界面設計是有關於延伸性的考量。在前則貼文裡可見:以英文字首為始的二十六個元件大多已被使用,比如說R,L,C,I,G,E,F,G,H等字首都已約定俗成地表示電阻乃至於各類的受控元件;但除此之外若吾人要為特殊元件如天線、濾波器、特殊集成電路或甚至是將來尚未開發的元件來建模呢?一般而言仿真器都會有外掛的架構並以動態函式庫(dynamic link library .dll or shared object .so)用預定界面API的方式來達成此目的。拿Berkeley spice的仿真器來看,其定義的API如下:

可以看到能使用的類別較本文之初的表列更少了,更有甚者,藉由定義這些埠(port)及取用函式,仿真器可進一步限制了延伸元件對系統矩陣的存取而維護其穩定性。於是,設計元件以便能外掛於現有仿真器的工程師就得更進一步地把原有不論複雜與否的元件物理簡化成上述簡單API形式的工作了。

當這些簡化物理模型的方式導出之後,剩下的就仿真器研發部份便是逐一地把各個元件的模型利用數值及程設技巧先在DC或TR開始之初加以建模,而後在每一時步的每一牛頓迴圈裡依端點值計算更新模形參數而(透過API)提供給系統,再在每時步末為下一時步的所能取的dt加以設限且更新歷史記綠等等。

在我們SPISim使必信的SSolver仿真器裡,我們所參考的正是Berkeley Spice的架構且深為其設計理念及樣式所影響;在其原始版本及許多演化至今的其它開源版本裡,都沒有系統整合性仿真所必需支援的元件如: IBIS, 有損藕合傳輸線, S-參數及可定義如PRBS等的有源電壓等等;即便是S-參數的轉出,其它版本多也只支援雙埠電路(two port network)。由於過去的業界相關經驗,我們能夠相對輕易地了解其原本架構、流程而在較短的時間內加上這些元件的支持而達到應用的目的,但在閱讀相關文件及研發過程中,對這款在數十年前便已開發完成的仿真器,我們仍不禁且不時地為其設計之週到及流程之順感到敬佩,也建議有興趣的讀者能以其為本來深入地研究。

 

仿真器之研發:架構

在系統電氣性分析上,有效的方法及流程都必需建構在一定堅實的基礎之上,這“基礎科技”大致上包括了二維或三維場解器、仿真器及能依統計方法來演算出眼圖或BER的模組。針對仿真器而言,新思科技的HSpice可說是業界公認的標準,它功能強大又涵蓋了系統完整性分析上的各個面向;在北美及世界上的有些地區,我們可假設每個工程師都有HSpice可使用;但在許多其它地區。。比如說亞洲、或是當部門預算受限的情況之下,這假設就不成立了。為了能使我們使必信客戶在這種情形下也能享用我們所建構的分析流程,自去年下半年始我們開始了仿真器SSolver的研發。其初版本剛於日前釋出;為了分享一些背後的研發構想及基本仿真概念,我們將以以此篇為首的幾篇貼文饗有興趣的讀者。要說明的是我們的前提是以電氣信號為主之MNA仿真器,故不包含其它有關機械或熱能等的部份。

電路仿真器可說是一門電腦科學、數學及物理等知識相結合的一門術!

每個大二電機系學生都學過:兩個電路分析的基本形式是節點電流網目電壓、分別以科希賀夫電流及電壓定律表之;而由這兩種形式都列出的方程式可以用矩陣的方式來表示。

 

 

 

 

 

當然,並非所有的電路元件均可以電壓或電流的形式表之, 比如說電流源的電壓準位即沒有定值。為了能將對每個節點電壓或分枝電流都能求解,將KCL/KVL合寫的MNA (Modified Nodal Analysis)便有其必要,其是以節點電壓法為主是因為就一電路而言,其節點電壓數目較網路來得少,故當以矩陣式來求解時,矩陣大小就小得多而能更快地求解。而暨然談到矩陣,則許多有關線性代數的技巧、諸如稀疏矩陣、conditioning、pivoting等等也都會被使用,而這也就是數學在仿真過程中所扮演不可或缺的角色;否則一旦矩陣循迴幾次求解不成,仿真便不能收歛了。對仿真器研發而言,常也是在這時候必需思考到若有矩陣元素造成不收歛,將如何連結至原始元件或是提供相對應的資訊給用戶以便能對網表(NetList)進行除錯。

實務上,要解一個矩陣一次很簡單。。幾行Matlab碼就可以了,但若要能以最有效率的方式在仿真電路過程中解幾千幾萬次,則又得多費思量了。所以即使是尚未談到元件物理特性的此時,沒有資訊科學上的考量也是行不通的。

電路分析有很多種形式:時域瞬態(TR)、時域靜態(DC)、頻域小信號(AC)、極零(Pole-Zero)等等。系統分析上,最常用的是時域瞬態分析,而其最基本的分析步驟是牛頓法求解,也就是利用矩陣在某個點的一階導數來對下一迴圈可能值來進行預測及再求解,直至矩陣的值解出為止。這個過程又分做兩個步驟:靜態解(DC)及之後每個時間點的瞬間解(t > 0);在解靜態值時,所有的元件已達靜態值:故電容器是開路而電感是閉路,且也沒有任何時變信號。而在瞬態求解的每一個牛頓迴圈裡,時間點是固定的而且端點電壓、支路電流也是固定的。。就好像解靜態值一樣,若求解不成功,則仿真器就在同一時間點內,依矩陣的一階導數來調整端點電壓值等以在下一個牛頓迴圈裡再進行求解。如此一時步一時步地完成時域仿真。在某些情況下DC求解不成功,則仿真器可更進一步地利用Ramp或Charge-up的流程,先假設所有的電壓電流源都是0且元件無初值(則每點電壓就當然也是0),而後漸漸地將有源元件”Ramp”至應有的最終值,通常經此一步驟,DC求解多能成功。

上面的圖是Berkeley Spice以元件字首的表列;之前談到仿真器難的地方在於要以最快的速度求解,則我們就不能不對所要支援的元件進行更進一步的分類,以便在仿真過程中減少函式呼叫(function call)的次數。比如說,我們可將上面所列的元件分為下面幾類:

  • 不具時變性:如dc電壓或電流源,電阻等等,它們的值在仿真一開始之前就決定了而不會再有變化。
  • 具時變性:
    • 線性: 比如說PWL源,其值雖時變,但在同一時步的每個牛頓迴圈裡並不會再改變,所以同一時步只要求解一次即可;
    • 非線性:如場效體或傳輸線等等,他們的值必需在每個時步的每個牛頓迴圈裡更新才能求得正解。
  • 頻變或非頻變:

一旦分類完成,我們便可再進一步定出仿真器需支援的元件界面,以便能以最有效率的方式在每個牛頓迴圈裡由各個元件將先求元件內的解(Solve)再將那一瞬間的元件值填(Stamp,如蓋印章)到矩陣內以求解;這兩步驟(Solve & Stamp)可說是仿真過程裡被呼叫朂多次的程序(hot loop);一般來說,我們可為元件定出下面的界面:

  • 讀網表資料:仿真之初,將網表資料讀入且做語法偵錯;
  • 元件初始化:DC開始前將讀入的資料轉成仿真時會用的資料;
  • 建物理模型:DC開始前(或也含TR開始前)初始化物理模型;
  • 填入矩陣值:依每個牛頓迴圈內的解將元件資料填入矩陣裡;
  • 解元件瞬值:在每個牛頓迴圈內依端點值求元件瞬間解;
  • 輸出測量值:每個時步完成後輸出所量的元件值;
  • 清內部資料:仿真完成後清除資料。

若是以物件導向性語言如C++等來設計,則上述的界面程序應是以虛擬函式來實作,若是以程序語言如C,則大概是以struct 的形式定出functional pointer而由實作的元件依在struct裡出現的順序來覆寫;在仿真器的上層,也應有一些串列來將網表內的所有元件來串連起來;故在仿真過程中,所有的電容器等都位在同一串列中而由仿真器引擎依序呼叫;如此一來,若是遇到非時變性元件的元件串列,則在那時步之初便可直接跳過;而時變性線性元件也只要在同一時步的第一個牛頓迴圈裡呼叫一次即可。

另外也要考慮到的是物理模型的儲存。舉例來說:一個晶片可能有數以千萬計的場效體,但之間有不同元件尺寸的可能不會太多,所以可以以數個不同物理模型供這些場效體來使用而不用每個元件有一個local copy;而每個元件對不同模型的取用也可能得用雜湊函數(hash map)來進行而非連結串列(linked-list), 以避免N^2迴圈情況的發生。

其它的考量至少也包括了時步進行的程序及再初始化:就前者而言,現今的仿真器很少是固定時步的,通常仿真器內會有Predictor來預測下一時步可以跳多遠解值也不會差太多,但一旦“跳太遠”時便必需倒車以較小時步來進行;所以在系統矩陣上簿計的程序也要具備才不會重覆求解;對再初始化而言,仿真器多有”.alter”類的語法以便只要稍改部份元件值便能再進行仿真;故在元件內部的設計上,不僅不需要的程序不用每次仿真(.alter)前都重做,就連算過的解也要能清楚乾淨而不要“污染”到下一次仿真的進行。

諸如以上種種,不難想見設計一仿真器所得先有的設計及想法,否則設計出來的軟體不是臭蟲多、不易除錯或維護、就是延伸性不強而不能輕易地加入新的元件。在另一方面,也正是因為這些必需要有的深刻思考而能讓工程師如我者能欣賞領略各個領域知識相互契合運作無誤而能有助我解決工程設計難題之美。

網上已有許多開源仿真器可供讀者參考,它們多是衍伸自Berkeley Spice而來,Berkeley Spice在我看來是個很完整、至少頗具教育性的仿真器架構。教科書方面我則推薦以下兩本經典供參考:

在開源Spice仿真器上使用IBIS模型資料 「之二」

備註:

對此貼文有興趣的讀者或可繼續在 [Part 1] 得到更多相關資訊,並至 [Free Web App] 使用此一模型轉換流程的免費工具。

這篇貼文將探討如何把IBIS資料裡的瞬態資料Waveform轉出以便在免費Spice裡仿真;「前一篇貼文」討論的是我們開發此流程的動機及如何轉出以IBIS裡Ramp資料為主的Spice模型。

由IBIS裡的Waveform資訊做IBIS to Spice的模型轉出:

在使用IBIS模型時,一般我們都會利用其Waveform資料;故若欲由IBIS原始資料產出一相容於免費Spice的模型且得到與一般使用上近似的結果,則此Spice模型也必需能利用到瞬態Waveform的資料。

在IBIS模型裡,不論是輸出點的電壓或電流,在瞬態都是點對點相對應且和時間有關的。比如說在IBIS V3.2或更新的模型裡,一般都會含有兩個或更多個在不同負載情況下所得的Waveform表格;即便是只有一個表格,一般在仿真器內部也可透過Ramp資料來產生另一組時序的資料。而在IBIS V5.1或更新的模型裡,也含有如[ISSO] 及[Composite Current]等的電流表格。後者的電流資料和前述的電壓表格雖在模型裡放在不同的地方,但在時序上是每點都相對應的。在此所說的“時序”並不是指仿真過程中每一點的絕對時間,而是指在輸入切換信後延續至今的相對應時間(Elapsed time)。在原理上,一般會產生兩組切換係數Ku(t)與Kd(t);分別對應於PU及PD電流分支。其作用在於產生一漸漸“開”或“關”的機制而使信號漸達穩態。這兩組係是是由兩組Waveform資料在不同時間點所算出。當模型接上相同負載時,它應會產生如Waveform 及Composite Current表單裡所列出完全一樣的電壓及電流響應。而當負載不同時,它們也會相對應地縮放輸出的強度。關於這些運作細節,請見我們之前的貼文

一旦我們能算出這輸入後才開始的相對時間值(Elapsed time),我們就可透過許多有關論文及規格所示地IBIS結構透過ASRC元件以Spice格式組出來。也就是說,當我們完成欲將IBIS裡Waveform資料轉出Spice模型後,在原理圖及表單上所顯現的便是如下所示的原始IBIS建構區塊組合:

要達到這個目標,也就是說要組出如原始IBIS區塊一樣的Spice模型,有下列問題先需被克服:

  • 在仿真過程中算出信號切換後已延續至今的時間;
  • 由兩組Waveform算出Ku及Kd的切換係數;
  • 將所有區塊組合起來且如IBIS原始構造般為仿真器所使用。

以下我們就將對這些問題提供解決的方案。

在仿真過程中算出信號切換後已延續至今的時間:

以NgSpice為例,我們可在免費Spice裡的ASRC (Arbitrary SouRCe,即任意源元件)使用函式;而函式的係數之一可以是已開始仿真後至今的絕對時間”time”:

藉由這個時間變數及一些附加元件,我們可以下列步驟算出信號切換後的相對時間:

  1. 首先,我們要能分別出信號的上升(0->1)及下降(1->0)緣,這是因為Ku及Kd在在高態及低態中是不同的。在將緩沖器輸入端的類比信號轉成極短上升/下降時間的數位信號後,我們可用一階微分dv/dt來分出上升下降緣。在此,我們利用一傳輸線來達成微分的目的。其它的選擇包括用Laplace函式在控制源中達成相似的延遲效應。傳輸線的長度是仿真的一個TimeStep且在遠端連有和線相同之特性阻抗以免造成反射。在每一瞬態仿真的TimeStep中,我們可算出傳輸線遠近兩端、在不同時步所造成的電壓差,這便是一階微分。由下圖可見,不同的上升下降緣的信號已可透過此方法加以分別。
  2. 其次,我們在這一階微分後的短暫脈衝乘上ASRC所支援的時間參數,其結果是漸次上升的脈衝。再利用另一傳輸線做為信號閂,我們可做出如“取樣與保持”的效果。做法是在傳輸線的近端輸入遠端當時的信號,因為現在輸入的近端信號在一時步之後(Time Step)也將再度達到遠端,故在循環不息下此一電壓可被保持。當然傳輸線的長度需與仿真中所用的一時步相同且在遠端需連有和線特性阻抗相同的負載以免信號反射。在下圖的上半部中,紅色信號是“取樣與保持”後的結果,當我們以另一時間參數(黃色信號)與紅色信號相減,其結果便是如下半部的信號。。。也就是我們想要得到的結果。這組最終信號在每次輸入信號切換時就會歸零重新計算,而其斜率是一(為橫縱軸都是時間)。要再說明的是因為免費Spice會捨去極小的值,而我們在仿真時的時步大多是1ps即1E-12左右的大小,故欲免其被仿真器所捨去,我們需將其乘上一放大值。此一放大值在下面計算Ku及Kd時需一併列入考慮。

由兩組Waveform算出Ku及Kd的切換係數:

解決算出信號切換後的延續時間之後,我們便可接著算出Ku及Kd以便運用此時間值。這部分的資料已非常多,於下簡列兩則供參考。不論是透過原始IBIS裡的Waveform資料做計算來導出此二切換參數(參考一)抑或是透過其它仿真器來量測此參數(參考二)都可得出結果:

  1. Extraction of Transient Behavioral Model of Digital I/O Buffers from IBIS, Peivand Tehrani et. al, 1996 Electronic Components and Technology Conference.
  2. General K-table Extraction w/ Spice, Bob Ross, IBIS Summit, DesignCon 2015

一般而言,Ku及Kd是兩個未知數,故我們需要有兩組Waveform資料才能在每時間點對其估值。這部分的計算是在離線情況下事先算好的,然後再將結果放在轉出的Spice模型裡。實做的部份四組IV表格參數,即PU/PD/PC/GC均以ASRC透過每兩點間算出的PWL線性直線來做電流輸出;唯因PU/PD有切換系數的關係,它們有較PC/GC更多一點的輸入,即下面的NKUX/NKDX:

NKUX/NKDX的值即是事先算好的KU/KD值,端點1及2即是在第一步驟裡算出的信號切換後的延續時間:

也就是說,我們用這延續時間t來算出相對應的切換系數,而後再乘以原始的PU/PD分支電流。下面的端點5即含有切換係數值:

將所有區塊組合起來且如IBIS原始構造般為仿真器所使用:

有了這些區塊之後,雖然要透過Spice格式將其連起來形成表單是一簡單的工作,但實際操作之後,我們卻發現以此模型仿真的結果在輸入信號切換始末的時間點在輸出端都有很大的雜訊而使得模型無法使用。

細究之下,發現魔鬼藏在細節裡。。。一如我們之前貼文所述,在信號切換的過程中Ku/Kd切換係數也有一“交接”的動作:

也就是說,在低入高態的過程中,PU/PD使用的是上升緣的切換係數,而一旦信號由高轉入低態,它們則改用下降緣的切換係數;這之間一點點的時間誤差,即應當開始使用新係數第一時間點的數值時,若仍在使用上一係數的最後時間點,則雜訊便會產生而使得產出之模型無法使用。在詳細觀察每一信號間的切換順序之後,我們最終能做出一過濾的語法、運用在相同的ASRC裡而得到理想的效果。與商用仿真器對相同IBIS及負載的結果相較之下如下所示:

由圖可見:不論是在輸出端點的電壓、抑或是供電源電流的使用,兩者均極為近似。也就是說,以我們流程所轉出的Spice模型也可供做SSN雜訊分析。兩者信號間些許的遲延並不影響相較的結果,因為此一遲延是一常數且對所有Cycle均相同,故在信號量測或最終眼圖上並不會有任何影響。

在仿真速度上,因為我們加入了兩個長度僅為一時步的傳輸線來做一階微分及取樣保持電路,其亦限制了在實際仿真時的速度,故相較於能直接使用原始IBIS的商用仿真器之下,速度慢得多。當用在佈線後網表的仿真上,變慢的程度則不顯得那麼嚴重。這是因為在佈線後的網表中, 也含有許多傳輸線元件,其中延遲最短者亦一視同仁地對所有仿真器造成時步取用上的限制,當這限制不比一時步長許多時,則由轉出Spice模型所形成的時步限制則顯得更能被接受。

另外一點值得一提的是:以上所示雖只談到電壓Waveform波形的運用,對以IBIS V5.1以上、含Composite Current電源資料的部份其運作情形也是相同的:另一組縮放係數需由ISSO  PU/PD資料事先被計算,而後乘上原始的Composite Current電流再以ASRC的元件以相同的Elapsed Time參數自供電端拉出額外的電流;相同的Elapse Time 分在電壓及電源ASRC中被使用以便達成點對點之間相同的對應關係。

藉由此開發完成的Ibis to Spice轉換流程, 我們可依實際運用需要而將原IBIS模型裡的Ramp或Waveform資料轉出與免費Spice仿真器相容的格式而做分析之用;這個流程已如下所示地內建於我們的SPIBPro模組之中:

 

這篇貼文係為於DesignCon 2016同時舉行之Ibis Summit所準備;我們在這會中宣讀並展示此研究結果。讀者可於下參閱下載相關簡報範例,或至IBIS官網直接下載。

會中所宣讀簡報: [按此] 於外部開啟

相關範例: [請按此下載]

在開源Spice仿真器上使用IBIS模型資料 「之一」

備註:

對此貼文有興趣的讀者或可繼續在 [Part 2] 得到更多相關資訊,並至 [Free Web App] 使用此一模型轉換流程的免費工具。

IBIS to Spice:

系統完整性分析中,大部份的建模流程都專注於由原始設計(Transistor)透過Spice網表格式轉成為IBIS模型。但基於以下數點的考量,我們也常發現相反的建模流程、即從IBIS轉成相對應Spice的函式庫格式 (Subckt library)亦有其存在的價值:

  • 支援開源或免費的仿真器: 網上有數款開源或免費的Spice仿真器, 如 Berkeley 3f5, eispice, ngspice, LTspice 等等。這些仿真器多將重點放在晶片上的BSIM模型或廠家所出產的元件, 如LTSpice的穩壓器(Voltage Regulator)等等;當用在系統分析上時,雖然它們對傳輸線大多也都有相當程度的支援,但對於輸出入用的緩沖器(常以IBIS模型資料形式出線)的支援則是付之闕如。在沒有原始設計的Transistor網表、又不能使用相對應的IBIS模型情況下,這些免費的仿真器就只能束之高閣了。當然若有足夠的經驗及能力,吾人也可編程而直接在這些開源軟體裡加入對IBIS等的直接支援, 但這過程是需要相當時日才能完成的。比起若能直接透過某種流程而能將現有IBIS資料轉成這些Spice也能直接使用的模型而言,後者的所需的工程便小得多。而且若這流程是建於Spice之外,則當工程師有需要快速地做些完整性仿真時,便可運用手上任何一款的相容仿真器而不用另外使用特別編譯的軟體。
  • 讓模型供應商能提供公用的參考資料:IBIS本身雖是業界公用的格式,但其在仿真器內的實際體現則依不同廠家而有不同。在理想情況下,不同的仿真器對同一IBIS模型的運作應會生成近似的結果。為了達成這個目標,IBIS制定委員會也定出了”Golden Waveform”的資料格式以便模型使用者能對所用的仿真器的精確性能有所初步的檢定。實際上,這個”Golden Waveform”並非強制性地需在IBIS模型內提供而許多模型也都對此付之闕如;故而有些模型供應商 、如美光半導體,便轉而提供編碼過的Hspice原始設計網表以做為仿真的參考。如此一來,它的模型使用者便必需要有Hspice才能仿真編碼過的設計。我們認為若能在現有IBIS模型之外,更提供一未編碼Spice網表而且它可透過人人可免費得到的開源Spice來仿真進而得到與IBIS極近似的結果,反而更能體現IBIS在業界是公用格式的精神。
  • 外顯地實現IBIS的運作原理及流程更具教育性及參考價值:網上隨便一找都可以發現很多談到IBIS內部運作原體的論文及簡報。這些內容或可以供大致了解模型運作的過程所需,但魔鬼多藏在細節理,模型實際上多以C/C++編程、實現且運作於仿真器內而非外人所知;我們認為, 若能將這些原理以外顯的方式實際以Spice的格式呈現出來,進而能透過仿真而產出和其它商用軟體極近似的結果,則更富教育意義且具參考價值。
  • 開發流程的考量:仿真器是系統整合分析流程裡重要而不可或缺的一環 (場解器亦如是);做為一分析工具供應商,我們有以下數種選擇以便能在開發的流程裡有仿真器可做運用:1.與市面上已具規模的仿真器供應商合作而要求我們的客戶都必需要有一分License; 2.內部從無到有自行研發; 3.使用現有的開源且有聲望的仿真器。上述選項各有其優缺點且不互斥。對於一新創公司如我們而言,需要在有限的時間及資源內為客戶提供最高CP值的工具,則第三個選項、即使用開源版本並再加以改良、便成為最具吸引力的選擇。

市面上已有數家公司提供Ibis2Spice的流程。它們之中免費的版本多提供到IBIS Ver 2.1的轉換支援。即便是付費的版本也只支援到Ver 3.2。再者,它們所轉出的Spice模型多不能直接在開源Spice上所使用。我們開發的目標是要能支援到Ver 5.1的電流資訊、亦即[ISSO] 及 [Composite Current]等資料的運用以能做SSN的雜訊分析。在含此文第二部分的這兩篇貼文裡,我們將對本公司所開發的Ibis to Spice流程做一簡介。首先會談及的是如何運用IBIS裡的Ramp Rate來轉換出相對應的Spice模型,而後要談及的是更精確的、即運用Waveform data來建立模型。兩者我們都會佐以和其它商用仿真器對同一IBIS模型仿真的結果來證明此流程的可行及結果的精確性。

流程開發的目標:

  • 轉出的模型能直接在開源仿真器、 如Spice3f5 及NgSpice上運作
  • 支援電壓部份的Waveform data (Ver 3.2 andup)及電流部份的Composite current (Ver 5.1  and up)
  • 能與其它的業界所常用仿真器產生極近似的結果。

由IBIS裡的RAMP資訊做IBIS to Spice的模型轉出:

首先我們來看一下現有以RAMP為主的Spice模型轉換,因市面上其它工具所轉出的模型不能在免費Spice上直接使用,在我們的免費工具SPILite裡,我們也已加入類似的功能以便能直接使用NgSpice。這部份的流程主要是將原IBIS模型裡的RAMP資料取出並用於瞬態仿真時。靜態電流部份、即PowerClamp, GroundClamp, PullUp及PullDown的資料則是用免費Spice裡支援的ASRC有源元件來實現。這部份在下一貼裡所將提及的:用IBIS裡的Waveform來轉出Spice模型裡,將做更多的應用。

在網上搜尋Ibis to spice則會找出一篇貼文:IBIS to Spice Translation (part 1), 在此文中,原作者討論了市面上其它工具做Spice模型轉出的工作原理、及他所試圖改進的設計及結果。他也提供了一Awk程序以便能將原始Spice模型在當時的免費Spice裡使用。由於這篇貼文是十多年前所寫,當時很多的觀察在今日均已不再適用。比如說:現今公版的NgSpice已可直接讀入如X+-3.2的語法而毋需再將其轉成X-3.2, 故其Awk程序似已無用武之地。無疑的,由於文中所提之商用工具最後更新似是在1998年,原理圖至今仍未做更動,故就研究其運作原理而言,原貼文還是有其參考價值。

上述貼文的第二部份是如何將利用Ramp資料來運作的原理圖。在網上要找到原文恐怕比第一部份難得多,我便將其重貼於下以省讀者的時間:

原理圖中的主要原件是四個靜態電流元件,即XPWRCLAMP, XGNDCLAMP, XPULLUP 與 XPULLDOWN, 它們是利用Spice裡的ASRC(Arbitrary SouRCe, 即任意源元件)來實現。在Spice的使用手冊裡,我們可看到其語法及功能:

由於Power Clamp(PC)及Ground Clamp(GC)是屬於ESD電路的一部份而始終是有在作用的,故其資料可直接被使用。在實作上是將IBIS裡的IV對應表先轉成每兩點間的線性直線(Piecewise Linear)方程而後輸出電流。以PC為例, 由下圖中可看出端點1,2間的電壓被拿來做查表內插而將算出的電流由端點3,4間來供應。

對於Pull up (PU)及Pull down (PD)分支而言,由於它們是在輸入信號切切換後才漸漸開或關的,故在以原理圖中是以在左上部份的C1及RB3所供應的RC充放電常數來完成此開或關的目的。在瞬態仿真中,此RC參數先被RAMP的值設定於分母的部份, 而後將乘上由PU等所提供的原始值,最後再以G控制源元件(VCCS,電壓控制電流源)來將電流輸出。

在原貼文裡,原作者也提及他曾試著直接以其它方式來取代以此RC來做PU/PD電流切換的方式但效果不彰。我們認為其中可能的原因是因為PU/PD供應電流值是有瞬態時間因素的,即它們不是馬上就如PC或GC般全開或全關的,故若少了這“漸漸打開/關閉”的運作,則輸出電壓會很不平滑而可能造成仿真不收歛。而且就算收歛,結果也不會準確。也就是說,一般輸出緩沖器裡場效體(MOSFET)通道裡的載子有其一定的速度,故其開或關的時序不會在瞬間完成。

透過這種由RC方式的開關模擬,來仿真由IBIS轉出的Spice模型,再與其它商用仿真器對同一IBIS模型在相同負載情況下仿真結果相比較,我們可看出其結果算是相當接近的。但這相近僅止於PAD或PIN點的電壓部份。當測量其對供應電壓源所使用的電流,則可發現兩者相去甚遠。也就是說:這種Spice模型只能做理想供壓情況下的信號完整性分析而不能拿來將SSN列入考量。其次,上升/下降的曲線會呈現出如RC充放電般的曲線而非直線性。對於仿真速度而言,因為這種實作的設計相對簡單,故可很快地完成仿真。。與直接使用IBIS的商用仿真器相較之下並不會慢太多。最後要再說明的是:不像IBIS模型裡各種Typ/Min/Max的資料都在同一表格內;當要將某一IBIS裡的模型轉出做Spice仿真時,欲使用之不同的Typ/Min/Max Corner均需分別地各自先被做轉換。

這篇貼文係為於DesignCon 2016同時舉行之Ibis Summit所準備;我們在這會中宣讀並展示此研究結果。讀者請繼續參閱「之二」之貼文並可在那下載相關文檔及範例。

IBIS模型: IBIS模型的資料在仿真時是如何被運用的

*緩沖器模型:IBIS模型是如何組成的
IBISType

IBIS規格裡定義了不同類型的緩沖器,不同類型對於模型裡的構成資料即有不同的要求。一般而言,IBIS模型一般有下列的模型資料/對應表:

  • 環境設置:及這模型建模的環境為何, 一般包括了理想電壓及操作溫度的資訊等。
  • 負載情況:如C_COMP:伴隨電容及各截取各瞬態波型時緩沖器的測試負載等等。
  • I/V:電源/電壓的穩態曲線,通常包括了Pull-up(PU):上拉穩態曲線、Pull-down(PD):下拉穩態曲線、GND Clamp (GC):地箝位曲線及Power Clamp(PC): 電源箝位曲線等。這些曲線可視為對上拉下拉電路通道上非線性電阻的描述。
    要注意的是這些曲線的掃描範圍在規格上是要求要由-Vcc至2Vcc (Vcc是理想的供電電壓), 之所以如此是因為在無耗損傳輸的情況下,若接收端因完全開路或完全閟路而造成全反射,則全反射的Vcc振幅再加在原0~Vcc的工作範圍就會有-Vcc至2Vcc間的可能。另一要注意的是對於上拉型電路、如PU和PC, 其電壓波形相對應是是理想電壓Vcc值而非對地。也就是說:在這些波形裡的V=0實際上是V=0 to Vcc即V=Vcc的。有時在除錯的情況下,要把這值轉換過來才不易出錯。SPISim IBIS模組BPro的模型查驗界面就有直接將對應Vcc轉成Vss/Gnd的按鈕可使用。IBISPUPD
    IBISPCGC
  • ISSO PU/PD:這曲線描述了在非理想供應電壓及接地電壓情況時,緩沖器輸出電流的變化。當分析電路含有電源供應電路(Power delivery network)時,必需要有這些資訊才能對電源完整性的影響做出評估。一般而言,當供電端電壓下降或接地端電壓上升時, 橫跨場效體的端點電壓差會減少而使的輸出強度變弱,這即使所謂的閘道調變效應(Gate modulation effect);所以ISSO PU/PD定義了端點電壓在非理想值時,輸出有效電流的變化。IBISVT
  • V/T:這曲線描述了緩沖器切換後瞬態的輸出電壓;在不同的測試設置中(不同的外接測試阻抗及測試電壓),所產生節VT波形會不同;在稍後會細述的運作過理論可看到,一般的IBIS緩沖器應都至少含有兩組在不同測試設置下所產生的VT波形。這些測試情況需涵括了在現實情況下這被建構的IBIS模型會運作的環境。IBISIT
  • I/T:這曲線描述了緩沖器切換後瞬態的取用電流;亦是IBIS5.0(含)之後才有的關鍵字。這波形裡的橫軸的時域變量和上面的VT裡的時域是同一時間點。也就是說, 這IT曲線的資料用以在VT波形裡的同一瞬間點自電源拉出相對應的電流。這”組合電流”(IBIS關鍵字是Composite Current)大致上包含了下面幾種電流成分(詳細請見IBIS Spec.):旁路電流、前級驅動電流、切換電流及端點阻抗電流。

* IBIS模型是如何運作的:
那這些IBIS模型裡IV/IT/VT的波形資訊又是如何在仿真器裡運用的呢? 為簡化起見, 讓我們先不管靜電保護電路(ESD)的PC/GC電路部份,它們在大多數的操作情形都是在反向偏壓區而有極小的漏電電流。對於主要的上拉(PU)及下拉(PD)電路而言,我們可以把它們看做是非線性電阻; 就好比是場效體的P/N通道般,其電阻值隨著端電電壓值而改變。這兩組電路之相互同時運作,便決定了在不同輸出負載情況下的緩沖器的瞬態反應 VT及IT。
IBISKuKd0
在瞬態的上升期間,上拉電路PU可視為由完全斷路變成到完全通路,而下拉電路是由完全通路而變成完全斷路。由於接到地線間的通路成為斷路而造成輸出電壓的升高到邏輯1態。瞬態的下降期間則是相反地運作。於是吾人可定義一”切換係數(Ku(t), Kd(t))”…來相乘到對應的PU/PD電流的輸出。這切換係數的X變數是時域的…即像VT/IT裡的時域變數般。Ku(t)=1表示PU完全通路。反之,Kd(t)=0表示PD完全斷路。這Ku(t)及Kd(t)的組合即可用以說明VT/IT的相對應變化情形。

為著這Ku(t)及Kd(t)的兩個變數,我們也需要有兩組方程式才能對其求解。假設IBIS模型裡有至少兩組的VT波形及其負載測試情況, 則我們恰用這兩組資料來對Ku(t)及Kd(t)進行求解。因為Ku(t)及Kd(t)只和緩沖器裡的場效體切換的經過時間有關、而和其負載無關,所以我們恰可用兩組方程來得到Ku(t)及Kd(t)的真解。這也就是為什麼一般的IBIS模型裡需要至少有兩組的VT波形原因了。
IBISKuKd1

實務上而言,若欲求兩組波形而不可得,則仿真器也可做另一假設:即在每一時間點都滿足Ku(t) + Kd(t) = 1。大體上而言,這組假設在緩沖器的穩態高電位或穩態低電位輸出時是成立的,但在其間的瞬態轉換期間則未必。另一種可能是仿真器也可用IBIS模型裡的斜率(Ramp rate)資料來形成假設的上升/下降VT波形, 以達到能對切換係數求解的目的。
IBISKuKd2
在這架構之下,為求精確起見,所有有關的支流電流最後也都要加入方程式裡,如此解得的切換係數才算精確。這些後來才加上的支流電流包括了常在反向偏壓的ESD電路PC/GC,以及會通過伴隨電容C_COMP的電流等等。比如我們可用I=C_Comp * dV/dt來算出流過伴隨電容的電流且將其自總輸出電流中減去,才不會在日後模型的仿真時造成重算(double counting)的情形。

IBISCComp
最後, 在IBIS 5.0之後的、含電源完整性資訊的、IBIS模型而言,另一組瞬態端點電壓相關的係數也要再加上去。如此,因為閘道調變效應而使得緩沖器輸出變弱的因素才能被列入考量。

以上所簡述的操作細節,讀者若有興趣,可參閱下列的原學術論文: