簡單快速的IBIS建模流程

對於新上手的建模工程師而言, “IBIS CookBook” [連結按此]提供了極佳的入門參考資料;最近的V4.0版本是在十幾年前的2005年出版的, 時至今日, 雖然其中所描述的大部份程序仍屬有效, 但也有許多其它部份或顯得繁瑣或未盡詳述。這些缺點在第四章”差分建模”的部份尤其特別明顯; 更有甚者, 近年來IBIS峰會上發表的文章大多是圍繞著新IBIS科技諸如IBIS-AMI等打轉, 對於傳統IBIS類比模型的部份著墨就相對少得多。在這篇貼文裡, 我打算首先替讀者重溫一下CookBook裡所談到的正式流程, 而後對其間的一些較具挑戰性的部份加以說明, 並以此倡議一個較為簡化又不失精確的建模方案, 最後提出一些正反意見讓讀者參考。

IBIS 模型組成元件:

在IBIS V3.2中所定義的最基本組成元件如上所示; 對於一個輸出BUFFER來說一般至少要有六個資料表: 即IV資料如Pull-up 及Pull-down, 及兩組不同負載情況下的VT資料(Rising/Falling各一); 若是輸入態的IBIS模型, Clamp的IV資料或也要, 而IBIS V5.1又加入了新的IT需求並以ISSO PU/PD及Composite Current等來描述電源供應網路PDN的效應。要為一IBIS模型建模, 一開始便需對這些各別表格所表述的電路部份加以驅動以激發得到相對的響應; 有了仿真的資料後便做後處理以產生出如SPEC規定的表格等的格式才能加以使用。由於一個模型通常也有TYP/MIN/MAX三種組態,所以實際上需要仿真的次數便是上述的六(個表格)再乘以三(種組態)而至少達十八個之多。

我們以下列摘要的方式再對包含於上面圖形但未為即將倡議的新建模流程所觸及到的部分加以簡述:

  • 封裝的寄生元件: IBIS CookBook裡並未談到這個部份, 一般來說buffer的封裝模型(package model)是由諸如HFSS或Q3D等套裝軟體由實際設計透過三維場解來算出來的, 其格式可為S參數或相對應的Spice等效電路; 一個IBIS模型可以用 Lumped R+L+C來對單一的針腳PIN來描述其寄生效應。或者也可把此lump值放在 “Package” 部份來套用到所有的針腳;需要更精確的描述的話則可用如下有樹狀結構的[Package Model]語法來描述。不論如何, 這些都是三維場解軟體所可以生成的而不在一般IBIS建模流程的討論範圍之內。
  • C_Comp: 在IBIS剛制定之初, C_Comp只用一介於PAD及地點間的單一值來描述頻率性的負載; 後來HSPCIE等發明了一些語法來把這單一值打散並分到PAD與各個不同的電源端點間; 又到最近IBIS Spec.便納入了這些語法而成為標準的一部份;話雖如此, 一般建模人員從網上仍可能只會發現單一的C_Comp值是如何算出來的。簡單地說, 其不外乎是透過時域的仿真以RC的充放電常數來得值、抑或是由頻域的虛部電流除以頻率來得到電容值。至於之後如何把這單一值分開來以便更佳描述如下的頻域二維表面則得仍由各人發揮所長(意即:cookbook裡根本沒說)。最後, 這個C_Comp值的效應在建模的過程裡是看不到的, 唯有在信號從另端因阻抗不匹配的緣故反射回來後才能看到這C_Comp值所造成的影響。凡此種種, 我們發現一般上此buffer的IC設計師比透過上述的時域/頻域仿真所算出的C_Comp值了解得更精確, 也就是說常常問他們就可得到大概的估值。
  • Clamp 電流: Power/Ground Clamp的電流和Pull-up/Pull-down的電流都是在穩態下得到的, 在仿真時這四者也是一同拿來做load-line的計算的;所不同處, 因為clamp所表示的是ESD的保護電路故其為總是存在 (always on), 當這兩組表格存在時, 為避免其又被在PU/PD表格裡又再被算一次 (double counting), 在做後處理時需把這部份自後者中移除。若要簡化這個麻煩, 其實一個有IO功能的buffer 在被拿來做輸出buffer使用時便可直接以output type buffer來建模而非io type buffer而可略過此一部份。

 

  • IT 電流(Power aware): 這些是為了描述buffer 在非理想供電或接地情況下的運作而需加入的資料, 其應用則主要用在如DDR DQ的單端點模型裡, 因為它們對PDN的擾動所造成的時間影響最為敏感。對於諸如SERDES的差分模型而言, 因為在P及N點的輸出端會被PDN同樣的影響, 在相減之下效應就抵消了, 所以影響很小而未必有此需要。最後, IT在瞬態的部份其實是和VT一同仿真的, 其只是在PAD端加上一個電流的Probe便可取得相對應的資料, 而且這IT和VT的各點間是需同步的, 所以只要在同一仿真裡就可完成。

