IBIS-AMI: 利用Proxy類別來做模型分析

前言:

近幾年來在IBIS-AMI建模討論上常被提到的課題一是透過back channel來對Tx或Rx或兩者同時優化, 目的是要找出一組最佳參數的組合以使channel的效能達到最佳化。至今為止的IBIS Spec並無法對此一流程做出定義及支援, 所以資料的交換僅限於仿真器及各個模型本身、而非模型與模型間。除了這點限制外,建模者也常常會遇到下列一個或多種狀況:1. 仿真器及參與運作的各模型間對Spec.版本的支援並不一致, 2.其IP來源可能是不同的矽智財供應商 3.可能核心部份所編寫的語言也未必一樣, 比如說可能是用matlab的P-code; 在這些情況下, 常因為程式源碼的不可得而必需遷就現有建好的模型或檔案, 則要進行不同模型間的co-optimization也就更困難了;為了克服以上所提到的問題,我們可以利用proxy 類別來進行AMI模型的分析或實驗。

本文係為在2017年DesignCon所欲發表的同名文章準備所寫, 連同發表的簡報檔案及屆時的錄音, 已於此文的底下加入連結以供向隅者下載參考。

AMI流程裡的物件角色:

IBIS Spec.的讀者不難發現:在第十章(Algorithmic Modeling)裡所談到的都是參與AMI流程裡兩個物件角色的分責及應用;這兩個角色分別是1. EDA Tool (常是仿真器), 2.一或更多個參與仿真的AMI模型。AMI應用程式界面裡定義好仿真器需將以.ami為附檔名的參數檔讀進並做範圍及型態上的檢核, 而後將Model Specific的部份以資料對(key-value pair)的格式傳給相對應的模型。在模型與模型之間,並沒有可互相傳遞訊息的機制。

以上述.ami檔的內容為例, EDA軟體得負責讀入此檔, 然後因為”GetWave_Exists”設為True而了解到此模型有AMI_GetWave的函式的存在, 其次因為Use_Init_Output設為False故知在仿真過程中應呼叫AMI_GetWave來做資料上的處理而非透AMI_Init來進行。在此之外的Model_Specific部份則非EDA Tool所需考慮及了解, 而只需將其Parse成資料對傳入模型:

當我們用除錯器在API函式入口設break point後,便可看到由EDA軟體傳進來的值, 其格式已和原.ami裡的不同。這裡要強調的是如果建模者的函式原始宣告與API定義的不符,則EDA軟體是無法對這模型的.dll/.so進行加載而在這break point裡停下來的。

透過最近新加的back-channel interface (BCI)提案, 新的AMI API函式也有所新增及改變以便能支援不同模型間的相互資料交換:

對此有興趣的讀者可至IBIS官網找到BIRD147.1_Draft的相關文件做更深入的了解。簡單言之, 各模型間可利用此新的協定以實體檔案的方式來交換資料。而由於這些AMI參數是新加的, 也就需要為所使用的仿真器支援才能開始運作。

過去幾年來幾間EDA廠商已為這BCI的運作模式進行角力…有興趣的讀者也可在這兩年IBIS Summit的相關發表文章裡找到資訊, 大略言之, 他們對下列幾種情況的見解有異:

  • 如果舊的AMI模可無法重新編譯, 也就是說它們停留在舊版本的話, 則不同廠家所提供的AMI模型要如何一起運作?
  • 對仿真器而言,其是否應主動地介入不同模型間優化的過程, 或是讓模型自己跑就好?
  • 不同模型間優化的協定是否應成為IBIS Spec的一部份或只要參與模型自行設定、相互了解即可?

在此之外, 我們認為下列的情形也構成co-optimization流程的鴻溝:

  • 做為一仿真器的研發人員(就是有仿真器的源碼),我如何用手上現有的AMI模型做co-optimization的測試
  • 做為一AMI建模者而言,我所用的仿真器可能不會每年更新, 那我要如何測試現有的模型以確保其可使用BCI協定無誤?
  • 做為一AMI模型的使用者言,我只能得到仿真器後處理後的結果,但若其有誤, 我如何能檢查仿真器及各模型間相互傳遞的資料以便偵錯?

凡此種種,都可利用Proxy類別的物件來做處理, 以下就為此一構想做更詳細的說明:

Proxy類別:

上圖所示為Proxy的UML, 最上方的虛線代表的是”has a”的關係, 而下方的垂直實線代表的則是”is a”的類別繼承關係,這UML可解讀為:”一個Client有一個或多個的Subject, 每個Subject都有繼承界面並執行DoAction的方法, 其中的一個物件是個Proxy類別, 當Proxy的DoAction被呼叫時, 其又轉而呼叫了RealSubject的DoAction函式

把這種關係套到IBIS-AMI的關係裡, 則可解讀為:”一個EDA軟體可加載一個或更多的.dll/.so, 其每個都有合乎IBIS-AMI API的函式如AMI_Init, AMI_GetWave及AMI_Close等, 其中的一個.dll/so實則為Proxy物件, 當其API函式被呼叫時, 便轉而呼叫RealSubject (即實際運做計算的模型)的AMI-API函式以做資料處理“。

所以Proxy類別或物件可視為一個包在真實模型之外的wrapper, 這個proxy物件雖為EDA軟體所加載, 但它其實只是”中間人”, 而可在其間把要EDA軟體要傳給真實模型間的訊息加以截取、記錄或改變、或甚至是更改運作的流程。對於一接獲訊息的真實模型而言, 其也並不知道呼叫它的實際上並不是EDA軟體本身而是Proxy物件, 所以便有可能做出實際EDA軟體並不支援或尚未支援的工作。在上圖的源碼截圖中,可見到Proxy的AMI_Init函式做的是把真實模型的.dll/.so加載進來, 並轉而呼叫其內含的AMI_Init函式。

透過這種Proxy的類別或物件, 我們可以做一些有用的測試或實驗:

Consistency/Stress測試:

以下的例子所示範的是同一API函式及相同的資料被呼叫了許多次, 其目的是要做兩種測試:

  • Consistency test: 若給與相同的輸入資料, 其傳回的結果也應一致, 尤其如果這個模型是LTI的話(未與歷史記錄有關)
  • Stress test: 模型所用的資源如CPU或記憶體等不應隨著被呼叫次數而一直增加,除非有memory leak等的臭蟲

之所以要做這些測試, 是因為在IBIS Spec裡有特別提到, 當EDA軟體或仿真器欲對一長串的位元資料(比如說數百萬位元)做計算時, 其可以把這長串的資料分隔成不同的區塊再依次對同一AMI_GetWave函式做呼叫計算。也就是說, 一個良好的AMI模型應要能通過這兩種初步測試。

Co-Optimization(程序內):

第二個的實驗是把Tx及Rx的模型綁在一起以便一起做如優化的工作 (巡迴直至某種組合的參數能讓整體的功效最佳化)

首先, 從IBIS Spec或是上圖中可見, EDA軟體會以輸入1或4做來先對Tx傳值並在模型裡做響應計算, 之後再把結果和Channel做Convolution而最終傳值給Rx模型的GetWave做計算。這些計算主要是Convolution, 而Tx端大都是LTI的如FFE功能模組。

因為Convolution是具可交換性的,也就是說先後次序並不重要:

所以如果我們在Tx端以一Proxy物件直接做Delta響應的計算, 也就是直接回傳EDA軟體所送進的資料而不做改變, 就可以在Rx端的Proxy物件裡把這Tx與Rx綁在一起做計算也不會改變最終結果。

如上所示, 在Rx端的Proxy物件裡我們改變了原來運作的流程, 也就是透過可直接操弄兩者模型的記憶體位址來對內含參數做改變, 再加上一個外包的迴圈且於迴圈內不斷地做優化直致收歛為止。對於上層仿真器或EDA軟體來說, 它並不知道它呼叫了一個模型的GetWave函式後在這裡面竟進行了這麼多的工作, 也就是說:透過了Proxy物件, 我們可以把EDA軟體及AMI模型間的藕合給打斷而隔開來了。這也證明了Proxy類別可拿來為運作流程做客製化的改變。

Co-Optimization(程序外):

以上的兩個例子裡, proxy裡的運作仍是在同一個執行緒及process裡進行的,其實若是在其它的process裡進行, 不管是在本機或網路上的其它機器,這種Proxy也一樣可以讓原仿真流程繼續進行無誤, 以下圖為例:

我們想要利用EDA軟體的後處理能力來得到某組設定參數的效能結果, 可以讓右邊的這個程序反覆地進行,但因為呼叫的是Proxy物件,這proxy可透過某種通訊方式來向遠端的(即左方的)真實模型來送及取值, 則左邊這process便可一直長駐(persistent, 如server般), 每次右方的Proxy送值後, 它就做運算且把結果傳回去,而後等待EDA軟體做完後處理後把結果讀進來並為下一次右邊Proxy再次呼叫做準備, 如此便達到了仿真器和真實模型的所在相隔的效用;之前所提到的兩程式間的通訊可以是透過共享記憶位址(shared memory)、波包傳送(socket communication)或是程序間呼叫(IPC, inter process communication)等來進行, 而所謂的server端, 也並不需要有一個如仿真器的程式來載入proxy物件, 只要有個如SPISimAMI, AMICheck等的模型驅動程式來對.ami檔案做前處理並載入proxy的.dll/.so即可。

上圖源碼截圖中間的部份即是透過socket通訊的方式來與不在同一process的模型做連結, 呼叫這proxy的仿真器並不知道模型的運作不在同一process裡。

其它Proxy類別的應用:

除了以上所提及的幾種實驗外, proxy類別的AMI模型也可做為下列的運用:

  • 可做為一wrapper以便對由其它程式語言所實作出的模型做支援, 也就是說, 實際SERDES的運作部份可以是用matlab, p-code, perl,或其它執行檔所寫成而透過這proxy來和上層的EDA軟體做AMI流程的連結;
  • 可拿來當做一Server以集中管理所要支援的SERDES AMI模型智財,這server可以比如說是在IC智財商的公司裡, 如此便可保持模型的隨時更新及資安上的安全因為模型並沒有發佈出去, 客戶端所用的只是PROXY而已
  • 可以拿來支援舊版的模型, 很多現有的模型也就不需要重新編譯, 只要透過這Proxy把要新增的功能加上去再轉譯成原有模可也可了解的參數即可, 或是將新功能即時地在本地proxy處理後回傳而不透過原有模型, 兩者都可以達到新加功能的效果。

我們在AMI的專案中用了不少這種proxy的軟體設計技巧來做分析且發現其甚為有用;隨著AMI模型運用愈來愈廣, 我們也相信這種proxy類別可在更多的情況下為更多的新加的spec及通訊協定來與現有模型做連結。

相關資料:

[按此]下載當日於會場有關此簡報的錄音。

請[按此]或到IBIS官網下載有關此簡報的PDF檔。

IBIS-AMI: 模型架構分析

前言:

在前篇貼文, 我們大致探討了有關IBIS-AMI模型的幾種相關角色及其所需要的考量;在這篇文章中,我們以建模工程人員的角度來研究幾種可能的建模流程及其利幣。先申明的是本文中所提到的幾種其它商用程式範例均以在網上可合法公開取得的資料為準, 所參考到的文章已列於本文之末。

IBIS-AMI模型:

不論欲建為其建模的SERDES設計是多麼的精巧複雜,最終要做的事仍是要以C語言將其以合乎AMI API的三到五個函式(取決於要支援的IBIS SPEC.)寫出來並以編譯器在相對應的系統上做出.dll/.so的格式。要先說明的是API雖必需以C語言寫出,但其中的運作(即函式叫進來後是怎麼算出SERDES結果的)並不以C語言為限。比如說用戶可以用matlab寫出其中的計算並以p-code, 可執行碼或函式庫的形式與外包的C語言進行資料交換。不論如何,這套程序所要進行的工作仍然是如何能將SERDES的運作轉成相對應的源碼(source codes), 在此之上,另要考量的則是如何做才能使得產出的程式跑得快、算得準、容易維護又延伸性佳。

IBIS-AMI應用程式界面

為達此目的,一種相對簡單的建模流程是利用程式自原始設計自動地將源碼產生, 也就是所謂由上而下(Top-down)的設計流程。

由上而下的建模流程:

一般硬體的設計流程都是由上而下的:一開始是做佈線規畫(floor planing),然後必需有的各功能以方塊圖的方示表之,在此階段,各方塊圖內的細節先不是重點,要求的是各功能區塊間的行為互動、資料交換標準、及時域或譟聲的預算或容忍值等等。在這之後各設計人員或團隊才分開並針對每一個功能區塊做實體上的設計。最後把所有的設計整合起來做最後的整體分析或仿真。以此設計流程而言, 一般會有可編輯原理圖(schematic)的軟體讓設計人員把現有函式庫或樣版(template)編輯並接連起來, 而每一個區塊也常是各自有其階層性(hierarchical), C/C++源碼產生是由軟體將每一層的設計逐層逐級地產生。

要將設計轉成源碼, 如果順利的話一般是設計人員先右擊各功能區塊且設定要外顯(expose)的參數及名稱或變數範圍, 然後透過一程式產生模組來將設計轉出對應的C/C++源碼。就IBIS-AMI而言因其不僅有功能上的要求,在API函式的名稱及參數上也有規範, 故常還要另外有一個AMI專門的外掛來進行這些動作。

就這種程序而言, 用戶只要專注在SERDES的設計就可以了而毋需去考慮產出軟體的內容細節及品質。因為這兩家公司在業界也算有名,所以一般可相信以這些源碼做出的模型在實際運作後也能產生和原設計幾乎近似的結果。

電腦產生的源碼:

由電腦或程式自動產生的源碼, 可以看到軟體”很忠實”地如原理圖般一階一階地把它們串起來了,但坦白而言, 可讀性、維護性及延展性可能都不高,其次,不論如何為這些程式做更動或調整, 下回當再次將設計右擊滑鼠產出源碼時,所更改的這些部份又都將被覆寫而白作工了。也就是說,這種由上而下的建模方式在下端(即已產出的AMI模型)做的改變更動大概都無法回溯置回原始(上方)的設計裡。

我對這種由上而下的AMI建模方式的看法是:

  • 適合給有所有原始設計、且又不想管CODE的工程師用
  • 由這些程式自動轉出的程式:
    • 應能算出準確的結果,(如果不是的話就麻煩大了… 因為不會有最原始的程式碼可供查驗偵錯)
    • 運作起來跑不快, 至少以目前所見的情形都會是如此
    • 結果源碼可讀性不高…無法強制依某種coding guideline來產出, 所以並不容易維護及做長久性的支援
    • 由上而下是單向式的, 改變的源碼無法回頭標註在原始設計中,所以下回再次產生源碼時可能就又被覆寫過去了。

由下而上的建模流程:

若是以軟體架構的眼光來看AMI建模的需求,又會做如何的設計流程呢?猜想應是會和由SERDES工師師來做不同, 一般而言, 可能會做如下般:由下而上(bottom-up)式的規劃:

  1. 首先, 先定義出AMI建模中常會用到的幾種功能區塊, 諸如
    • FFE: Feed-forward equalizer, LTI, Time or frequency domain
    • LPF: Low pass filter, LTI, freqeuncy domain
      • CTLE, Bassel, filter based IIR/FIR etc
    • DFE: Decision feedback equalizer, NLTV/digial, time domain only
    • CDR: Clock data recovery, NLTV/digital, time domain only
    • Coder: various coding page
      • 64b66b, 8b10b etc
    • PRBS: Pseudo random bit stream, PRBS7, 10, 15 etc
    • AFE: analog front end to convert pulse to shape with Rt/Ft/Swing etc
  2. 其次, 就這些區塊為透過OO的要求針對AMI來做設計:先定義出軟體界面、基礎類別及要以虛擬函式來執行的相關運作等。
  3. 而後,針對不同的區塊進行實作, 並在上層要連結起來的階層以”更優雅”一點的方式整合
  4. 這點可算做加分題:可順便考量更進階的外加功能(諸如加密, 為不同CTLE或FFE組態做切換的設定等等)可如何地透過.ami檔來進行等

因為這些源碼是手動寫出來的…而非機器程式一貫作業產生的, 所以在可除錯性、程式易讀及可維護性、以及可延伸性上應都有更好的結果,再加上適當的說明文件, 這些模型可視為是公司軟體智財的一部份而有其價值且可長久使用。

在運作準確性的要求上:

  • 這些源碼應儘量不要是為單一設計而做, 所以不應有hard coded數字的情況發生,所有設定應儘量參數化以供自動優化用
  • 可透過sweep, lest-squared-error based fit, 或其它的優化方法以取得一組能和原始硬體設計效能最近似的參數供模型使用, 也就是說, 以此法得出的模型,不能假設其必然準確,而需另下功夫才能達到這要求。

