IBIS-AMI: 現有AMI流程對DDR非對稱之Rt/Ft適用性之研究

[這篇貼文系為2019 DesignCon IBIS Summit發表的同標題文章做準備, 相關簡報檔及現場錄音(英文)已連結於此文之末。]又:此研究是由本司分在美國及東京的兩位顧問共同準備。

研究動機:

IBIS委員會下有一個工作小組(ATM: Advanced Technology Modeling)在美國這邊每週二中午開會; 若是有空話我都會儘量與會以了解最新的建模趨勢及資訊。自2018年中開始, DDR5於AMI上運用的課題便成為會議討論的焦點。主因在於現今的AMI參考流程係以差分訊號或SERDES為主;舉例來說, SPEC裡談到傳入AMI_GetWave的訊號是由正負0.5間所驅動, 而儘用單一的impulse response來執行AMI_Init似也象徵著Rise time (Rt)及Fall time (Ft)是相同的。現有的AMI流程是否能大致原封不動地套到DDR的單端信號如DQ上便引起了熱烈的討論; 與會的不同EDA廠家對此都有不同的看法, 有些認為問題不大可直接套用, 另有些則認為這裡有根本上的問題而非得砍掉重練不足以應用於DDR5之上。IBIS 規格若要改變向來不是那麼簡單的…覺得規格有不足之處的廠家得以buffer issue resolution document (BIRD)的書面文件表達意見及想倡議的改變; 但如此做則不免要揭露本身的商業秘密或是自曝其短, 所以時至今日並未有如此的倡議產生。對於一建模服務為主的本司而言, 則不免好奇而想像倒底一仿真器能在何種情況下不變現有流程而能直接支援DDR5? 這篇論文便是想出這樣的”一種可能”是如何運作; 實際上大EDA廠可能早已有思慮更稹密的設計而比此處所倡議的更週到,但這麼”一種可能”的存在便應足以取信建模者不需再等待規格的改變而可開始構思DDR的AMI應如何的被建構。

AMI_Init:

通道分析一般有兩種方法: “Statistical” 及 “Bit-by-bit”; 不論是採用何種方法, 流程一開始之初便是仿真器對含類比前端(及IBIS BUFFER)在內的channel進行”calibration/characterization”(以下紅框內所示)。目的是要取得這中間LTI channel部份的突波響應 (impulse response)。對於一SERDES其RT/FT為稱而言, 如此取得在”calibrate”之後的突波便會依序先傳給TX EQ而後再傳給RX EQ, 最終的結果回到仿真器去依機率統計來計算probability density function (PDF), 積分而得 cumulative density function (CDF),再來畫出如浴盆曲線等等的結果。

教科書裡對於突波響應的定義是在無限短的時間內輸入信號由0至1回到0所造成的響應。在實際上, 仿真流程裡最小的時間單位是一個時步, 而含有類比BUFFER的部份是沒有在同一時步內做兩次的信號變換的。所以一般的作法都是改用階波響應而後再加以做一階微分而得到突波。對於一Rt/Ft不同的情況而言,其上升及下降階波並不相同, 也就是說, 如此得到的突波會有兩種形式, 則如果流程不變, 是要把那個突波送進模型裡了?這裡要先提的一點是:暨然是由仿真器對channel來仿真以得到calibrate的波形, 則其可自由地去”probe”不同的節點而有任何它想要知道的資訊。

Asymmetric Rt/Ft:

有的人可能會想:規格裡沒有規定AMI模型在流程裡只可被叫一次, 也就是說理論上而言,仿真器可跑連續兩次流程: 第一次用上升沿算出的突波、第二次再用下降沿算出的突波..分別來運用。如此做不但要花兩倍的時間, 主要的是若在同一個process裡, 一個.dll等的模型被叫兩次..也就是先被叫AMI_Close後又AMI_Init的話,則取決於模型的編程, 很可能會有穩定度的問題。比如說如果第一次叫AMI_Close時記憶體沒清好, 則第二次AMI_Init的呼叫就未必會得到和第一次叫時同樣的結果,如此一來等於仿真器的穩定性就不能保證了。