完整IBIS建模流程:

本司的BPro軟體已將於上述IBIS cookbook裡所建議的建模程序標準化而總結如下, 其有從0~7的八個步驟:

  • 0, 搜集原始設計相關的資訊: 這包括了(PVT即製程、電壓、溫度)、矽智財、Buffer端點的偏壓及設定等等。一般的buffer設計都會預留許多腳位以便為日後調控所需, 因為一個IBIS的corner有TYP, MIN, MAX三種, 故建模者也得先決定那些組合的腳位設定對映到那種corner;
  • 1, 準備工作的環境: 即工作目錄;
  • 2, 產生仿真的網表: 即驅動不同buffer的組成部件及其仿真時的設定; 如前所述, 以一般的buffer來說, 最少就有十八個網表得在步驟末生成;
  • 3, 進行仿真: 一般可在建模流程軟體內依序地仿真或將所有的網表散到不同的機器上(simulation farm)同時並行;結果出來之後得檢查一下看是否有誤, 若然則得回到一開始的地方檢查看是連接有誤或偏壓不對, 不做修正就繼續往下走就會變成”垃圾進、垃圾出”..產生的模型一定有誤。
  • 4, 產生IBIS模型: 後處理由前一步所產生的仿真資料以產生IBIS模型。這裡面的計算或調整往往就是諸如本司建模軟體的精華所在, 很多步驟是可以用手動或人工去進行、但往往容易出錯又曠日廢時。
  • 5, 語法檢查: 一有了模型之後, 最基本的驗證是用golden checker進行語法檢查, 它也會對dc電位等做基本的測試; 若一模型有根本上的錯誤(比如說vt波型是平的), 在這一步就可以檢查出來;
  • 6, 用模型做仿真上的驗證: 把產出的IBIS模型連到 test load上進行仿真以便第三步由矽智財仿真出的結果相較, 理想的情況下, 除了信號從進去到能見於pad的Tco有別之外, 在波型上應是要能完全重合的;
  • 7, 產生報告: 建模者最後往往需將諸如PU/PD阻抗及slew rate等的模型參數列出來, 以便和data sheet相較或者做為模型報告的一部份。

本司BPro裡的完整建模流程

單端建模資料之轉出:

對於單端點的IBIS建模而言, 上述建模流程的第一個具挑戰性的地方是要能把十八個不同仿真的網表都建出來且順利仿真完成且結果無誤:

這裡面可能出現的問題很多在於DC IV的仿真部份: 很多的IC BUFFER設計裡都有clocking的信號, 這使得真正的dc掃描從-Vcc到2Vcc變得不可能而必需透過如pseudo transient的方式來進行, 其次, 若設計是於佈線後(post layout)的階段轉出來的則各個電路點之間會有一些寄生元件, 另一種情況是雖然我們只針對IO的buffer部份建模, 但電路是他人所設計而不是很容易把前級的部份和只有IO的部份分開來而最後必需一起仿真, 凡此種種, 都會使得仿真的時間變得冗長甚或是有時無法收歛。其結果是上述0~7的流程得從中間往返走上好幾回、每次調參數或除錯而終得費上好一番功夫才能得到所有建模需要的資料。以上雖繁瑣,但由於也就不過是那十八個網表, 所以大致上應該問題都能解決。

差分建模資料之轉出:

差分建模的複雜性就又比單端點的情況多上一個維度了(不只是多了一倍哦, 是多了一個dimension!) 首先, 依據IBIS規格…就像每一個IC的data sheet裡所呈現的一樣… 一個針腳只能連到一個buffer, 而不同針腳之間的連接是有很高的限制; 就差分模型而言, 一個series element能如下所示地用來描述p及n反相針腳間的相互情況。(本段落所用的圖型都出自於ibis cookbook第四章裡, 所以有興趣更深入了解的讀者可以按圖索驥以得到原始的描述)

為了能建構出這麼一個series model, 就必需分就p及n輸出端點間做二維的dc掃描; 而且兩者的資料精度必需相近..也就是說如果就單端建模的p點iv曲線我們有一百點的資料, 則同樣在n點的維度上, 為了也要能得到一百個取樣點, 我們就得對一百個網表進行仿真;就三個corner來說, 就有三百個仿真要跑。這一dc iv掃描步驟的最終結果是一個能描述p及n點間dc相互關係如下所示的二維曲面; 唯有看到這二維曲面的形狀為何, 我們才能決定那個series element內有那些次組成元件(其可以是一或更多的R, RL, RLC, 非線性電阻或是一整個非線性平面), 而其中要能產生這二維平面所需先進行的處理步驟之一也包括了要能將同模的電流自P及N點間消去, 凡此種種皆算是第一道的難關。

