,,,
(北京化工大學 信息科學與技術學院,北京 100029)
集成電路測試是集成電路生產環節中的最后一道生產工序,為了保證集成電路的質量,測試在集成電路生產中具有非常重要的作用[1]。而測試軟件則是測試系統的核心,肩負著驅動整個測試系統硬件模塊的重要使命,是連接測試資源和被測器件的必不可少的中間介質[2]。
目前,美國、日本等國家的集成電路自動測試軟件IG-XL、SmartTest等具備了較為成熟的技術,均支持通用格式STIL和STDF并且提供軟件二次接口,具有良好的通用性和可擴展性,可以方便、快捷地完成測試程序的開發[3]。但其大部分基于Windows操作系統。目前國內集成電路軟件的開發與研究也處于發展之中,曹菲[4]基于PCIe總線技術設計并實現了一種通用數字集成電路測試系統,該測試系統提供直流、交流、功能測試等多種測試需求,但測試軟件的測試程序是由測試碼生成的,存在對于使用者的編程能力有較高的要求的缺點。戴春翟[5]等設計了一款集成電路通用測試軟件,利用多層次、模塊化的軟件結構設計方法,令參數和測試程序互相分離,提高了測試的效率,但該軟件在測試數據存儲方面不支持通用的STDF格式存儲[5]。以上集成電路測試軟件的開發都是基于Windows系統的,對于硬件儀器的使用,只能調用Windows平臺支持的儀器驅動,具有一定的局限性,不能很好地滿足測試軟件的跨平臺測試需求。
Qt是一種C++圖形用戶界面應用程序開發框架,可在Windows、Linux等平臺下運行,并且具有良好的UI特性和豐富的API[6],可用來設計良好的界面并且滿足跨平臺的運行需求,因此可應用于集成電路測試軟件的開發。
本文基于Qt設計實現一款集成電路測試軟件。給出了測試參數配置、測試程序運行及測試結果管理3部分功能的設計與實現方法,并進行了實驗測試。
集成電路測試軟件由測試程序開發、測試程序運行和測試數據管理組成的。在集成電路的測試過程中會涉及到直流參數、功能測試等多種測試需求。測試中首先要對被測芯片的引腳信息進行定義,然后設置測試負載板上相應通道編號,將引腳通過測試負載板與測試儀器實現連接。同時,需要實現對測試機器資源的分配,即控制測試硬件產生必需的電壓、波形和時序需要的信息。最重要的一部分還涉及到測試向量數據,包含施加到被測器件輸入端邏輯狀態和輸出端期望邏輯狀態。測試向量通常由仿真文件 (如 VCD、WGL等類型)通過自動轉換軟件將仿真文件轉換而來,也可由測試工程師編寫來完成[7]。
集成電路測試中需要對上述種類繁多,關系復雜的參數進行處理,因此采用界面層、引擎層和數據層3層架構對軟件進行設計。其中,采用模型/視圖/代理(MVD)的框架進行軟件界面層的設計。MVD是Qt在Model View Controller(MVC)的基礎上引入模型/視圖結構得來的[8],MVC是一種業務邏輯、數據、界面顯示分離的方法組織代碼的方式,MVD中把視圖和控制部件結合在一起,使得框架更為簡潔,通過使用該框架,能夠有效地分離數據和界面。測試軟件架構圖如圖1所示。

圖1 測試軟件架構圖
1) 軟件的最上層也就是界面層,界面層的最上層是視圖層,用于管理用戶和軟件的交互,利用Qt的UI特性,提供給用戶良好的操作使用界面,用戶可以通過在界面上對控件進行操作從而對測試參數進行配置和修改。測試參數配置、測試程序運行以及測試結果管理3部分的界面均采用列表的形式進行展現,其中所涉及到的網格線、是否可以拖動,數據項的展示形式、列表的列寬、菜單的內容和樣式以及會使用到對話框的樣式和內容都在視圖層進行管理,均采用QTableView表格視圖來實現。
委托層處理的也是用戶的輸入,也就是把用戶的輸入委托給Qt的某個部件進行處理。對于在集成電路測試過程中需要用戶輸入的測試參數信息采用文本框輸入的方式進行處理,對于給出用戶可選項的信息采用下拉框的方式進行處理,對于可選的測試信息采用復選框的方式進行處理,此外還可以自定義委托,當用戶處理完這些輸入之后,將數據發送給數據模型層。
模型層有3個主要功能,首先,與引擎層進行通信,獲取數據信息;其次,開放數據訪問接口,委托層和視圖層通過模型索引訪問數據模型層的數據;其三,該層還設置了數據的顯示方式,在集成電路測試軟件界面中可以被編輯的數據設置為Qt::EditRole,需要以文本形式顯示的數據則被設置為Qt::DisplayRole。
2) 引擎層的測試參數編輯引擎定義了數據模型層功能函數中真正的邏輯實現,當數據模型層的函數被觸發時會調用引擎層定義的邏輯功能。運行引擎則實現了測試流程的解析。
3) 數據層則以數據表的形式實現了整個測試過程中所涉及到數據的存儲,分別對測試軟件用戶信息、測試參數信息、測試運行信息以及測試結果信息進行存儲。數據庫層直接和引擎層進行通信,數據庫層會提供數據給引擎層,引擎層最終對測試參數進行的修改會被更新到數據庫層的數據庫中。
測試參數配置需要完成對被測芯片的描述以及進行配置測試過程中所需要的參數,這部分是完成測試的基礎。
為方便用戶的操作,測試參數配置部分采用模塊化的設計,測試中所需要的被測管腳信息、管腳通道映射、時序信息、電源信息、電平信息、向量信息等在界面的顯示上被分為不同的模塊。測試參數配置給用戶提供友好交互的向導界面,實現各模塊參數的配置。所以在程序的實現過程中,視圖層要提供設置測試內容的人機交互接口,需要進行配置的參數信息在界面上以列表的形式進行顯示,這部分在數據模型層中進行設置。對于具體參數值的設置是用戶進行輸入的,因此視圖層都是用于實現模塊人機交互部分的響應,即實現用戶點擊的引起的信號觸發以及對相應彈窗的觸發,并獲取用戶輸入內容。
2.1.1 模塊間通信設計與實現
對于測試參數配置部分整體而言,其中的每個模塊都不是獨立的,很多模塊間存在著一定的聯系。為解決模塊間存在關聯的問題,在引擎層采用如圖2所示的實現方式。信號管腳模塊的CPin類當信號發生變動時通過Connect PinGroup (CPinStore* pPinStore, std::vector

圖2 模塊間關系圖
2.1.2 軟件二次接口開發
此外,由于用戶會有個性化的測試需求,測試參數配置部分提供二次開發接口功能,設置為用戶代碼模塊,在這個模塊用戶可實現對API函數的調用,通過將用戶代碼模塊配置到測試項中,實現用戶自定義的測試需求。
采用Lua作為用戶代碼的開發調試工具,因為Lua有著良好的可嵌入性[9],將Lua嵌入C++之后,如果對用戶代碼的修改均可以在Lua中進行,不用再重新編譯C++項目。集成電路測試軟件開發平臺作為宿主,Lua作為嵌入式腳本,嵌入到宿主語言中,為測試軟件提供自定義測試的功能,用C++編寫的API函數作為Lua的底層擴展庫,是Lua腳本訪問主要的功能函數。實現流程如圖3所示。

圖3 用戶代碼模塊流程圖
1) 用戶代碼模塊用于完成自定義測試功能的任務,該模塊運行時會加載用戶自定義的測試。
2) 調用Lua語言提供的Lua_newstate接口函數創建 Lua解釋器,調用lua_ register()將用戶自定義編寫的API函數注冊到Lua文件中。
3) 按照 Lua語法將已經在 Lua解釋器中注冊過的API函數編寫成自定義測試需要的邏輯功能寫到 Lua腳本中,保存為user.lua文件。
4) 將user.lua配置到用戶代碼模塊中,當用戶代碼模塊加載時,便會調用Lua_dofile函數加載Lua文件,此時,Lua文件運行觸發Lua_getglobal函數,在Lua解釋器中被注冊的API函數被調用,用戶自定義的測試功能被實現。
測試運行部分實現對所測試芯片進行功能和性能測試。仿真運行部分調用儀器資源模型和DUT仿真模型,完成仿真測試;調試運行部分調用測試儀器的硬件設備驅動函數,通過計算機與測試儀器的通信接口向硬件端口發送控制命令,硬件電路解析命令使硬件電路完成相應的動作,并具有設斷點調試等功能。
測試運行部分的視圖顯示共分為3部分:引腳通道配置的選擇,測試工程的信息以及測試結果的顯示。測試結果的顯示包括測試項的測試結果和分級結果。在視圖層,定義4個類 BinResultTableView、TestResult TableView、ProjectInfoTableView、Pakage InfoTableView分別進行視圖顯示信息的設置,對于引腳通道配置的選擇和測試流程的選擇均在委托層采用下拉框的特殊形式進行處理,在模型層則定義4個類BinResultData、TestResultTableData、ProjectInfoData、PakageInfoData對表頭等數據的顯示形式進行定義并和引擎層進行通信。

圖4 測試運行界面顯示架構圖
根據集成電路測試的需求,測試軟件的運行過程中需要創建用戶界面并進行測試的線程(主線程)和管腳映射下載線程(子線程)。主線程負責界面的顯示和測試的進行,子線程負責管腳映射關系的下載,兩個線程的運行是并列的不相互影響,因此,使用多線程技術可以提高軟件的運行效率。
用戶運行測試軟件時,會建立一個進程同時為這個進程創建一個主線程。在進行下載管腳映射關系時,就需要再創建一個測試線程來完成測試工作。Qt開啟多線程,主要用到類QThread。用CWorkThread類繼承QThread,然后重寫虛函數run()。當要開啟新線程時,只需要實例該類,調用LoadPackage (const std::string strRunFile, int nPackageID)函數觸發start()函數間接調用run()函數來創建新的線程。當需要結束該線程時,調用UnLoadPackage(),觸發Quit()函數來刪除非主線程管理的任務,結束該線程。
在多線程程序設計中,線程與線程之間進行通信是非常重要的。用戶需要在界面中點擊“下載”按鈕來進行下載管腳映射關系,也就是說需要在用戶界面中控制線程,為了實現這種功能,采用Qt自帶的信號與槽的方式進行線程的通信。在主線程中定義slot函數,在子線程中定義signal函數,通過connect函數實現信號與槽函數之間的通信,從而實現主線程與子線程之間的通信。

圖5 多線程實現流程圖
測試數據管理模塊實現對測試運行結果進行存儲并提供測試結果的可視化顯示功能。
為了提高軟件的通用性,采用STDF格式對測試數據進行存儲。STDF文件由多個數據模塊構成,V4版本共計25個模塊,不同的模塊被稱為不同的記錄類型,每個模塊有其固定的記錄內容,這些模塊按照一定的順序,共同組合構成了整個STDF文件[10]。實現STDF存儲的流程如圖6所示。
基于STDF的格式特點,對STDF格式的存儲也以數據模塊為單位進行實現,每個數據模塊都由以下三部分組成:記錄標題、必選的數據記錄以及可選的數據記錄。
首先創建一個數據容器向量,命名為Vector,Vector用于存儲數據模塊的必選的數據記錄以及可選的數據記錄,將二進制數據轉換成ASCII碼之后依次存入Vector,然后獲取Vector的長度,因為記錄標題占4字節的長度,所以將Vector的長度加4字節后存到數組List中,再根據數據模塊的類型確認記錄標題的內容后將記錄標題存入List,List中便是STDF中數據模塊的內容,將各個模塊按照規定的順序寫入STDF文件,便完成了文件的存儲。

圖6 STDF格式存儲流程圖
在軟件的功能基本開發完成后,以二進制計數器芯片M54HCT160作為被測芯片,對軟件的仿真運行功能進行了測試。
1)新建工程:
啟動軟件進入系統登錄界面,輸入正確的用戶名和密碼,點擊菜單欄中“工程”按鈕選中“新建工程”,填寫工程名稱、保存路徑。點擊“確定”后在工程存放目錄下生成文件名為“M54HCT160_TEST”的工程文件。
2)工程參數設置:
進入工程參數設置界面后,可以對芯片測試工程的參數進行輸入設置了,工程參數設置界面主要包括:管腳信號定義、管腳映射配置、電源模塊配置、電平模塊配置,直流參數模塊配置。
(1)管腳信號定義,首先定義待測芯片的管腳名稱和管腳類型,然后定義信號組,方便接下來的測試。
(2)管腳映射配置,在定義好信號管腳信息后,配置管腳映射模塊,將信號與儀器通道建立起連接。
(3)電源模塊配置接下來配置開短路測試中所需要的電源參數。
(4)電平模塊配置接著配置管腳的驅動電平與比較電平等參數。
(5)直流參數模塊配置,需要說明的是開短路測試的判斷條件,如果引腳接觸正常,那么測試結果應該為二極管的導通電壓 0.7 V 左右,設置判斷條件為 0.2~1.5 V 之間。
(6)測試項配置,將已經配置好的電源、電平模塊配置到“Open/Short”測試項中。
3)測試結果:
測試結果如圖8所示,管腳“MR/”、“D[2]”、“D[3]”、“Q[0]”、“Q[2]”沒有通過測試,結果為“FAIL”,其他管腳通過測試,結果為“PASS”。

圖7 測試項配置圖

圖8 測試結果圖
本文提出的基于Qt的集成電路測試軟件,可支持在Windows和Linux平臺使用,滿足跨平臺的測試需求,整體上采用MVD架構有效的分離了界面和數據,測試參數配置部分采用Lua語言開發了軟件的二次接口,滿足了用戶的個性化測試需求,測試運行部分采用多線程的技術,提高了軟件的運行效率,測試數據管理部分采用STDF格式對測試數據進行了存儲,提高了軟件的通用性,測試表明,本軟件具有集成電路測試功能,為集成電路測試軟件的實現提供了一種新思路。