如上所示, 如果仿真器在Calibrate的時候用的是一個UI很大的方波, 則其響應同時會有上升及下降階波的部份。如果說在這過程中, 仿真器同時去probe TX analog buffer PAD端的話, 上升及下降時對channel的輸入是X1(t)及X2(t), 而其在RX PAD端的響應是Y1(t)及Y2(t), 因為吾人可以導出一轉移函式Xform(t)其在兩輸入信號X1(t), X2(t)之間做轉換,而整個interconnect又是LTI的, 所以Y1(t)及Y2(t)之間存在的也應就是同樣的轉移函式。也就是說, 不論仿真器傳進AMI模型裡的是由上升或下降沿所得的突波, 因其有Xform(t)的資訊, 兩種都Y1(t)及Y2(t)都可在最後透過轉換而取得, 也就是說:一仿真器可透過現有的AMI流程而得到兩個不同的響應。

依據這個想法我們寫了一個簡單的matlab script, 其將不同的輸入訊號inp1 及inp2 之間的轉移函式Xform(t)算了出來, 而後把由當輸入為inp2時的實際輸出out2各由輸入為inp1時透過Xform(t)所重建的理想inp2的輸出out2’來比較, 其可完整的重合在一起, 也就是說驗證了這個理論的可行性。

而一旦我們有分自兩個不同斜率所得的完整響應之後,就分別去建構出兩個不同的眼圖, 再把兩眼圖中分屬於上升沿及下降沿的部份抓出來合成一個眼圖…這就是在非對稱Rt/Ft之下應得的眼圖, 其與SERDES的應會不同…即應會顯示非對稱性。

其次, 對於不同Rt/Ft在PDF的計算上也有點不同, 因其必需考慮到之前位元的值為何而不是在不同位元間相互獨立。比如說在算SERDES的PDF時, 若不考慮到編碼(如8b10b)的話, 每一個位元出現0和1的機率各為50%, 也就是因此吾人能透過不同位元間pdf的相互convolve而得到最終的pdf; 但Rt/Ft不同時,我們要分別就上升沿和下降沿的階波做考量, 如果是cursor用的是上升沿的話, 表示這個位元現值為1且前值(cursor – 1)為0, 同樣的, cursor-2分有0 和1 兩種可能, 若其為1, 則在cursor-1所形成的下降沿波尾部份會和現cursor的部份做重合, 凡此種種, 意即一個仿真器得事先決定要追踪的位元深度,而後就此深度內每一個0或一的可能做如樹狀的記錄, 最後再把這記錄內不同時間點上升沿或下降沿的部份去在cursor的那點做疊加而得到最終波形, 這些工作自不簡單, 但全是仿真器裡可做而與AMI模型無涉的。

AMI_GetWave:

根據SPEC建議的標準流程:在bit-by-bit模式中, 數位位元列傳給TX AMI後, EQ過的TX信號由仿真器和Channel的突波做Convolution再把這信號傳給RX AMI 做末端的EQ, 這期間,不論是TX EQ 或是RX EQ都有可能不是LTI地等化信號, 所以之前倡議的Xform(t)轉移函式在此並不適用。

假設先這樣想: SPEC裡只規定仿真器在此處理的是TX EQ出來及輸入到RX EQ前的信號, 而其方式是與Channel的突波做convolution, 那是否有這建議以外的做法又不動到標準流程呢?

如此的一個例子如上圖上半部:假設仿真器並不是用convolve的方式, 而是把那TX EQ出來的信號透過傳統transient simulation的方式來得到在channel末端的波形, 那所有因不同Rt/Ft所造成的影響也就自動包含在裡面而不需要去做額外處理了;但這樣的做法不僅慢(因為要跑傳統時域分析), 且也和規格建議的做法甚為不同, 所以我懷疑真有仿真器是如此運作。

另一種可能是先把TX EQ的輸出和一個UI的數位信號做de-convolve, 把這UI的方波算在channel的頭上而用仿真器去把channel 對這方波的響應算出來, 這樣一來Rt/Ft的不同儘在這方波裡, 而因為只有一個方波…在做最後Convolve時應會快得多, 那這樣做是否就可解決問題了呢?