第二道的關卡在於VT的仿真部份, 由上述的曲面建構出series model 之後, 我們要能在VT瞬態仿真時將其消除才能不被算了兩次 (double count); 對於一個spice 仿真器而言, 大部份的情況其都不允許負電阻、負電容等的存在, 也就是說, 它們會把這些負值元件看做是用戶的輸入錯誤而不讓仿真繼續進行, 解決之道, 吾人可以用如本司在2016年Asian IBIS Summit所展演的Verilog-A 電路或是仿真器大都會提供的控制電源來達成這種”負電阻”似的消去目的;即便是如此, 在Verilog-A的解決方案上, look-up table上每個grid的大小係由iv二維描描所決定, 而控制電源的解決方案上, 為了要能算出適當的控制電源參數, 建模者還得利用最佳化的原理才能算出何種組合的參數最能描述上一步算出的反應曲面; 而這些不論是表格或是參數變化間的圓滑性(smoothness), 也都更進一步地決定了仿真的收斂性。凡此種種情況,難怪cook-book裡描述此段的部份(見下圖描述的前兩行)作者只是輕輕一語帶過而不做詳述, 因為真的是說得比做得還簡單啊。

由於這兩大關卡及之間種種藏在細節裡的魔鬼, 我們發現差分的建模對一般的建模者而言不是那麼地簡單。讓我們更有此感悟的情況是: 當本司在提供建模服務時, 很多情況建模的仿真或因IP的考量、或因對原始設計的熟悉情況所限, 往往是由客戶所進行的, 我們雖已盡己所能地把這些該如何設定及其原理為何做最詳盡的描述,但在客戶端仍常常碰到問題或反應意見說要很久的時間才能得到所有需要的資料, 其次, 客戶之所以把建模工作交給本司就是不願去淌這混水…如果很多麻煩的地方仍得自己來過,那建模外包又有何益? 所以就本司而言, 對於去找出更快速有效的建模方式, 其實是都持續不斷地在進行的。如果我們建模的目的是為了能跑Channel Simulation (而非萬能地又做穩能又做時域依真), 也就是說如果了解模型的運用是在某種特於的環境之下, 那是否有更好(尤其是差分)的建模方案呢?

簡單快速的新建模流程:

之前的貼文中, 我們提到了IBIS模型內部的資料在仿真時是如何被運用的; 簡單地說, VT的資料在得到波型一樣的負載情況下, 是做為一個目標(target)的; 在此”目標”之下, IV的部份則會被拿來算出一組時變的切換參數以便使適量的電流能自PAD點輸入或流出, 基於KCL/KVL的考量, 這適量的電流就會造成仿真矩陣運算時節點的適當電壓而終能符於VT的曲線; 其次, 由於分有Pull-up及Pull-down的切換參數要解, 所以就得有在不同負載情況下的VT曲線才能由兩組資料解出兩組未知;這也就是說, 其時IV的資料和算出的切換參數是互為表裡的, 做為表面、看得到的IV部份需由看不到的參數來配合, 如果IV某電壓點的值小些,則用到那電壓點的某個時步上的切換參數值就得大些才能使最終電流維持不變。從這點來看, 待算出的切換參數可以視做是IV曲線的加權或調整參數。

在另一方面, 每一組的VT曲線裡也內含了對IV曲線一些部份的限制, 在這些限制之下, 兩者之間(即VT及IV)必需要相符否則就會有dc mismatch的錯誤情況發生。最後, IV本身的資料限制是只能有最多一百個點且其間必需單調性的遞增或遞減否則就易在仿真時產生不收歛的情況(stuck-at local minimum)。這些都隱喻了模型裡各個資料間的相互關連性。

由上所述, 我們可以推出一個簡單快速的建模法所需的資料產生步驟為:

  • 將原始silicon設計連到相對應的PVT及偏壓情況下後得到VT仿真資料, 而這VT是如此設定的:
    • 就單端點模型而言, 僅用兩組不同的負載情況(test load)
    • 就差分模型而言, 先做一般使用狀況下(比如說是一百Ohms的輸出差分電阻)的仿真, 得到電壓介在V1及V2之間
      • 設V3=(V1+V2)/2, 以V3為VFixture, RFixture=比如說是40及60, 分做兩次仿真並以此為資料VT波型;
      • 或者用RFixture=50, VFixture分為(V3+V1)/2及(V3+V2)/2並進行仿真, 以此為資料波型;
      • 這一步驟的主要目的是要取得能內含正常運作情況下的兩組波型;
  • 由IC設計師那兒得到C_COMP值;
  • 得到不同Corner的電壓及溫度等參數。

就這樣,再透過不足外為人道也的數學運算及解析, 我們就能透過最少的仿真步驟而產生IBIS模型, 且這模型不會有語法錯誤又能在相同負載情況下重現上述所提供的兩組VT資料。

我們雖不能詳述這中間倒底是怎麼做的, 但可以分享的是在我們的BPRO上,如此的流程僅需填值到如下的GUI裡就可在幾秒之內產生出來, 過去這大半年來,我們已用此法建出許多為客戶所用的模型, 跑起來亳無問題!

優缺點及限制:

我們運用此法建模的使用場景主要是含有IBIS-AMI的差分模型且用於channel simulation情況下, 以此來看, 如此倡議的快速建模法會有如下的優缺點:

優點:

  • 只要透過最少的仿真(即兩組VT仿真), 便能得到建模所需的資料;
  • 就數學及電路分析上會絕對正確, 故而不會有如DC mismatch或monotonic等的語法問題, 在驗證時相同負載的VT結果一定能重現原始資料的波型。

缺點:

  • 如果把這IBIS模型拿來做DC仿真/掃描的話結果未必會精確, 因為模型內的IV資料點是用演算法算出來而不是真的一步一腳印透過DC掃出來的;
  • 沒有”disable”或”high-z” 的state, 因為所有的clamp電流都已內含在算出的pu/pd IV曲線中;
  • 不能拿來做Power-Aware的仿真之用, 因為其中並無ISSO_PU/PD, Composite Current等的資料。

結語:

在這篇貼文裡, 我們首先重溫了在官版cookbook裡傳統IBIS的建模方式及流程, 而後談及了這流程中可能會遇到的困難…尤其是差分建模的部份; 以次我們提出了一個”簡單又快速”的建模方式….其運用了數學的演算來人工合成出模型的部份資料, 這倡議的方式僅用最少的仿真便可建出有效無誤的模型。它有些使用場景上的限制…比如說沒有High-Z State且不能拿來做power-aware的DDR仿真等。我們研發此法的主要運用是含有IBIS-AMI的channel analysis, 以過去大半年的使用來看可驗證其有效及方便性, 因此我們在近日的SPIBPro更新裡也加入了此一功能以使我們的軟體用戶也能同享此快速建模法所帶來的好處。

電源完整性之最佳化:設計合成及解耦電容之選擇

Status

在系統分析中,電源完整性的部分一般可分為佈線前及佈線後兩種情況,至於電源完整性, 因需由佈線後的設計來算出供電網路(power delivery network, or PDN)的模型來分析, 而這些佈線一般是由佈線工程師透過軟體手動製成,PDN的計算也多需透過費時的3D場解, 故在優化的過程上, 就與其在信號完整性(簡介於前兩篇貼文)不甚相同。

電源完整性: 

Power delivery model

電源完整性的目的在於能將電力透過PDN來”乾淨”(即無雜訊)地傳到最右邊的裸晶部份(die), 以透過有源元件(driver 及 receiver)對系統進(即通訊通道)行操作, 以上為PDN的簡易模型,PDN從最左邊的穩壓器, 經過包含主機板、晶片封裝、終至於最右邊的裸晶;這中間的連接因為種種的阻抗, 會造供應電流在流過其中時形成壓降及漣波(ripple);這些供應DIE的電流最終是由最左邉的穩壓器所提供, 但中間的種種解耦電容(decoupling capacitors)也會在運作間儲能而與穩壓器一起提供瞬態電流。由於不同數目及在不同工作區間的buffer切換運作,整體的工作電流也會隨之變化而使得漣波的情形更加顯著。也正由於這壓降及漣波,使得連到DIE上的buffer驅動強度及速率會形成變化及顫動(jitter); 故欲達電源完整性, 就非得對在最右側裸晶DIE的部份能有的、含漣波在內的壓降做一規格上的限制。

一般而言, 這PDN上的阻抗可分為電阻性及電感性兩種成分;電阻性的壓降是用歐姆定律般而正比於通過其上的電流, 而電感性的壓降則歸因於電流在時域上的改變(di/dt), 故欲減低後者的影響, 就得減少PDN上的有效電感;一般減低的方式是在安排不同值的解耦電容使其在不同頻域上能發揮作用, 終至在工作頻寬的範圍內有均有較低的阻抗。

也正由於這PDN的模型是佈線後的結果,故而無法如給spice做仿真的網表(netlist)一樣,直接或簡易地產生由不同參數形成的設計; 而解耦電容一般也是由第三方廠家所提供(e.g. Murata), 所以工程師也在設計過程中也得面臨如何安置及選值的問題。一般而言,電源完整性的分析包括下面兩個項目:

  • 封裝疊層、電源性通孔的安排及腳位輸出等(pin out)
  • 解耦策略(僅能使用land side cap, die side cap或兩者)、電容值、數目及安排位置等

透過合成設計來優化:

PDN 的佈線是透過3D場解來分析, 故若吾人能透過一事先計劃的規則而很快的透過軟體或AI合成的方式來產生多種不同參數的佈線, 則設計週期就能大大地縮短。其次, 以此產生的多種設計也可透過批次的方式(batch mode)平行地或依序做場解而在不費人工的情況下很快地得到不同設計的結果,透過對這些結果來做分析便可間接達成優化的效果。

antenna

