IBIS-AMI: 完整的AMI建模流程

上篇的貼文中, 我談到”IBIS cookbook”提供了IBIS類比部份建模的極佳參考資訊; 可惜在為EQ建模的AMI部份, 就我所知類似的cookbook則付之闕如!  要為AMI建模, EQ的理論部份需先導出其演算法、而後再以C語言將IBIS Spec裡的幾個API寫出來, 最後要把這些程式碼在不同的作業系統上編譯..Windows上是編成dynamic link library (.DLL), Linux上則是編成shared object (.SO), 由於不同的編譯器、不同的建檔程式(如make, cmake等)各個的操作指令又不同, 所以這些大都應歸類到資訊或軟體工程的範圍; 也因此其與此工作本質上的電氣/建模等重合性並不高。這也難怪要找到為這一切都寫有詳盡指示的教材或參考資訊實無異於緣木求魚。

在這篇文章中, 我打算略過這些”編程”的細節部份, 專以整體AMI建模的流程分享一些個人的想法。所有從頭到尾的步驟都希望能有所觸及進而能給讀者一個完整的介紹。大致上來說, 其依序可分為下列步驟:

  • 建立IBIS類比模型
  • 準備相關資料
  • 定義AMI模型架構
  • 實際進行編程建模
  • 對單一模型做掃描測試
  • 將模型置入完整渠道測試
  • 編寫使用手冊

以下就分為各步驟做更深入的分享:

建立IBIS類比模型:

信不信…為AMI建模的第一步是要建出其類比的模型部份(也就是傳統的IBIS模型)。這點對於TX端來說尤其真確! 因為TX的EQ是要為”含有TX類比響應”的部份去做等化的, 也就是說:當連接TX及RX端的channel是pass-through時、且RX是TX的一般操作負載情況時, TX EQ要去做等化的等於是其本身的IBIS響應。 如果不事先知道類比響應為何, 是無法繼續算出EQ的各個參數值的。以下圖為例:

這是一個FFE 的EQ電路, 很明顯的是等化的de-emphasis部份為兩個黃色箭頭線所標示; 而為紅線框住的部份:其包含上升、下降斜率, overshoot/undershoot等信號細節, 以及dc的準位等等在在都是類比模型的結果。所以為類比部份精確地建出模型實為TX AMI建模的第一步! 除了IBIS之外, 最近也有BIRD194的倡議(其用S參數來描述類比行為), 無寧地..兩者都是同樣的意義。

對於RX而言, 問題則簡單得多。因為其IBIS模型大抵為ESD的clamp或是terminator外加差分電阻而已。所以不用在那花太多工夫就可實質進入為AMI建模的階段。凡此種種, 有興趣的讀者可見本司之前許多有關IBIS建模的貼文。

準備相關資料:

AMI建模的原始資料可以來自很多方面:比如說是電路的仿真、實際的量測抑或是datasheet等等。就仿真所得結果而言, 第一步當然是在確認仿真結果無誤之後為各個關鍵參數箤取出相關數據以便日後AMI建出來後做為第一步驗證的依據。

以下圖為例, 這是一個TX在不同EQ設定下的的圖型:

由於silicon設定上要激發出不同EQ的時脈未必相同, 所以得到結果後最好要把它們都對齊在某個時間點以便做批次的處理。利用本司的SPIVPro的話, 可以很快地為不同曲線在5.3ns時的值一下量出來並製表如下:

同樣地, 若是原始資料是lab裡量出來的波型, 則得加上手工的程序去量出不同的EQ值, 這點由於多少會有雜訊的緣故會比由電路仿真的流程更加費工且精確性較低:

有些原始設計的效能部份得在頻域才看得出來, 所以在此情況下上述類似的程序就得在比如說DC, 5G, 10GHz等地方進行:

如果原始資料是元件的datasheet的話, 則建模的自由度較高。比如說不同的極點及零點的位置, 都有可能在同樣的頻率點得到極近似的響應, 則用那組資料就都可以, 也或許就要再參考一些其它的限制條件。

定義AMI模型架構:

有了資料之後,下一步就是依資料的樣式來制定出AMI模型的架構。通當AMI的次要組成模組都得反應出原始設計的功能。比如說如果原來的設計裡有DFE/CDR的功能, 則AMI裡也少不了它們。但也有一些情況下, AMI的架構能有有不同的考量, 以下圖為例:

很明顯的是這裡面一定有一個post-tap的FFE, 但上面由不同顏色框起來的部份, 就可以用不同的方式來建模:如果你覺得這些波型都很進似, 則可以用同一個類比IBIS模型外加一個”縮放模組 Scaler”就可套出不同的振幅, 也可能這之間的斜率相差過大而必需由不同的IBIS來表示; 同樣地TYP/MIN/MAX之間的差異也可能用一個類似的Scaler就可以轉出來等等。對於一個repeater而言, 因為其同時具有RX及TX級, 所以EQ的那些功能放在RX那些放在TX也可以有一些彈性。在不同的使用狀況之下, 也很可能同一模型要以不同架構的形式來呈現才能順利被使用, 這樣的一個例子我也已在之前的貼文裡討論過。

實際進行編程建模:

定義好架構之後, 再來就是實際地編程了。如果這不是第一個專案, 那幸運的話可能之前已有類似的設計其源碼可直接拿來運用, 如果是新寫的話, 要注意的是是否夠模組化以便日後能再輕易地重覆使用。由於同一個AMI模型可能被建構多次(several instances)而同時被仿真, 故若用static variables/function的話就要考慮到會不會在不同的instance (相同的class)之間相互干擾, 對於不同的instance是否會位於同一個記憶體空間這個問題可以說每家仿真器的做法都未必一致。再者, 模型裡不要有hard-coded的數值…我就曾經見過一個模型其只能在某個速率下且每UI有32個取樣點的情況下跑…任何其它不同的設定都會造成有誤的結果甚或是crash, 這表示原建模者沒有把用戶不同的取樣、速率設定考慮進去而在內部做適當的up/down sampling。最後, 軟體工程內的許多標準技巧如unit testing, revision control, dependencies check等等也都要弄好。Dependency的部份在Linux尤其重要, 因為在那作業系統上的很多函式庫都是放在lib\之下共享的。也就是說如果模型源碼裡有用到某個外部函式但在編成.so時又沒有做靜態的連結, 則原來在建模工程師電腦上運作無誤的模型拿到另一使用者的環境下就不能跑了。這種情況下,大部份的時候我們都要準備好幾個電腦(可用虛擬機), 裡面只裝有不同distro的OS最開始裝好的情況(所以所有的函式庫都是最基本的)且是吾人所願意支援的最古老版本, 再在那之上去編譯模型的源碼。

有了二進位.dll/.so之後, 再來就是寫純文字格式的.ami檔;這裡沒有一定的格式…有很多不同的語法都可以拿來讓用戶設定某個AMI參數的值及範圍。又由於不同EDA的仿真器對呈現這些AMI參數及其選項的方式都不一樣, 所以通常要先選定一個主要支援的EDA軟體再以那為本來編寫。最後, 由於IBIS本身就有TYP/MIN/MAX不同的CORNER, 所以在寫AMI時若其也有類似的CORNER則也要一齊列入考量, 否則用戶選MAX的IBIS來套上MIN的AMI就出錯了, 也就是說它們之間需要能同步”Synchronize”。

模型都準備好之後,再來就是參數的調效, 之前有提到源碼最好能重覆使用, 所以不同設計所會用到的不同參數就不應直接寫在源碼裡而應以外掛的方式讀進來, 在這裡就是建構這外部參數的步驟。有些界面…如PCIe, 其對FFE的不同tap值都有預先定義好了, 則這裡就沒有什麼變化的空間。更多的情況是有的是仿真或測量的結果而建模者需一個一個地去找出相對應的參數, 如果用手動的話可以說是煩瑣且曠日廢時又精確度不高, 記住..這裡可是有可能多達幾百甚至是上千組設定的, 最好的情況應是用如本司軟體的”Auto-Tune”來自動的調效:

基本上本司程式會先把目標波形及時間點量自動出來, 而後透過二分搜尋的方式漸次地調AMI參數使其逼近至目標值至一個範圍內, 而後直接將結果製表。這樣的流程即使是上千組的參數也能在幾分鐘之內完成。

對單一模型做掃描測試:

這裡要進行的是為單一模型驗證的程序。就如同為IBIS建模一樣, 有了AMI模型之後將其和IBIS部份連結起來再來做的就是用Golden Checker進行語法上的驗證; 由於不同的二進位AMI模型在不同的作業系統上載入的方式都不同, 所以這一步驟得分別在不同的作業系統上分別執行:

IBIS官版的golden checker是直到近兩年才有載入AMI模型的能力; 其所做的是先讀且驗證IBIS檔之後, 再看那個IBIS模型有用的AMI的部份而順藤摸瓜去把相對應的AMI模型也讀進來並測試載入, 要強調的是它們只做載入的動作而不會試著去驅動, 所以功能性的測試還是得另外做。無疑地, 尤其是在Linux上的dependency問題在載入的時候就會顯現出來, 所以這個程序在有釋出Linux版本的模型時是少不了的。

再者, 一個AMI檔可能會有好幾個參數, 且每個參數都會有幾個不同的值; 要完整的測試模型本身, 不可或缺的是要把所有參數所有值的不同排列組合都要跑過。本司的做法是先把.ami檔裡的變數”參數化”(如下圖紅框內, 首尾加入%):

而後用像我們的SPIMPro把不同參數不同值完全的排列組合都列出來, 再來就每一個組合把AMI檔內的變數取代填值, 最後生成不同的.AMI檔案。就這個流程而言, 其很像是我們做SI時所用的系統分析法(探討於此篇貼文);而當有了這麼多不同的AMI檔之後,我們就可以對同一AMI模型做不同參數下的驅動。 取決於所用的EDA仿真軟體, 要能快速有效的批次執行這麼多次可能並不簡單, 、即便可能也是要透過腳本(script)的編寫, 所以非得先廢上一番功夫才成。就本司軟體而言, 這些功能都已內建於SPIMProSPIVPro裡, 所以可在一個環境下不寫腳本就成批次完成。此處用途廣泛的SPISimAMI 模型驅動程式也是不可或缺的角色!

當每一個AMI檔都被用來驅動.dll/.so模型之後, 就會又有數百甚至上千的波型檔待分析, 要做的就是一樣批次地把關鍵值量測出來:

而後再與原始資料相減而得出delta的值或比率, 把這些點以圖形呈現出來就可以很快地看出在那些設定下誤差值較大, 如果有明顯的錯誤的話(比如說沒值可比…那就大概表示驅動AMI模型時大概crash了), 就又要回到前幾個步驟找出問題而後重走流程一次…

將模型置入完整渠道測試:

剛剛所提的模型驅動是單就其本身, 當然最後不可少的是也把其它的相關部份帶進來組成一完整的渠道或設計做全面的驗證。這裡有一個重點是AMI的仿真所呈現的結果都是在時域上的(不論是透過statistical或是bit-by-bit的方式進行), 所以對於有些響應是在頻域上的元件(如CTLE)等來說就不是那麼地直觀可驗證。一般的情況下我們會用一個相對應的原始元件(比如說一個S參數, 其Sdd12就是我們CTLE的頻響)來做:蘋果對蘋果的比較, 這樣來看驗證就直觀得多。

另一也不可少的步驟是把建出的模型在不同廠家的EDA軟體上跑過至少一次且確認結果無誤。這點也可能有其難為之處…因為這類的EDA仿真器不在少數, 隨便一算就有ADS, HyperLynx, QCD, SystemSI, HSpice等等, 每一項都花費不貲, 實際上即使是大公司, 也很少有見到會願意或有需要將它們買齊的, 所以就本司而言, 得串連其它的SI顧問相互支援。舉例而言, 同樣的DLL_PATH保留關鍵字有的仿真器傳進來的是絕對路徑、另有些則傳入相對路徑。如果所建模型用到這參數的話, 未對兩者做相同的支援就有可能會跑出不同的結果, 所以不走這步, 所建模型對其它未測廠家仿真器的支援程度便很難說。

編寫使用手冊:

走到這裡, 最後一步就是寫模型操作手冊了。一般來說, 會包括的資訊最先開始的就是類比IBIS模型的部份, 比如說那個針腳接到那個模型, 其AMI的部份為何等等, 最重要的資訊是AMI參數的名稱、值的範圍及描述等等; 對於如果所用仿真器不支援某些保留字時的應變等等也要提及(比如說如果仿真器版本較舊而不支援DLL_PATH/DLL_ID, 則模型是否有其它的AMI關鍵字可用來做相同的設定), 再者, SILICON或量測值與模型跑出的眼圖相較也應置於手冊之中, 最後一項是對主要支援的仿真器、欲使用所建模型的簡易設定為何等等, 凡此種種, 都是一個完整AMI建模專案所不可遺漏的。

結語:

本貼文與讀者分享了本司為AMI建模的一些必經流程。C/C++編程的部份自是AMI建模重點之所在但需另外觸及的..故不在上述之內。不論是AMI API的參數、設定抑或是編程所用的語言(如C/C++)都是一直在與時俱進且不斷演變的, 所以身為一個建模者, 就得時時去汲取相關的新知以便能最有效的建出精確的模型, 而不同軟體、函式庫或是作業系統的限制與運用也在在都是相關的課題。在看過此篇分享之後, 不知讀者是否仍對親自建模而感到興致昂然?…或者覺得乾脆委外於我由本司為您效勞? 祝您建模愉快! 🙂

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

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
  • 不同解耦安排的假設性分析: 由於上述的分析均在很短的時間內可以完成,故而就能對不同解耦電容的安排(位置、數目及電容值乃至於其價格等)做假設性分析並依此而達到優化的目的。

 

仿真器之研發:界面

在前則貼文中,我們提到電路仿真器的核心部份是有由線性代數方法, 來對由節點電流及網目電壓方程所形成的矩陣做求解;我們也提到靜態及瞬態的運算中,元件部份被呼叫最多次的函式是”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)。由於過去的業界相關經驗,我們能夠相對輕易地了解其原本架構、流程而在較短的時間內加上這些元件的支持而達到應用的目的,但在閱讀相關文件及研發過程中,對這款在數十年前便已開發完成的仿真器,我們仍不禁且不時地為其設計之週到及流程之順感到敬佩,也建議有興趣的讀者能以其為本來深入地研究。

 

系統完整性分析之範疇

系統完整性分析大致上可分為幾個領域:信號完整性(Signal Integrity)、電源完整性(Power Integrity)及電磁相容性(EMC… Electro-Magnetic Compatibility)等等。分析的方式通常是先經由對被分析元件或通信渠道建構模型、而後透過軟體進行仿真。

在談更多的細節前,我們需先為所謂的”系統”做一定義:

20120126_01
上圖(1)中所示為一常見的電腦主機板;在板子最上層的元件多包括了散熱器、各種的電容及末端的連接器等等。若把板子翻過來..如圖(2)所示,我們則可看到很多的焊接點及在電路板上的佈線(PCB trace),如此類的非晶片內部的、可宏觀上用肉眼看到的系統即是我們所定義系統分析的範疇。唯這類系統並不侷限於電腦主機板,舉凡手機電路板、內篏式系統或甚至是大型伺服器裡的電路亦可含括在內;以上所舉的這些例子宏觀上均可以用肉眼看到…差別只在於大小。之所以不將晶片上的設計包含在系統分析之內是因為其相對尺寸較小…對於一般傳訊的波長、信號失真的幅度遠比在我們所定義的系統上來得小。
20120126_02
我們剛剛談到的這些系統多是用電腦輔助軟體所設計而成,若我們能把設計圖如圖(3)放大來看,可以看到許多的佈線從晶片邊緣的針腳(Pin out)走線透過導孔(Via)經過不同的PCB疊層而走到板子邊供輸出輸入的各類連接器,如圖(4)所示。
20120126_03

若我們能繼續放大以三維模式看這些針腳及導孔附近,如圖(5)所示,則可發現這些宏觀上毫不起眼的細微之處,實為各類圓柱體所建構相連接而成;圓柱體穿過疊層間(Layer stackup)而連到電路板上專位信號或電源預留的走線層(每一電路板在上下兩層間實為數層不同的電源、走線層與不導電界質(medium) 交互壓縮而成),在這一連串走線的兩端是晶片的封裝(package)及連接器(connector)。電氣信號從晶片裡的緩沖器而始、經過這一連串的走線及導孔、最終來到連接器。連接器之後亦經同樣的程序最終走到彼端晶片內的接收器。如果說這端的源頭是電腦處理器(CPU)或晶片組(chip-set)的緩沖器,彼端可能就像是如記憶體(DDR)或USB的各類裝置裡晶片的接收器。
20120126_04
當我們把這些在傳送或接收晶片裡的緩沖器(buffer)調出其設計圖來看,則可看到不同大小的場效體(MOSFET)以相應的邏輯方式組成。不同位元(bit)的信號由其前級的電路輸出後,透過這些緩沖器對信號加以放大及加強以便能在不失真甚鉅的條件下透過剛才所述的走線、導孔、連接器或甚至是中間的藕合電容等達到另一端的緩沖器對已衰減了的信號加以復元重建。為減少衰減的情況、這些欲傳送的位元信號也可能先進行編碼,再在接收端進行解碼。

系統分析模型:

由上所述,我們可以看到若欲對我們剛剛所定義的系統做完整性的分析,則必需先對其中所牽涉到的各種元件及因素(整理表列於下)做些了解。如此才能為其建構模型而進行仿真分析:

  • 輸出、輸入緩沖器: 通常是以IBIS或Verilog-A所描述;如何為其建模等等;
  • 晶片的封裝:各種封裝的方式及其建模;
  • 電路板及其疊層:不同疊層、介電質及通信、電源層設置的影響;
  • 走線(傳輸線):如何為失真的因素、如串擾(Crosstalk)、等做分析;
  • 導孔、連接器:如何設計、建模並分析其傳訊效能;
  • 通信渠道:各種佈線、佈局(topology)方式及端口阻抗的設計;
  • 信號:不同界面(PCIe, USB, DDR等)的不同信號方式及差分信號及其等化等等。

我們將試著在這個SPISim的版面, 為以上所列之建模及分析方式做一簡單的整理介紹。

IBIS模型: 什麼是IBIS(輸入輸出緩沖器信息標準)

IBISLogo
IBIS是 I/O Buffer Information Specification的縮寫,中文即譯為輸入輸出緩沖器信息標準。它是在上世紀末之90年代初為提倡可為不同仿真器或分析工具所接受運作的模型而制定出來的標準。時至今日它仍不斷地演化而時有更新的制定出現。茲在下面列出其規格上的重大進程:

  • V3.2: 利用不同的電流/電壓曲線及電壓/時間曲線來建構出緩沖器在穩態及瞬態的特性。這一規格的模型以供電電壓及接地電壓是理想狀態為前提,故僅能做為信號整合性上的仿真分析所用。
  • V4.0:這一版本首度將其它也常見的建模語言,如Verilog-A, VHDL及Spice等也列入模型的成分之一, 以便能在IBIS標準關鍵字不易更新改變的限制之下亦能有效地為特別的緩沖器進行建模。
  • V5.0:這個版本加入了ISSO PU/PD以為在非理想供電或接地電壓的情況下、諸如由供電網路(Power delivery network)所造成的Voltage droop或Ground bounce情況下、亦能正確地描述緩沖器的行為。其亦包括了[Composite Current]關鍵字以對緩沖器在切換間電流與當下的時刻做出連結。這一版本的模型可以同為信號及電源整合性(SI/PI)共同分析所使用。
  • V5.1:這個版本加入了AMI (Algorithmic Modeling Interface, 即演算法建模界面),以為在單純類比緩沖器之外加上等化器等的建模需求。透過常是用C/C++語言所建構之AMI模型,可和原類別緩沖器為主的模型搭配而在通信渠道做Latch to latch的高速仿真運算以得到誤碼率(Bit error rate)類之參數。最常用在SerDes (串化/解串化器)之界面上。也由於建模語言的低階化、以及建模前對等化器EQ運作細節了解的需求,使得建模的門坎及難度都相對應地增加了。

IBISEvolve

 

在我們談到IBIS這個語詞時,也需同時地對IBIS規格, IBIS檔案以及IBIS模型三者的分別做一簡單說明:

  • IBIS規格:是由IBIS標準委員會經會員投票制定出的規格。廣義上而言ICM (InterConnect Modeling Spec),即連接器建模標準,亦是由這委員會制定出而同屬IBIS規格的一部分。ICM定義出了通信渠道間所有被動性連接元件的建模標準。這些元件包括了如傳輸纜線(Cable)、連接器(Connector)及印刷電路版(PCB)之間的繞線等。之前的EBD (Electric board description)標準即為ICM所取代。
  • IBSI檔案:IBSI檔案是一描述某晶片廠商所生產的某一或更多晶片模型的檔案。一如一般市面上的晶片封裝內含不同的針腳(Pin)…每一針腳內連到一同的電路輸入;IBSI檔案在檔案前面也有這製造廠商等的資訊,而後是晶片封裝的不同針解及其與其相連之緩沖器模型名稱,最後才是緩沖器單獨的模型資料。故一個IBSI檔案可內含有許多的IBSI模型,也可含有如封裝模型(Package model)之相關資訊。
  • IBIS模型:這即是我們一般所言之緩沖器模型;IBIS規格定出十數種不同類的緩沖器模型,每一種類別有其所必需要有的模型資料。一般來說,這些資料包含了如:電流/電壓(穩態)、電壓/瞬態、電流/瞬態等的對應表格;也包括了這個模型在建模時的運作及負載環境設置等等。如果模型在仿真時超出了這些當初建模時所採用的設計範圍,則仿真出來的效果也就未必準確了。
IBIS Files vs Models

IBIS 檔案 vs 模型

Viewing model data of an IBIS file in SPIBPro

在SPIBPro中查看一IBIS檔案內不同模型的波形資料

IBIS模型: 什麼需要用緩沖器模型及為什麼是IBIS (輸入輸出緩沖器信息標準)

在我們開始探討緩沖器模型的細節前,得先談一下為什麼它值得一談:

緩沖器位在通信渠道(communication channel)的兩端:通信渠道上多是由被動元件如傳輸線(Transmission line)、導孔(Via)及連接器(connector)所組成,而在兩端做有源的主動發送及接收的即是緩沖器了。

Channel

若您是晶片設計師,場效體尺寸及製程間摻雜質(doping)的濃度可能就影響了設計出電路的工作效能;這些效能可能以輸入出電流強度、阻抗及上升下降速率等時間性的參數來表示。

Transistor and process info. for a buffer design

緩沖器內部之設計細節及相關製程影響其外在的效能表現

但若您是系統設計師或完整性分析師,則您所顧慮的可能是更宏觀的設計:諸如佈線、端口阻抗、元件放置及佈局等等。則之前所述那些晶片設計師所關心的細節對您來說可能就顯得無關宏旨。對您來說,那些晶片就像是現成的元件,您並不在意這些緩沖器是怎麼設計出來的,只要緩沖器效能可以達到您規格的需求就足夠了。

所以從這兩者的角度來看,能有一個簡易描率緩沖器規格及效能的模型就足以做為溝通應用的橋樑。於是一能描述緩沖器效能的模型便有存在的需求。

System level design use buffer as component.

系統設計師視緩沖器為一現成的元件而不管其內部設計細節

 

一般而言,一緩沖器模型有幾項評量的標準:

  • 是否精確:這是建模最基本的需求,一個不準的模型毫無用武之地。所謂精確,一般需在原設計的5%之內。
  • 是否能保護智財:做為一晶片設計廠商,發佈模型以供使用原是為讓客戶能更方便地應用自己的設計,但這是以決不能危急設計的智慧財產權為前提;除了原設計的架構外,製程的細節也通常在保護之列。
  • 仿真時的效率:從系統設計師的角度來看,模型在仿真上也有效率上的需求。一個系統上常包含了上百甚至上千個緩沖器,它們常必需有較原設計快上100~1000倍的速度才堪於系統仿真分析上所使用。
  • 建模是否容易:對系統建模工程師來說, 如果建模程序大費周章,則暗喻著其中的過能很有可能出錯而有精確上的顧慮。一般而言,能做以黑箱為基礎地建模。。。 即建模者不需知道緩沖器內部的設計細節而只要能就界面上的端口做激發以獲得數據來建模。。是較佳的解決方案。
  • 模型是否廣為接受:建出的模型需能在數個業界採用的仿真器、如HSpice 或ADS上運行。若某種建模只能在特定的仿真器上跑,則長遠來看容易有精確上的問題而不為人知,而且在建模的過程上也能急就章而不能受到公正的檢驗。

由於以上的考慮常不能面面俱到,有些人便以仿真器內建的加密模式為原設計編碼建模(Encrypted Model), 這類的模型不僅只能在單一仿真器上運行,其效率也常只與原電路設計相當而沒有加速的效果,故若非無技可失,筆者並不建議採用這種方式來建模。

時至今日,業界已推出數種標準的建模規格:如IBIS (輸入輸出緩沖器信息標準)及Verilog-A等, 其中IBIS 又較為廣泛採用。IBIS已是ANSI(美國國家標準機構)認可之規格,其詳細資訊可在此取得