實則未然…如上圖所示, 當我們用Rt/Ft不同的方波透過Convolve的方式去合成不同位元的信號波形時, 會造成一些”glitch”,這是因為利用疊加的方法並不能把Rt+Ft變成一個平線, 也就是說若有連續同樣的位元信號如01111或10000時, 用方波Convolve形成的合成波形在都是1或都是0的尾端不會有一static state. 其glitch的程度取決於Rt和Ft有多不同, 也就是說, 在這種情況下, 應用Rise或Fall 的階波去算才能得到理想的效果(接下來細節仍很多, 不再往下探討)

結語:

在這篇文章中, 我們討論了若要將現有IBIS Spec裡的reference flow (參考流程)直接套用到有不同Rt/Ft的如DDR的信號時, 仿真器可能有的做法。結論是這是可行的…但仿真器裡得有更多複雜的計算方法以將不同會造成誤差的可能都能考慮進去。當channel analysis係以”statistical”模式進行時, 因為EDA軟體在characterization/calibration的過程中可對任一設計上的節點做量測, 所以其可以有任何想要的資訊, 其中可利用的是在類比TX及RX PAD上的瞬態波形, 透過上升沿及下降沿的波形, 仿真器可預算出一轉移函式, 這函式因整個流程是LTI的關係而也可套用到接收端的信號而使得不論當初AMI_Init時送進的是什麼(上升或下降)沿的算出的突波, 都能將其結果在事後在相互間轉換, 從而兩種資料以合成出不對稱的眼圖, 其間也要做的包括了用如樹狀的追索以對不同cursor處的不同位元做考量…而不是如二項式分佈般每位元間相互獨立。在bit-by-bit流程中, 因為參考流程的限制較多…中間的計算需以channel的突波以convolve方式為之, 而又因非LTI的關係使得不能透過一線性函式相互轉換, 故而仿真器得另闢磎徑…其最終可能得用上升及下降沿的波形(而非突波)來做計算,否則在不同Rt/Ft的情形下, 在原本應是steady state的地方會有glitch的現象…而其大小取決於Rt/Ft間相異的程度。

相關連結:

簡報檔: [請按這] http://www.spisim.com/support/paperetc/20180202_DesignConSummit_SPISim.pdf

現場錄音(英文): [請按這]

IBIS-AMI: CTLE二三事

前言:

中文翻做”連續時間性線性均衡器”的continuous time linear equalizer (以下簡寫為CTLE), 常在現今通信渠道(communication channel)裡被使用; 當一channel信號損耗較大時, CTLE常被拿來為接收端或下游的鏈路做為減少失真、恢復原始信號的一種方式; 在網上已有許多有關CTLE在理論如何運作的探討, 更深入的設計細節也在大學/研究所程度的教科書裡找得到;在這篇貼文裡, 在簡短介紹CTLE為何之後,我想要以為CTLE 建IBIS-AMI模型的角度談一些實務上的考量;其中雖然一些關鍵處為了業務機密的考量只能點到為止, 但仍希望會對考量建模步驟或流程的讀者有些幫助。

[Credit]: 這篇貼文的一些用圖來自Sam Palermo教授的課程摘要(連結於下), 雖然共事時彼此不認識,但我們之前都同一時期在在Intel工作過…

ECEN 720: High-Speed Links Circuits and Systems

 

什麼是CTLE及為何用它:

上圖為兩個常見的SERDES通道原理圖, 上方者在TX及RX間直接為被動性的channel所連接;而下方者則是透過了位於中央的repeater把上下游兩個Channel連接起來;在很多界面裡(如USB3), 這種串接(cascade)可以連續好幾次, 所以會有兩個或更多的channel相連接;這些通道裡的Rx端或Repeater/Redriver裡就可能會有CTLE;而圖中的”S” 方塊係泛指如封裝、通孔VIA、傳輸線及連接器connector等等被動元件的合成S參數;這些通道元件有些共通的特性..如在頻域上對不同頻率會有不同的耗損/速率改變, 這種現象一般稱為色散(dispersion)

舉例來說, 我們可以把這些以S參數代表的差分輸入/輸出曲線在頻域上畫出來, 就會得到如上圖的不同損耗曲線。

在現今數位通信的傳送的位元信號多是以方波來表示0與1, 我們知道這些波形裡的快速上升或下降轉換過程(rising/falling transition)含有豐富頻率成分的部份;理論上來說,要保持被傳信號不失真,這些不同頻率的成分應被一視同仁地被續傳下去,但現實上這種所謂的unit-gain all pass filter並不存在, 所以各種頻率成份也就或多或少地被放大或縮減了; 如果下圖中的綠框代表我們想要得到的這種理想無失真狀態:

而實際上的通道卻是如紅框所示, 則要為信號加以補償,吾人所需加入的就是如藍框的線性均衡器,而這也就是為什麼均衡器常被使用於有損通道的原因:由於線性關係其在頻域上可和通道的特性曲線直接相乘而得到趨進理想的傳輸特性;這裡有兩點值得注意: 其一是均衡器和所欲補償的耗損是配對的, 也就是說若拿同一均衡器來套到不同損耗的通路,就可能會有補償過度或不足的情形;其二是CTLE只是這裡所示均衡器裡的一種或一個環節。

CTLE 只是linear equalizer裡的一種:

線性均衡器可以用很多方式來設計或呈現;舉例來說, 如下的feed-forward equalizer就被常被用於Tx及DFE端:

這類的均衡器的頻響有部份限制, 但其作用較易於理解且AMI實作上也不難, 比如說如果只有一個tap的話, 其對波峰/波谷在時域上的作用可以很容易地被了解, 適當值也可藉由掃描而後做內/外插:

但本文所談的CTLE則是代表廣義的均衡器,所以我們常用其頻域上的響應來代表其行為作用;也就是說, 為了如之前所提地對不同耗損的通道做信號的補償,吾人就要有許多不同、相對應的CTLE特性曲線如下所示:

那我們要如何才能得到代表這些行為的資料以便建模呢:

建CTLE IBIS-AMI模型的不同資料形態:

雖然到此為止我們只說到頻域的部份,但拿到以AMI為主的鏈路分析上還是要回到時域來和輸入信號做卷積, 這是因為就SPEC規格上的定義來說, 一個AMI模型所會接收到的輸入不是時域的突波(impulse response)就是時域上的位元波; 前者係用於statistical 模式而後者主要用於bit-by-bit模式,這麼一來,我們就有兩種為模型提供資料的可能: 分別是提供頻域或時域上的資料; 前者(頻域)的好處是其可針對要做鏈路分析的脈波速率及取樣頻率當場在模型裡來做傅利葉反轉(iFFT), 後者(時域)的好處則是所提供的資料已事先檢查過而可確認具有適當的品質;雖然實務上這兩者擇一而用即可,但最具延展性、擴充性的實做方式(也就是本司的實作方式:-) )則是對兩者均支援而能減少對AMI模型的改寫、編譯次數。

  • 頻域資料: 取決於原始設計/資料可否使用的程度, 我們可藉由以下不同的方式來獲得頻域上的資料以便為AMI建CTLE的模型:
  1. 極點及零點: 由不同數目及位置的極點及零點, 再加上DC的放大程度, 則吾人可以”合成”出頻域的響應:  比如說如果我們手上所有的資料只是待建模型的資料表(data sheet),則首先可以從上面找出關鍵頻率必需要有的放大程度 上圖的例子是USB3.1, 所以關鍵頻率是和其運作主頻相關的諧波;當對不同數目、位置及DC放大性做掃描之後, 我們就可以很容易地找到幾組符合此data sheet spec的頻率響應:也因為這些曲線係由預訂的線性函式(由那些極零點所組成)所產出, 所以一則為相對穩定、高品質而不會有passive/causality上的問題,再者也從0Hz 到極高頻皆唾手可得。
  2. 由S參數轉出: 另一種可能是由代表此均衡器的S參數來轉出, 適用的場合包括當矽智財為外購而原始設計不可得, 原智財有方只願提供此行為模型時(behavioral model); 從某個方面上來看, 這樣的原始資料代表在後面的correlation驗證階段會更容易…因為這就是要去建AMI模型的golden data/target, 但在另一方面的大部份情況下, 這也代表得先為這些S參數做一些預處理才能得到如上段結果般的頻響曲線。以用本司的SPro功能而言, 下面幾個步驟是不可或缺的: 首先手上的S參數可能是單端點(single ended)且適於某種port ordering的 (如1->3, 2->4), 則先要做port reordering 至1, 2->3, 4, 而後用generalized 2-N port 做differential mode/mixed mode 轉換,而後外插到DC及夠高的頻率(由VNA等所得的頻率通常只有10或20GB…這是遠遠不夠的), 在外插的過程中所有的計算均需使得這個S參數仍能保持適當的物理性(如causal), 最後再把只適用於differential input->differential-output的那個部份從S參數裡extract出來成單一一條頻響曲線(含magnitude及phase)。
  3. 做AC仿真: 如果有原始設計的話,當然直接做AC仿真可能更快更方便些, 雖是如此, 如此得到的曲線仍需先做資料我檢查及驗證(sanity check), 比如說相位是否連續、頻寬是否足夠及在高頻及低頻時, 所有的大小及相位是否趨於平坦等等。
  • 時域資料: 一旦有了上述的頻域資料, 理論上來說我們就可多做一步地把它們都轉到如下所示的時域上;這裡也可以有兩種做法:把原頻響做iFFT或把原始設計在時域上仿真。
    1. 如何做iFFT: 這裡適用的情況可能是您不打算從AMI必需要有的C/C++語言來做iFFT而想藉助如matlab或python等的機制, 雖然這些數值分析的套裝軟體或函式庫已會幫您做很多幕後的工作(如線性等距取樣至2^N點的), 但zero padding或complex conjugate padding至Nyquist rate通常還是得用戶自己做; 同樣地,在做iFFT轉換前的頻率資料是否”乾淨”也是得自己下場檢視的。略過此一步驟則轉出的時域可能就會有很多低頻的噪音或波動。
    2. 做時域仿真: 理論上的突波響應(impulse response)不難理解,但實務上要如何設定仿真? 就算是以階波響應再做事後的差分好了, 階波的上升速度應多快? 其與到時AMI被仿真時的時步(time-step)之間關係為何? 若需要臨場的縮放(scaling)那AMI模型要如何地得到原時時步/設定的資訊? 如此種種都是當事先要轉成時域資料時不可不想到的細節。

建CTLE IBIS-AMI模型時的種種考量:

好不容易終於有可建模的資料了, 下一步是如何把這些資料以C/C++的形態呈現以符會AMI的API 所需, 比如說下面幾點都要想到:

  • 如何決定用那條曲線: 如前所述, CTLE和不同耗損的通道是有相對應的,則當AMI模型用戶在使用此CTLE的AMI模型時, 要怎麼知道該用那個設定呢?

常見的方式是在模型使用手冊裡明載而讓用戶依據其自己現有通道的耗損來自行決定, 這就沒什麼學問了; 更進一步的可能是在CTLE的模型裡設有自動調適化的機制(adaptive), 則這就又是另一課題…

簡單來說, 要做可自動調適的CTLE首先必需把能使用的曲線/頻響做一EQ程度的排序, 而後要對模型針對某一輸入信號所均衡出的結果做一效能的定義(figure of merit, or FOM), 則當模型得到一輸入信號時, 先就現有的CTLE設定做信號均衡、而後計算出FOM值, 接著繼續以相鄰的CTLE設定去做同樣的步驟,以結果FOM的正負變化來決定繼續往上或往下”走”, 如此重覆直到FOM已穩定 (locked)於某一設定或達到所有的CTLE的極值(第一條或最後一條頻響)為止, 因為如此步驟的結果應對某個通道的不同信號都適用, 所以在鏈路仿真之初會要有一段時間的training period以便能鎖定到要用的CTLE值之後才不再改變等等。

  • 種種EQ的設定: 當我們有了不同組態的不同設定, 再加上可能不同corner等於多加了一個dimension, 再來要怎麼編程以符合AMI API的要求呢?

這裡開始可能更多的是computer science上的考量而和原始CTLE設計無關了, 總的來說是方便及速度的間的考量: 比如說我們可能想把所有資料的全部頻域/時域資料都以極細頻率/時步的方式提供,但發現這樣一來模型太大且仍不可避免要做內插, 或是如果所給的資料非等步且非2^N(常為FFT/iFFT所需), 又要如何有效的重新取樣? 最後, 這些資料如果直接一同編進DLL/SO二進位檔裡則每次設計更改(design revision)都要重新編譯, 放在外面呢又要如何的加密以確保原始資料的IP等等,這些都是在開始寫CODE編程之前都要先做好的規劃及考量。

  • 如何驗證模型: 好不容易模型做出來了, 如果按照golden data或和原始設計來比的的話, 這個CTLE應能有效地把下圖左的訊號還原至失真小得多的右圖:

現實裡要能一次達標或一試中的機率大概和買樂透中獎的機率差不多, 所以多半的情況模型做出來後接下來的是折磨人的除錯階段; 在AMI模型之外, 要能得到上述結果也不可不考慮到的還包括了IBIS模型的部份(類比前端), 因為這些IBIS裡的parasitic, loading 乃至於 rising/falling waveform 再再都會影響結果, 關於此點我們之前的貼文也有詳述, 其次,仍是點到為止的是IBIS-AMI是有高阻抗假設的, 所以要直接取代(drop-in replacement)手上現有的其它原始模組還要考慮到的是匹配的問題; 最後, 一個設計完善的CTLE AMI模型(或AMI模型)都要有很完善的除錯設計, 如此可指引出所給資料是否在重新取樣後質變、轉成時域後有問題、或是按時步縮放結果恰當與否等等而毋需反覆重新編譯模型搞得不知手上的波形是那一版本的AMI跑出來的結果。

結語:

凡此種種,應可讓有興趣的讀者看出一CTLE雖然理論上不難了解,但一旦要落實到低階的、以C/C++編寫的AMI模型時則又是另一番境地;本司就看過堂堂EDA大廠做出的CTLE模型是如何的便宜行事, 以至於後來原建案的矽智財廠商僅僅為了一些design revision(也僅是要容納更多的頻響選擇)就必需砍掉全部重練的案例, 這當然也是因為其把所有的設定都編進模型了又漫天喊價以至於矽智財廠不甘從此被綁架而找上經濟實惠的本司之故 🙂 。希望本文所提的幾點, 能做為有心直接下海實做AMI模型的諸君一些實務上的考量, 或是能了解其中”眉角”之一二之後決定由經驗如我司者來為您服務更為方便有效率:-)

差分IBIS建模流程:概觀

我們之前已寫過一些有關IBIS的建模流程的貼文,其中所提重心是針對單端點(single-ended)放大器的建模;主要的原因有下列幾點:

  • 單端點放大器建模流程較簡單直接、在才開始學建模的情形下較易上手;
  • 假性(pseudo)差分放大器是直接可以用兩個單端點放大器組合起來的;
  • 許多半或全差分放大器(half/true differential)即便是用假性差分建模流程來進行結果精確性也未必會較差[參考]
  • 完全的半/全差分放大器建模牽涉到非能線性進行的步驟而麻煩許多。

上個月在台灣辦的講習裡,有數位同業問到CML(current mode logic)的建模。。。其便是屬於半/全差分放大器的範疇;也由於現在很多的IO界面都是走SERDES(如USB, SAGA, PCIe等等),再加上已介紹過單端放大器建模流程後,也實也應繼續往下走︔故在這篇的貼文裡,我們便要談談差分放大器的建模流程,並在下篇的文章裡,簡介其中分析細節及這些設計理念在我們的建模工具SPIBPro裡是如何體現的。

要說明的是這兩篇的內容也係為年底要在亞洲IBIS Summit發表的文章所準備,相關簡報檔會在會議之後再於此更新並發佈。又這篇簡介裡的內容多係由IBIS cookbook總結而來,其可在IBIS官網上下載。

差分緩衝/放大器之分類:

一般來說差分大器可分為下列幾類:

  • 假性差分 (pseudo differential): 即如下圖中最右所示;這種差分放大器在P及N電路間是完全互相獨立而沒有任何藕合的︔兩個部分的電路可各自獨立運作而不互相影響。
  • 半差分 (half differential): 即如下圖圖中所示;其上拉端為互相獨立,唯下接到地的部份同經過一個電流源,所以輸出電流是共享的而會相互影響。
  • 全差分 (true differential): 即如下圖圖左所示;其不論是上拉或是下接到地的路徑都相互藕合而彼此影響。上接部份用的是電流鏡的設計(current mirror), 下接到地的部份則共享同一電流源。