以上面的晶片上天線設計為例, 設計雖有不同, 但幾何關係可以利用不同的參數來界定出來, 從而軟體就可針對這些參數來直接合成不同參數及形狀的天線;相較之下, 若是由佈線工程師一點一點地畫出這些天線, 則不儘煩瑣耗時也不易精確。對於PD設計而言,其佈線當然不像天線設計般是以單一元件為主及簡單, 但同樣的精神仍是可以套用。透過最佳實作規範(best practice)及以往設計的經驗而將合成規則或指令設計於軟體內, 則其可達成如下自動化項目:

  • 修改疊層厚度、界質係數(e.g. permittivity, loss tangent)等;
  • 於特定的疊層上、依據net name或其相對於某一晶片腳位的位置自動地產生pin, node, trace, shape生等
  • 依某種樣式產生power via並自動連到power/ground plane or nets, 其間自動地產生void及使用指定的pad stack
  • 對特定區域的設計進行複製、轉向或縮方再以陣列形式產生於晶片上的其它位置
  • 在這些產生的過程中做DRC並產生相對應的資訊(如警告等等)

由於合成的結果是透過特定的3D場解來分析, 故上述的流程一般是針對此一場解器所特別編程的, 也由於不同佈線格式對設計物件(pin, node, via, trace, shape 等等有不同的資料結構及語法, 故這類的流程要廣義化到能適用所有場解器是較為困難的。無疑地, 一旦這種合成流程建置完成, 透過參數性的分析來合成不同的設計再加以比較就不再是問題,也就更能產生優化的設計。

解耦分析:

一旦解耦策略形成後(即決定是Land side cap, Die side cap或兩者), 則接下來的工作便是依此形成佈線,3D場解後分析不同可能解耦電容組合的效果。假設事先不安置任何解耦電容,則場解出來的S參數可看作是”中性的”(neutral)而可透過後置處理的方式針對不同解耦組合用同一個S-參數很快地做分析。也就是說:如果疊層及佈線沒有改變, 是不需要再為不同解耦電容的安排重做3D場解的。

CapEff

如上圖所示, 不同解耦電容的安排下從裸晶(DIE)上看進去的輸入阻抗也就不同, 概念上, 吾人可以把現有的S參數放到如SPICE的仿真器裡來對不同解耦電容的安排做頻域上的分析來得到輸入阻抗, 實務上, 這種仿真是沒有必要的… 因為可透過S參數的數學計算(如轉成Y或Z參數再將電容模型頻域上的響應一起含括便可很快地直接得到下列相關的解耦安排資訊:

  • PDN的輸入阻抗(包含電阻性及電感性的):Lac
  • 不同解耦電容在不同頻域上供應電流的能力:ZIAC
  • 從DIE看入的輸入阻抗:Zf
  • 電容有效性分析, 即若將某一解耦電容拔除,其對DIE埠輸入阻抗會造成的影響:ZFCIF
  • 不同解耦安排的假設性分析: 由於上述的分析均在很短的時間內可以完成,故而就能對不同解耦電容的安排(位置、數目及電容值乃至於其價格等)做假設性分析並依此而達到優化的目的。

 

信號/電源完整性之最佳化:系統性分析

在前一則貼文中, 我們提到若欲找到”一個“方案時, 線性的假設性分析是一個不錯的優化方式。然而當我們要把更多的設計變數放在一起通盤考量來對更大的解答空間裡求最佳化時, 則必需要有更系統性的、而非挑一兩個變數在固定其它變量於一常數值、的優化程序。

反應曲面模型( Response surface model,  RSM):

在下圖中, 系統輸出Y1, Y2等同時含有可控制變量X及不受控變量Z; 在其它如晶片設計或晶圓廠裡,諸如不可預測的宇宙射線等對載體的影響便可歸類於這些不受控變數;但在透過仿真來得到輸出結果的整合性分析裡, 過程與結果都是確定性(deterministic)的; 也就是說只要輸入情況一樣, 輸出結果每次也都會相同, 所以這些不受控變數Z便可忽略不計; 我們可以把這種輸入轉成輸出的關係看做是一個具有多維空間的反應曲面, 在這曲面上找頂點或最低點便是最佳化的過程。

doersm

這種輸出入間的對應一般稱為”反應曲面模型” (response surface model, or RSM), 透過在解答間裡的諸多取樣點並對其(透過仿真或場解)求輸出後構間出這樣的一個多維模型來優化便是一種系統性的優化流程; 而實驗設計法(design of experiments, or DOE)則是最常與RSM一起運作的建模程序。

實驗設計法 (Design of experiments, DOE):

當系統有許多變量且各含有一定範圍及可能值時, 要透過全面完整組合(full combinatorial, or full grid)來找最佳值是不大可能的; 我們只能透過極有限取樣點來得到反應以建構出RSM。

將上圖中輸出Y寫成是一個由變量x1, x2 ~ xn所形成的函數f(x), 則透過Taylor Theorem, 這些函式f(x)均可以級數的形式來近似:

當更高階級數(bigger alpha)被包含Taylor級數時, 這近似式與原f(x)就更接近了, 這就好比對時域方波做傅利葉轉換時, 若頻域上包含的諧波更高, 則再反轉回時域時就更近似原來的方波。

在現實世界裡, 大部份的現象主要來自於低階的項目的影響, 若我們只取到二階, 則上述的Taylor級數展開後可寫成如下的二次式:

quadraeq

當變數X1, X2的值不同時, 等式左邊的輸Yfit值也就不同, 而系數Beta則決定了各變量對輸出的影響程度: beta值愈小, 則變量就更為次要; 那要怎麼算出相關係數Beta呢? 如果我們有N個取樣點, 則上面這種型式的等式寫在一起時便可以如下的矩陣的樣式來表現:

quadramtx

當將二階拉高為至K階時, 則廣義的矩陣式便可寫成如下:

DOERSMMtx

最左邊的X矩陣大多不是方陣, 所以若要求出相關系數Beta的向量, 則需使用一般線性代數裡的操作技巧:擬反矩陣(pseudo inverse)及奇異值分解(singular value decomposition, or SVD), 而所得的係數是在以最小的平均誤差(mean square error)的情況下的解。

modelfit

欲使用DOE/RSM流程來進行優化, 則有幾項前置作業必需完成:

  • 決定有那些變量X及最高階為何: 如能先有洞見, 則取較具相關性的變量可使建構出的模型更近似;其次, X的數目及階數也影響了欲進行仿真的數目及最後矩陣的大小;
  • 決定取用那些輸出函數Y: 因為我們只用低階的X來置入Taylor級數, 故若是結果得再經過複雜的數學運算或後處理,則過程間的高階操作便可能打破了低階X和Y的關連性;
  • 決定那種取樣方式:在上面矩陣式中, 每一列都是一個系統仿真, 我們只要能在解答空間裡有足夠數目及涵蓋性的取樣點便可, 過多或過少都會影響建出模型的品質; 而這取樣點的方式在統計學上則有許有許多不同的理論可採用。

以實驗設計法優化的流程:

欲利用實驗設計法在對信號或電源完整性上優化; 一般來說有下列步驟:

  • 定義變數: 儘量只將主要變量列如分析的範圍則模型才有意義且建模才有效率; 而主要變量則可透過:線性掃描(linear sweep), 假設性分析, 之前產品設計的分析及經驗等等來決定; 再者實驗設計法通常不會只進行一次, 在每次結果出來後對相關係數的檢視都可為下次再進行分析做參考。
  • 定義取樣點: 取樣方式及數目取決於變量多少及範圍; 在信號/電源完整性的應用上, 一般若變量數目在10左右, 則central composite design 是一個不錯的選擇, 如此選出的取樣點在一千到數千個之間; 若是有更多的變量(<=30),  則使用D-Optimal較佳, 取樣法亦和建模方式有關, 當欲建模型不是透過RSM, 而是由神經網路的方式時, 則二次式的需求便未必需要, 故而可用如space filling等取樣法來進行;所述這些都是統計學上的應用, 故許多統計軟體都可拿來設計相關實驗;在我們的建模模組MPro裡, 則有許多常用的有關的內建:

    Design

  • 產生測試案例: 所定變量一般可分為連續性變量(如電阻值)及非連續性(如各corner等),雖然在變量可能值範圍內有不同的階度可選, 但在上一步驟的取樣點裡, 每一個變數一般只用-1, 0, +1來表示其最小,中間及最大值以用於其案例; 故接下來竹的步驟就是把這取樣點的設定轉為實際的案例以便進行仿真或場解。若是佈線前的分析, 則案例多是Spice的網表(netlist), 故案例的產生可運用如樣板網表(template netlist)進行字串替換來輕易達成; 對於和幾何相關的案例(後佈線或2D傳輸線或3D結構以場解進行), 則得需要更複雜的程序才能將取樣點轉成測試案例。不論那種程序,最後的結果是每一個測試點表示矩陣裡的一個行而必需要有相對應的案例產出。

    Collect

  • 對案例仿真、場解並後處理: 再來就是對產出的測試案例仿真、場解及後處理以得到輸出了; 因為可能有維數上千或上萬的案例需進行, 故一般是透過多執行緒或甚至是利用多台電腦來平行處理,最後再將每個案例的算出結果組合以便和原始輸入形成對應關係; 而在這一步驟中所著重的便是如何迅速有效的管理這些平行處理的案例分析。

    SimMgr

  • 為輸入至輸出建模: 有了輸入及輸出後, 接下來的就是實際的建模了, 若是反應曲面模型, 則可用前述的奇異值分解(SVD)來解相關係數; 其它的建模方式也包括了類神經網路等等;而模型的優劣則可透過其對現有結果的預測及殘值大小來查驗; 殘值(及實際值及預測值間差)愈小則模型愈好; 一般上可用R^2, 即因模型所造成的變異數, 來計模型好壞, R^2 >= 0.95表示是可接受的預測模型。

    modeling

    Prediction

  • 優化: 優化是在一定的變量範圍及條件(如不以是負值)等的前題下進行; 而後對單一輸出Y或是以比重組合出的複合Y (or cost function)來求極大極小化; 取決於所取變量的階度, 也有以下幾種演算法可運用:
    • 線性規劃: 若變數皆為一階且無cross terms, 則可用線性規化方式得到絕對解; 一般而言, 很多和幾何相關的計算(如layer stackup對阻抗的反應)等都只需要用到一階就可有很好的近似;
    • 非線性方法:常有高階項時, 可試著用如Nelder algorithm來求優化值;
    • 基因演算法: 這是需經過許多迴圈但可適用於近乎所有模型(含類神經網路)的優化方式。

      Optimize

  • 審視相關係數及殘值,重覆進行: 最後一步驟則是審視模型中各變量的相關係數, 剔除非主要的變量後再在下一迴圈裡做更進一步的操作; 也可能是對高殘值之案例更進一步檢查看是否是仿值或後處理的過程產生問題以造成離群值。

由上可見, 相較前一則貼文裡所提到的假設性分析, 欲以DOE/RSM的方式來為系統做優化是需要進行更多步驟的及計算資源的; 在另一方面, 一旦所建模型可具預測性(即殘值小), 則此一模型可做為假設性分析的基礎而取代很多不必要的仿真; 下圖中所示:我們的TPro模組先已透過對十數萬案例進行二維場解及建模而能將結果拿來建置成一快速的假設性分析功能使讀者可很快地透過拉BAR來得到相關的性能資訊。

A stackup what-if based on model built via DOE/RSM flow

 

信號完整性之最佳化:假設性分析

系統性能之優化或最佳化:

就系統上的信號完整性而言,所謂的『系統』一般定義為通信通道的頭尾兩端,亦即是自晶片上IO buffer的driver、經諸如封裝、傳輸線、通孔及連接器等的interconnect、最到接收器的receiver為止。這通道上有許多元件且各有各的設計參數;故若要以系統性能為優化目標,其實含有為數甚多的變量;即便是就『性能』而言,也是有很多不同量測的依據。。。諸如眼圖的寬度、高度及位元錯誤率(BER)等等,它們之間有些也未必成正比、如欲求極大化之眼圖寬度便可能得犧牲其高度等,故在諸性能間也有得取捨的空間或是得用加乘比重的方式來對整合出的複合性能求極大或極小的優化。

系統雜訊的來源:

系統性能除了被許多參與元件之參數所控制外,也可看做是受了許多雜訊的影響。如果我們把元件參數的變量以x1, x2 ~xn表示,則這些雜訊也可看成是函式g1(x1, x2), g2(x2, x3)等而同為元件參數所控制;最終的系統性能則是f(g1(x), g2(x)…) = f(x1, x2~xn);這樣分隔的的目的,在於很多設計或元件參數只對某個性能有影響;比如說傳輸線的間距與串擾(crosstalk)有強烈的相關性,相較之下buffer的驅動特性及速度則不那麼正相關︔也就是說,吾人可將具相關性的參數放在一起來對某系統雜訊的影響做分析,如此可能更具直觀性且不用在含全部參數的廣大解答空間裡尋找最佳值。

一般而言,系統的雜訊來源大致可分類如下:

  • 符碼間干擾 (inter-symbol interference, or ISI): 由於通道的色散特性及各級連接之間阻抗不匹配所造成的反射現象,傳輸的位元信號會與其自身相干擾而在接收端造成失真;
  • 串擾 (crosstalk, or cross-channel interference CCI): 串擾是由於victim及aggressors之間能量透過電容或電感性的藕合來傳遞而造成接收端訊號的減弱;串擾的情形一般在高頻時特別明顯、且也和許多界質及間距有強烈的相關性;
  • 電源雜訊:不同數目的buffer在不同工作區間或頻率運作時有不同的驅動電流之需求,當它們流過power delivery network時就會造成供應端的壓降而使得驅動強度及斜率均相對改變;
  • 隨機雜訊:由諸由有高斯分布特性之熱雜訊及其它顫動(jitter)等;

藉由探討元件參數對這些相互獨立的雜訊的影響,我們可以各個擊破地減少這些雜訊進而對整體系統性能達到優化的效果。

系統優化的方法:

有了這麼多的元件參數x1, x2 ~ xn, 間接形成的雜訊函數g(x)及最終的性能函數f(x), 我們要如何進行最佳化呢?

通訊通道一般都有必需滿足的規格,如業界標準的PCIe GenX, HDMI, SATA, USB, DDR等等,各有其公定的最低標準,唯有滿足其要求通過檢測後才能在最終產品上貼上相符的識別標章;對於較小的設計公司或是有截止期限的壓力時而言,很多情況下工程師都只求產品能通過規格標準即可,也就是說,他們所要的只是『一個』、而非『最佳』的解決方案;但對於有些需要提供design guide的公司,為了確保其它公司使用其產品的設計能順利運作,便得對所有可能的情況做分析以便即使在最壞情況下其結果仍能通過標準,所以它們便得做類似『最佳化』的全面性分析。其次,最佳化的流程常需透過大量的仿真及計算、故非有充裕計算機資源及能力無法完成。為滿足上述的兩種情況,一般而言我們有兩種優化的方式

  • 假設性分析:即what-if analysis, 在這種分析法中,我們將許多參數都先給定一數值,而後只對少數的參數做線性的研究;就信號整合性的例子而言、就好比是藉由調整傳輸線間距或線寬來觀察其對串擾的影響等;由於是線性地調整一兩個參數、所以全域(global)的最佳化不大可能由此分析而獲得,但在另一方面,這種假設性分析通常有如下的優點
    • 可用相對少的計算機資源來找到『一個』解決方案;
    • 可以相對短的時間內快速地得到結果;
    • 透過其近乎即時的反饋,工程師能對所調參數對反應的影響產生直觀上的連結及了解,近而可在日後有益於做出更好的設計。
  • 系統性分析:【如實驗設計法design of experiments等】這種分析法可看做是多維空間的假設性分析;有更多的設計參數可一起列入考量,在為每個參數定出其可能值的上下限後(所以嚴格地說仍不能算是global地優化)進行下列的程序: (我們會在之後的貼文再對這分析法做更詳細的解釋)
    • 決定取樣空間
    • 就每一取樣點產生相對應的設計
    • 對每一設計仿真及後處理
    • 為取樣點參數到後處理的結果建立模型
    • 透過所建之模型來預測最佳結果時的參數值
    • 研究殘餘值(residue)及參數間之相關係數

再談假設性分析:

由於假設性分析是透過對較少數變量的線性操作來達到探討其對最終結果的反應,故而在可操作變量的選取上便得先決定其是否有主要的影響,否則線性的參數調整將看不到結果的變化而失去其意義;其次、為求結果能很快地產出而有近乎即時反饋的效果,對其餘定量的因素或相關系統模型便可更進一步地做簡化。比如說、若吾人想探討的是系統參數對其ISI及CCI的影響,那我們便可將通道上的元件簡化成下列三部份來分別研究其與前述兩性能間的關係:

  • Driver: driver’s strength, slew rate, supply voltage, EQ (等化)settings
  • Interconnect:
    • transmission lines: layer stackup and materials Dk/Df, trace width, distances and layout etc
    • vias: pad, anti-pad size, barrel width, back-drill etc
    • package/connectors: change of reference and reference impedance etc
  • Receiver: termination scheme and different terminator values, EQ response and settings etc.

上述中的driver/receiver均已是行為模型(behavioral model)而非原始場效體型諸如通道尺吋或載體濃度的參數、也就是說一般是利用IBIS或/及AMI的參數來加以操作;對於interconnect而言,以二維場解器來計算傳輸線物理及尺寸(間距、線寬等等)所造成的阻抗或串擾上的影響是相對簡單的;一旦是必需要用3D場解才能算出的結構:如通孔Via、封裝或連接器connector等,就要需時甚久而使得假設性分析的效果打折扣了︔如果許可的話,應以簡化的的模型來取代。如下圖為例、在大致的計算上通孔設計可以PI模型來取代。

優化方式間的取捨:

我們認為一信號/電源完整性工程師的價值在於其能對各參數對系統性能的問題有其深入的了解進而能找出解決問題的方案。假設性及系統性分析均可做為這種知識及經驗取得的手段;對系統分析性【如實驗設計法】而言,有一可能的陷阱是因為其需要完整的流程及執行許多步驟,一旦前人建置完成,後來的工程師便可能陷入僅僅執行流程以產出結果報告而未對所得的預測模型做更深入的了解的險境;從而在眾多的數據中喪失了對單一參數的認知及了解。

SPISim使必信產品對假設性分析的支援:

基於前述討論的精神之下,我們設計出了支援假設性分析的XPro模組【X即Experiment, 亦即實驗】在這模組中、我們簡化了許多通道模型並提供了對能主要系統參數做假設性分析的功能,以便用戶能分別對ISI, CCI及電源完整性的一些課題分別做直觀快速的分析:

分析時所需的的仿真都是直接透過內建的SSolver無縫進行,一旦性能滿足所需,只要按下”Generate Model”鈕,則相對應參數的模型便可直接產出而在完整通道的分析上使用。這些功能是大部分其它公司的產品所欠缺而獨見於我們使必信的工具程式裡的。

仿真器之研發:建模 (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的公司如我者而言,是一項值得的投資。

仿真器之研發:架構

在系統電氣性分析上,有效的方法及流程都必需建構在一定堅實的基礎之上,這“基礎科技”大致上包括了二維或三維場解器、仿真器及能依統計方法來演算出眼圖或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在我看來是個很完整、至少頗具教育性的仿真器架構。教科書方面我則推薦以下兩本經典供參考: