仿真器之研發:架構

在系統電氣性分析上,有效的方法及流程都必需建構在一定堅實的基礎之上,這“基礎科技”大致上包括了二維或三維場解器、仿真器及能依統計方法來演算出眼圖或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模型資料 「問答」

上週在IBIS summit of 2016 DesignCon會中,我們宣讀並分享了最近開發”Ibis to Spice”流程的經驗,反應相當熱烈;在這篇貼文裡,我們集錄在宣讀末之問答階段所提的問題及討論,以供未能有機會親身參與讀者之參考。

  • 問:免費版仿真器裡有IBIS parser嗎?
    • 答: 沒有。據我所知的免費仿真器裡都沒有IBIS parser, 更有甚者,它們在寫此貼文的同時跟本就不支援IBIS元件。話雖如此, 有興趣的讀者不妨參考也是開源的pyIbis看有否可利用之處;再者,跟據IBIS官網,只要花約美金兩千五就可拿到公版Ibis Parser的源碼來做商品化的使用。我們(使必信科技)本身是有跨平台的IBIS Parser以在程式及此流程裡直接使用。
  • 問:我在Berkeley Spice3f5的手冊裡沒有看到有ASRC元件?
    • 答: 請參考NgSpice; 免費仿真器、諸如NgSpice, EiSpice, LTSpice及TISpice都是由Berkeley Spice的原碼所加以衍伸改進而成,故雖在文件語法上或有些許不同,但我們所舉出的理論應都只要做微幅的語法改變就可在這些仿真器上運作。
  • 問:所提供的範例是否只適用於上升及下降波形為對稱的情形?
    • 答:並不是這樣的。我們所提供的範例之初便有一段是將輸入的類比波形轉換成數位信號的設定。這轉換是透過偵測穿越某一臨界電壓值而達成的;一旦轉成數位信號, 其上升及下降沿的維時便很短, 故與波型是否對稱、或 Duty Cycle是否是50%無關。
  • 問:所提供的範例是否適用於超頻的情況?
    • 答:在IBIS的官方規格文件裡,並未對在超頻情況下仿真器該如何運作來做規範;故在超頻的情況,不同的仿真器就很有可能會有不同的輸出結果。理想上,吾人應設計模型運作使其在超頻的情況下輸入、輸出電流都能保持連續性;也就是造成的節點電壓也會連續而不會有突波的情況發生。我相信這種機制是有可能外加於現有的範例而達到的。。。比如說利用電容來和緩波形等等;在所提供的範例裡,目前並沒有這種機制來支援超頻的情形。
  • 問:如果我對轉出的模型仿真相當長的時間、比如說一微秒,會有問題嗎?
    • 答:在實作做程中,我們發現如果ASRC的變數值很小。。。比如說像我們仿真時時步的ps(1E-12)的程度,則仿真器會將其捨去而造成結果的不正確。這也就是為什麼我們需事先將此值及相對應的切換參數Ku/Kd都予以放大的原因。若以一奈秒1ns為基準,則1ps及1us相對應的值是1E-3及1E3倍。。。都不是太大或太小,仿真器也應就不會將其捨去。所以我想這種情況下、即使進行一微秒的仿真,也應該不會有任何問題。
  • 問:為什麼會需要用到傳輸線? 仿真器裡不是都有各節點的記錄嗎?
    • 答:的確一般在仿真器的內部,都會有一個陣列來儲存各節點過去幾時步的電壓資料;所以比如說如說編程者決定用Trapezoidal rule來算一階導數的話,也都能在那裡找到前兩時步的資料。但我們這裡的建模完全是使用現有Spice的語法及元件來完成,也就是說,我們無法透過C/C++等來存取仿真器內部的陣列資料。如果有需要前數點的資料的話,料想的做法是用數段無損T-Element 元件串列起來,則在每兩段線中間連接的節點,都可取到幾個時步前的電壓值。就是說:藉由串連兩段傳輸線,吾人應就可找到前一及前二時步的值而加以運用。
  • 問:為什麼會需要微調來避免突波?轉換係數不是應都已達到穩態了嗎?
    • 答:理論上的確是如此。在未超頻的情況下,一般在做另一向的波形變換之前(比如說開始上升或下降),Buffer應都已達到穩態值。也就是說,KU應是達到1.0值而使pull-up branch能全力供應電流而KD於此同時是0.0使得下拉的pull-down是呈開路的情況。我們之所以需有微調的部份完全是因為在此我們是利用Spice現有的元件來組成這模型的,而非是理論上的需要。有興趣的讀者不妨可Comment掉所提供範例裡微調的部份便可發現突波的出現。若有其它更好可濾此突波的方法,也煩請留言告知或分享。
  • 問:您下一步打算做些什麼改進?
    • 答:我們打算繼續向在以免費仿真器上提供系統分析能力的目標前進。以NgSpice為例, 若要在其它加入如IBIS等新元件的支援,一般有三種途徑:
      1. 直接加入仿真器內部做成如R/L/C般之原生元件:這個方法開發者需對仿真器內部的資料結構、運作流程甚至是仿真的原理都有相當的知識;如果成功的話仿真速度將會最快,但也會需要較久的時間來開發。一般是得用C/C++語言來進行編程。
      2. 透過Code-Model的延伸方法來加入:同樣得用C/C++來編程,但因為透過的是XSpice的延伸方式,並不需要去動到基本的仿真器架構及源碼;所開發出來的Code-Model是動態函式庫的模式,故可直接被現有的公版仿真器所使用;唯在開發及偵錯的過程可能較為麻煩。。因得先attach到在進行中的執行緒。不過這是開發者需要傷神。。。使用者則不用去碰到處理這種問題。
      3. 用ASRC元件在仿真器外建模:這就是我們這幾篇貼文所提到的理論及方法;雖是可行,但只能做驗證用,因為仿真起來速度有其限制。

現在公版的NgSpice裡,尚付之闕如的是:IBIS, W-element及S-參數的元件,有了這些元件的支援,吾人便可用其做很多系統上的仿真及分析。我們打算在接下來的時間以上述途徑“2”(Code-Model)的方式來加入對這些元件的原生支援。

在開源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所準備;我們在這會中宣讀並展示此研究結果。讀者請繼續參閱「之二」之貼文並可在那下載相關文檔及範例。