對於假性差分而言,其可用兩個獨立的單端點放大器來描述︔這兩個放大器可以是不同的模型、也可以是由同一模型的兩個Instances再由反相的輸入所組成。在IBIS建模上、只要單獨將那單端點放大器建模完成後,再在IBIS檔案裡以”[Diff Pin]”的關鍵字表述那兩個針腳有差分關係即可。如下所示:

上面的範例描述的是pin 2 及pin 3互為差分,而pin 6 與pin 5也互為差分信號;當然在IBIS檔案裡的其它地方這四個針腳所接的(單端點)模型也需有所定義及描述。

半/全差分放大器:

對於這兩類的差分放大器、因其P及N輸出端間有程度不同的藕合性,故所需以描述的內容就不單單是上面[Diff Pin]了(仍是需要的),一般來說有下面兩種描述方式:

  • Series: 為了描述P/N輸出間的藕合,在IBIS檔案裡有兩個地方必需加入相關內容。其一是用”[series pin mapping]“來描述在那兩個差分針腳間有藕合的情況︔然後再此藕合電路以Series Model的模型形態來表述:

如上所示:在用[Diff Pin]來描述針腳間互為差分之後,假設某對差分針腳之間有藕合的情況而必需用額外的電路來表述,則另需在[Series Pin Mapping]下來定義。而其模型(以上為例是R_SERIES_100)之model_type必需是series, 且也需依預定的IBIS格式表之。series模型內容非可自定之自由格式,其內容需為R/L/C/Series Current/Series MOSFET任一或更多的元件;至於其數值則是在建模流程間由仿真後處理的結果。Series Current 可以描述的是一維的IV曲線。。也就是非線性電阻;而Series MOSFET則可透過至多有一百個的表格來描述二維的表面取樣點。

  • External Model: 另一種描述差分放大器的方式是在外接模型裡完全自訂。在IBIS標準裡有下列四種模型態式可用以表述差分:

如其右方之說明所示,這些模型的內容需以其它語言:Spice, VHDL-AMS, Verilog-AMS, IBIS Spice Sub-circuits (IBIS ISS)來描述;也因為是用不同的語言,所以裡面倒底包括並沒有另外的限制。。。。建模者想用Spice, VHDL, Verilog等的語言寫什麼都可以。因為如此,IBIS在這裡的角色就只是外包裝(wrapper)而並沒有太大的可攜性的意義(相較於IBIS,不是每個仿真器都支援這些語言的)

如上圖所示,在一個外包裝的模型(名為VHDLAMS-DRV)之下內含有另一個以VHDL描述的差分模型;需強調的是模型內容雖可由建模者自行編寫定義,但其連接的端點(port)則需從在IBIS格式裡預先定義好的兩個或更多個關鍵字裡取用,且定義的順序也必需就是在VHDL/Verilog內等所用相對應的Terminal的順序︔這些VHDL/Verilog/IBIS ISS等檔案是外含而不包括在同一個IBIS檔案裡的。

建模流程:

前面一段所提第二法:即純[External Model]的模型表述因其內容全由建模者決定,故就流程上而言就沒有暨定的方式。在下面所討論的流程、係針對第一種模型表述方式、即Series/Series Model而言的,因為其有固定的格式及內容,故在如何算出這些數值的方法上就有值得深究的需要。

一般而言,由於這樣的差分放大器描述方式是利用series模型來專門描述P/N間藕合的情況,而除去這series電路後就必需是可單獨運作而互相獨立的部份,故在流程計算上以分別針對這兩個部份來作區別︔最後再用第一段所談到的幾個關鍵字將其在IBIS檔案裡組合起來。