我對這種由下而上的AMI建模方式的看法是:

  • 適合給懂得OO又對軟體編程有興趣的工程師使用
  • 因為大都是人手工寫出的軟體:
    • 需另下功夫以先確保軟體品質,而後再求精確性
    • (做得對的話),應會跑得更有效率
    • (做得對的話),會更易維護並延伸
    • 可重覆使用性高(軟體的本質),長久而言應更具經濟效益。

資料表單式的AMI建模:

綜上所述, 兩種AMI建模的流程都各有利幣,難道不能有兩全其美的方法嗎?

當然是可能的…但並不相對簡單, 究竟即便是工程師也各有分工專業,這也就是為什麼提到AMI建模時需要軟硬體相關知識,再加上DSP, 科學或工程計算等等的跨領域背景要求了。

大致上來說, 我認為如果能將兩種不同流程裡的短處減至最少,則就有近似兩全其美的條件;比如說, 當我有機會找到其它EDA廠商的AMI元件庫時,很高興地發現其實它們的設計也都如bottom-up或軟體模組的思維一般是很有完整性的, 之所以會在由上而下流程走過後產生令人不敢恭維的源碼是因為SystemVue(Simulink大概也一樣)這套軟體給一般設計使用(就像CPU一樣, 什麼都能做),也就是說, 它們的設計理念是:我們可將任何設計轉出相對應的源碼, 轉出後的品質等是其次的考量。

既然要改變大公司現有軟體應用領域大不易,則從另一方面來思考, 我們也可從現有的很多(開源等)DSP或濾波器函式庫來做運用而非重新發明輪子般地從頭做起, 在這些已經過較多測試函式庫上再以軟體工程的思維(而非廣義的自動軟體產出)來做AMI的建模應是更易著手的方案。所幸的是這類的開源函式庫很多,其實就連上述兩套體體裡也處處可見運用這類公用函式連的踪跡。更有甚者, 很多的AMI功能其實都可先編譯出來, 再事後透過外顯的.ami檔案來將各功能加以組合, 從這觀點來看, 就像是以datasheet/spec來將已做好的AMI模型透過.AMI來自動產出一樣。

最近其它先進所發表的一些文章, 及以諸如我等較小EDA公司所訂出的AMI建模方案都是朝這個方向進行, 也因此更能證明這個折衷方案是能得兼由上而下及由下而上兩不同流程優點的一可行方式。

參考文件:

2015 DesignCon paper: [HERE]
2016 IBIS Summit paper: [HERE]
2016 DesignCon paper: [HERE]

IBIS-AMI: 使用場景

IBIS-AMI: 相關角色及使用場景

近年來以SERDES為主的相關介面:諸如PCIe, USB及SATA等早已是無處不在;有別於傳統以Spice為主的時態SI分析, 因為這些界面要求低BER, 所以總是要跑上幾百萬個Bit才能得到較準確的分析結果,所以在分析方法上就不能以傳統的IBIS或Transistor模型等來進行。而為了與業界EDA工具或其它IP來源模型一起運作的相容性考量,其它的行為模型如Verilog-A等也未必適合;在此考量下, IBIS-AMI已成為近年來最通用的SERDES模型格式。在使用及建模程序上, IBIS-AMI都較傳統的IBIS要求更高的技術門檻及更跨領域的相關知識。本貼文就與IBIS-AMI模型相關的幾種角色來做相關議題的討論。分的相關角色有:1.終端AMI模型的使用者, 2.AMI建模工程師及3.供應AMI模型的公司人員等。

以AMI模型使用者的角色言:

這是最常見的使用情況, 究竟大部份的人都只需要知道怎麼用模型就可以了。但做為模型使用者而言, 一般標準程序上在對全設計進行相對冗長的仿真分析前, 都應先對所要使用的模型做相關的測試及審核..以免垃圾進垃圾出。以傳統IBIS為例,較謹慎的用戶不會全然相信一般常以模型名字來標出的阻抗值(尤其是用的不是TYP corner時), 所以都應以軟體、手算DC準位的相關阻抗並連以簡單的測試電路(test fixture)進行快速的時態仿真以確認手上的IBIS模型無誤。

以下圖為例,我們用BPro的Performance Measurement 對相關的IBIS模型量測準態阻抗值,發現其與模型檔名所標示值相差不多,便可繼續進行下一步分析。實務上我們常發現的是MIN, MAX corner與TYP值相差甚多, 故在做SI分析時就得把阻抗的不匹配列如考量之一。

同樣的想法套用到AMI的模型上就有更多一點的考量。首先AMI模型是二位元機器檔(非本文檔), 所以外人無法一窺究竟…非得透過其它程式才行;其次此二位元檔不僅是和作業系統windows/linux有關, 也和系統的位元(32/64bit)有關,AMI模型無法在不相同的程式上運作。雖說模型檔案一般也會有相關位元的資訊(比如說TX_Win32.dll), 但最好仍是先做相關測試。其次, AMI應用程式界面(API)中所規定必需包括的函式隨著模型用法(statistical or bit-by-bit)及介面Spec的版本也有所不同, 所以使用上也需先進行了解。最後, 即便是至今最新版的IBIS golden checker也只查驗.ami檔案及AMI必含程序的有無來做檢測, 並不進一步地對這些程序加以驅動並查看其輸入、輸出結果, 換句話說, 模型用戶至今為止仍必需透過第三方(常是較複雜且昂貴)的EDA軟體才能對模型做進一步的檢測。凡此種種皆拉高了初步測試的門檻。

業界常用的仿真軟體HSpice有內帶一簡單的AMICheck程式,唯其需要正式版的license才能跑。EDA公司諸如SiSoft及Cadence也都有提供類似的程式, 但我們在使用過後仍覺得有更多改進的空間, 更不用說它們仍需要用戶在不同系統及位元上先做編譯的工作(因為是以DesignKit的型式提供), 所以在實務上,要直接用這些程式仍有多不便之處。

為此, 本司開發了免費的SPISimAMI程式並供業界下載使用(毋需註冊或License),為免為德不卒,我們也已在不同系統及位元上編譯好以便可直接呼叫使用。這個程式會針對用戶提供的.ami, .dll(s)/.so(s)做下列的檢測:

  • 若呼叫的程式與模型系統及位元不符, 比如說用Win64版叫Win32的AMI模型, 則會顯示錯誤資訊。
  • 會針對必有的AMI函式, 如AMI_Init 及 AMI_close做檢測, 其次會依.ami裡GetWave_Exists的必有設定來對AMI_GetWave做檢測, 所謂檢測在此儘是查檢函式在模型裡的有無。至此以上兩點功能大致和最新版的golden checker相同。
  • 程式下一步會對這些檢測出有的函式進行驅動, 驅動模式有二:
    • 用戶可提供自已的輸入波型, 波型格式可以是.tr0, .raw, 或.csv任一, 其中的.raw是開源Berkeley Spice的內定格式。
    • 若無用戶的波型, 程式內建有rise step, fall step及pulse response以對程AMI_Init及AMI_GetWave加以驅動。
  • 驅動結果的輸出波型會直接存成.csv及.raw格式, 用戶可用如excel, 我們所提供免費的SPILite或其它程式來觀圖。

以下顯示此免費程式的使用說明:

舉例而言, 吾人可能拿到了一個TX的AMI模型且被告知其等化(EQ)的位準, 則就可以簡單的利用一串的脈波信號透過此程式輸入並查驗其輸出以確認所提供資訊無誤。

不論用戶所用的軟體及程序為何, 我們要強調的是AMI用戶對AMI模型就如其它的系統模型(IBIS, S-parameter, RLGC model)一樣, 在進行全分析前都應先進行初步的確認, 而這也應列入SI分析標準程序SOP裡的一個步驟。

以AMI建模人員的角色言:

之前提及AMI建模人員需要有跨更多領域的相關知識及經驗。比如說他/她先要知道AMI模型是什麼、格式有那些、運作模式有那兩種等等(關係到AMI_GetWave的有無), 其次要能將SERDES的相關運作及設計以C/C++的語法合乎AMI API的格式來寫出, 當然程式的相關規範如OO(物件導向)及效能也都要考量到。再來這些程式要用編譯器如Visual Studio或gcc/g++等編譯成.dll/.so的格式;這中間的過程當然也包換了數位信號處理DSP的相關技巧如低通濾波器及傅利葉轉換等等。最後, 所建模出來的模型架構應是可輕易維護且延伸性佳。這是因為同一公司不同SERDES間或不同設計版本間的相似性常是很高的, 所以好的設計可避免每次都重起爐灶重頭來過。凡此種種考量可了解對身為一位AMI建模者而言要了解及學習的知識實在很多。也因此就不難想見AMI建模要不就得花大錢外包或得有專職的工程師負責才能確保模型品質及長久的維護。

以資訊人員的想法從下而上的建模例子

在分工甚細的情況下,幾家EDA公司也就為此順勢推出了AMI建模的解決方案,其大都功能強大且各有風騷。它們的強處都在於這兩者在AMI流行之都早已是系統設計裡從上而下(top-down)流程的首選…尤其是在RF設計上, 所以也早就有很多的Library可供選擇使用。再者, 它們也早都有將流程轉成C/C++語法的外掛, 所以只再加一步..將轉出的源碼配合AMI API的要求即是水到渠成。然而, 就如我們下篇會再探討一般,我們也相信一個AMI建模者不應全然使用這些軟體就直接釋出模型給用戶。因為問題可能在模型釋出後才開始發生…試看這些軟體所轉出來的C/C++源碼:

SystemVue常用長度為1的buffer..

隨便把這給一個軟體工程師看他/她可能頭上都會有三條線, 軟體直接轉出的碼不僅維護不易而且也跑不快。至少以上圖所示.. 重覆地new/delete長度為1的buffer大概就足以讓專職軟體人員丟掉工作。就更不用提到什麼延伸性的的考量了。

如前所述, 其實在一個公司內的SERDES設計或不同版本之間其實差異不會太大, 再者一個SERDES裡所常用的功能區塊也大概就是那麼幾種, 則如為長久考量, 一AMI建模者實在是應該下基本功(Bite the bullet)一步一步地把模型架構建起來, 若設計得當的話很多的模組其實重覆使用性都很高。最後,一旦對架構有第一手(而非透過其它軟體)的掌控後就能加上一些其它”特異功能”, 比如說對部份設定加以加密, 容許特定用戶使用不同的模型設定等等, 而所設計出的模型也可參數化並有特定的GUI以便設計組態,甚至是只要編譯一次的AMI檔案而可將所有其它的設定透過.AMI檔案來做功能上的切換。凡此種種考量一旦建製完成,都可視為公司一IP及無形的資產。

最後值得一提的是在建模過程中將無可避免的需用編譯器來對開發中的模型進行除錯及測試, 則上述的SPISimAMI程式也可在此時派上用場。AMI模型是.dll/.so檔而無法直接執行,再者不論是仿真器或如SPISimAMI, AMICheck這類的驅動程式都需負責讀入並解析.ami檔案以便將相關參數再傳入給模型本身。所以若無這種輕巧的驅動程式的話,建模人員就得利用全仿真器(且得佔一個License)才能對手上的AMI模型讀入驅動且除錯。

以發佈AMI模型的公司角色言:

對一發佈AMI模型的公司,其所釋出的模型不僅代表產品的原有矽智財,其對此模型的效能報告及支援也間接影響公司的聲譽;一般在有AMI模型後最常見的問題是:用戶所用的仿真器或軟體和公司內部所用的不同, 則結果跑出來可能也就不一樣或甚至有錯,那要如何才能迅速有效地對這模型提供支援呢?

如果到各大有釋出AMI軟體的大公司相關網頁看(比如Xilinx), 都可發現他們都強調結果是在某特定軟體上測試, 言下之意,用戶若使用不同軟體則後果自負!?

我們認為模型發佈者及使用者之間的共同立足點(以交換資料)應是以最簡易形式為之, 這樣子就沒有在模型及使用工具上對問題互踢皮球的可能;舉例而言, 用戶可將模型輸入及輸出端的波形轉出來,再加上使用的參數檔.ami,應就足以做為提供給模型發佈商的測試資料(Test Case)供除錯用。關於這個應用,除了之前所提及SPISimAMI之類的驅動程式可供使用外, 可再配合如Proxy class等的設計(下下篇貼文會探討)就可使輸入輸出至某一AMI模型的資料達到透明化的結果,而這也就利於供應商對這模型的支援及維護。