針對上圖中”Driver”區塊的部分,因其就是等於除去藕合Series電路之後的單端點放大器,所以便如以往所提:所有PU/PD/PC/GC/VT等表格當存在時都依同方式提取出來,差別的地方是必需得在”能分離藕合電路影響”的情況下仿真轉出:

  • PU/PD: 如上圖裡右上方所示,需在P及N點的輸出接上電壓源分別做 -Vcc~2Vcc的掃描︔在後處理的過程中,一個主要的假設是當P/N兩點都在相同電壓時,series電路的部份是沒有任何電流經過的。也就是說:PN相同的電壓時的同模模式(common-mode)下,為掃描所接之電壓源對放大器所提供或取用的任何電流都是只為Driver區塊所用的,由於P/N兩電路的輸入互為反相,故這同模時的上拉及下拉電流也就等於是driver區塊的PU/PD IV對照表內容。由於我們做的是二維的掃描,除了同模的那一直線(對角線)之外都是屬於差模(即P/N輸出點電壓不相同)的情況,而在那些點量出的電流都同時包括了差模及同模的部份。由於我們已將同模的電流算出來了,故差模的電流也就等於是在那點量測值再將同點電壓時的同模電流減去︔對於整個掃出的二維平面而言,隔出的差模電流就等於是將同模電流減去後的垂直位移︔而後再要做的就是看以何種方式來描述這位移後的二維平面以便在做VT仿真時也能將其減去。
  • PC/GC: 在IBIS規格裡,箝位電路的電流並非必需要有的。唯有當放大器裡有這類不能透過輸入信號的高、低位準來將其關閉的部份時,流經這些部份的電流才需以IV的內容形式放在PC/GC的表格裡的。在以前單端點電路時,箝位ESD電路即屬於這部份︔對差分放大器而言,半差分形式放大器裡的上拉電路也是屬於無法被關閉的部份而需將其算入PC/GC的表格裡。仿真的情況則是將緩沖器置於非開非關的High-Z而後如以前方式做P/N同電壓的同模仿真︔而後此同模電流的部份在後處理後就被放在PC/GC表裡。至於差模電流的部份,因其也會被包含在PU/PD的差模電流裡而算在series模型裡。。series則是始終存在而無法被開關的,故也就無需另計分離出來也不會有被double count的顧慮。
  • C_Comp/C_Diff:

C_Die 電容的計算也是差分放大器建模裡較不同的地方;在單端點放大器建模時,C_Comp的值在後處理時算出來再放在IBIS模型裡即可,其並不會在VT之瞬態仿真裡所用到︔但在差分建模裡,C_Diff的部份便得事先算出來,且也加入series模型裡,然後再一起用於VT的仿真以便在瞬態裡的各點都能將series模型的影響來抵消。算出C_Diff的公式如上所示︔其內容可加在series model裡的c series的部份。

  • VT waveform: 差分放大器建模的VT仿真,除了原有被建模的放大器及相關激勵或偏壓的輸入外,也必需要有一個描述藕合情形的series model一起參與仿真︔而且這個加入的部份是為了取消同樣series model在模型裡的影響(以便轉出的VT表格係為獨立的Driver區塊所用),故電流流向需相反;這就是上上圖裡Idiff有負號的原因。如前所述,這個series model裡包括的資訊除了有屬於靜態IV掃描後消去同模電流的差模部份,也必需包括了已事先算出的C_Diff部份以便反應瞬態間series model的影響︔C_Diff部份自可以一電容值表示之,而靜態差分電流部份則可利用下列兩者方式之一來表述:
    • 用E/F/G/H等的受控電壓電流源來表示所建之二維差分電流內容。比如說用最小化MSE(mean squared error)的方式來以一二次式表示此二維表面,而後再用受控源的”Poly”語法來將此二次式的參數表示並以spice元件表示;
    • 決定適用的series element而後建出相對應的series model,此法的前提是仿真器需能支援這裡產生的series model而在VT仿真中運用。

之前的IBIS Summit已對上述部份有些範例及研究,比如說[這一篇]發表就很有代表性。

 由上面的探討,吾人可以發現差分放大器建模的流程是非線性的、也就是非可一氣呵成的︔主要的原因是在建立series model以表示靜態及瞬態的差分電流部分有很多可用人為來取捨的空間︔其次,得事先算出靜態I_Diff及C_Diff後才能繼續進行VT仿真也是和之前很不同的地方而必需依序進行的。這篇的貼文旨在描述差分模型的語法表示方式及大致的建模流程及概念︔下篇的貼文裡我們會談到更多的細節並看看這些設計理念如何落實於我們的建模工具SPIBPro裡。

仿真器之研發:架構

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