專利名稱::用于控制模塊化測試系統(tǒng)中可互換部件的方法和系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
:本發(fā)明涉及用于半導(dǎo)體測試的自動測試設(shè)備(ATE)領(lǐng)域。特別地,本發(fā)明涉及用于控制模塊化測試系統(tǒng)中的可互換部件的方法和系統(tǒng)。
背景技術(shù):
:測試設(shè)備的高成本的主要原因在于傳統(tǒng)的測試器體系結(jié)構(gòu)的專用屬性。每一測試器制造商都具有大量測試器平臺,這些測試器平臺不僅在多個公司(諸如Advantest、Teradyne和Agilent)之間不兼容而且在公司內(nèi)的平臺(諸如由Advantest制造的T3300、T5500和T6600系列測試器)之間也不兼容。由于這些不兼容性,每一測試器要求其自己專用的硬件和軟件部件,而且這些專用硬件和軟件部件不能用在其他測試器上。另外,將測試程序從一個測試器導(dǎo)入另一測試器以及開發(fā)第三方解決方案都要費很大的勁。即使針對某一平臺開發(fā)了第三方解決方案,該方案也不能被導(dǎo)入不同的平臺或在不同平臺上再用。從一個平臺到另一個平臺的轉(zhuǎn)變過程通常復(fù)雜且容易出錯,導(dǎo)致時間、精力和測試成本的增加。專用測試器體系結(jié)構(gòu)的另一問題在于對于給定的測試器,所有硬件和軟件保持在固定結(jié)構(gòu)中。為測試被測設(shè)備(DUT)或集成電路(IC),開發(fā)專用測試程序,這些測試程序使用一些或全部測試器能力來定義測試數(shù)據(jù)、信號、波形、電流和電壓電平,以及收集DUT響應(yīng)和確定DUT通過/失敗。由于測試系統(tǒng)需要執(zhí)行廣泛的功能和操作以便測試多種多樣的測試模塊和它們相應(yīng)的DUTs,因此需要可配置成支持多種多樣測試模塊的開放體系結(jié)構(gòu)測試系統(tǒng)。具體地,為支持多種多樣的測試模塊,在開放體系結(jié)構(gòu)測試系統(tǒng)中,需要一種模塊控制框架,其可被配置成在測試特定廠商模塊及其相應(yīng)的DUTs期間,支持將一個或多個廠商模塊集成到測試系統(tǒng)中。
發(fā)明內(nèi)容本申請描述使用面向?qū)ο蟮臉?gòu)造(如C++對象和類)的測試程序開發(fā)。更具體地,該方法適合開發(fā)用于開放體系測試器的程序,如轉(zhuǎn)讓給本發(fā)明受讓人的美國申請No.60/449,622、No.10/404,002以及No.10/403,817中描述的測試器。本發(fā)明的一個實施例提供一種方法,用于通過以通用的面向?qū)ο蟮臉?gòu)造(如C/C++)描述測試系統(tǒng)資源、測試系統(tǒng)配置、模塊配置、測試順序、測試計劃、測試條件、測試模式、以及定時信息來在半導(dǎo)體測試系統(tǒng)(如自動測試裝置(ATE))上開發(fā)測試被測試設(shè)備(如IC)的測試程序。包含這些描述的文件存儲在測試系統(tǒng)或使用這些文件的有關(guān)設(shè)備可訪問的存儲器,即計算機可讀介質(zhì)中。描述測試系統(tǒng)資源可以包括指定資源類型,其中資源類型與對IC施加測試的至少一個測試模塊關(guān)聯(lián),指定與資源類型關(guān)聯(lián)的參數(shù)類型及指定參數(shù)類型的參數(shù)。描述測試系統(tǒng)配置可以包括指定用于控制至少一個測試模塊的站點控制器,其中每個測試模塊對IC施加測試,及指定模塊連接使能器的輸入端口。測試系統(tǒng)將站點控制器耦合到模塊連接使能器的該指定的輸入端口處,而模塊連接使能器將站點控制器耦合到測試模塊。模塊連接使能器可以實現(xiàn)為開關(guān)陣列。描述模塊配置可以包括指定用于指定模塊類型的模塊標(biāo)識符,指定用于控制由模塊標(biāo)識符所指定模塊類型的測試模塊的可執(zhí)行代碼及指定與測試模塊關(guān)聯(lián)的資源類型??蓤?zhí)行代碼可以采取動態(tài)鏈接庫的形式。描述模塊配置還可以涉及用戶指定用于指定模塊連接使能器輸出端口的槽標(biāo)識符,其中測試系統(tǒng)在輸出端口將測試模塊耦合到模塊連接使能器,而模塊連接使能器將測試模塊耦合到對應(yīng)的站點控制器。用戶還可以指定用于識別測試模塊提供商的廠商標(biāo)識符及結(jié)合資源類型可用的最大數(shù)量資源單元的標(biāo)識符。資源類型可以是例如數(shù)字測試器引腳和資源單元測試器通道??蛇x地,測試器通道資源單元還可以對應(yīng)于資源類型,例如模擬測試器引腳、RF測試器引腳、電源引腳、數(shù)字轉(zhuǎn)換器引腳和任意波形生成引腳。還可以提供關(guān)于禁用哪個資源單元的指示符。指示為禁用的資源單元可以表示測試模塊不完善的資源單元。描述測試條件可以包括指定至少一個測試條件組、指定包括至少一個變量的規(guī)范集合;及指定用于選擇要綁定到變量的表達式的選擇器。測試條件組與用于規(guī)范集合的選擇器的結(jié)合定義了測試條件。描述測試序列可以包括指定其中各種測試可以施加的次序(或流)。描述測試模式可以包括指定測試模式、相關(guān)聯(lián)的電壓與電流電平、信號值的過渡、對應(yīng)的上升與下降時間以及相關(guān)聯(lián)的定時。本發(fā)明的一個實施方式還包括Preheader文件的使用。Preheader文件被編譯,以創(chuàng)建用于與測試實體關(guān)聯(lián)的類的頭文件。Preheader文件包括用于指定用于設(shè)置測試實體的至少一個屬性的參數(shù)的參數(shù)塊及用于指定由編譯器插入到測試實體類的頭文件中的源代碼的模板塊。所述頭文件可以是C++頭文件。測試實體可以是測試,而測試實體可以是例如測試類。參數(shù)可以涉及例如模式列表和測試條件。本發(fā)明的實施例的模式編譯器包括至少一個特定于模塊的模式編譯器,以及對象文件管理器,其用于指令每一特定于模塊的編譯器編譯模式源文件的相應(yīng)的特定于模塊的段和模式源文件的公共段。公共段包括所有特定于模塊的編譯器均可訪問的信息。編譯器的輸出包括至少一個特定于模塊的模式數(shù)據(jù)段。特定于模塊的模式加載器將特定于模塊的模式數(shù)據(jù)從相應(yīng)的特定于模塊的模式數(shù)據(jù)段加載到相應(yīng)的測試模塊中,以便執(zhí)行。用于將測試模式集成在模塊化測試系統(tǒng)中的方法包括通過控制器控制至少一個測試模塊及其相應(yīng)的被測設(shè)備(DUT),通過模塊控制框架,在廠商供應(yīng)的測試模塊和模塊化測試系統(tǒng)之間建立標(biāo)準(zhǔn)模塊控制接口,安裝廠商供應(yīng)的測試模塊和相應(yīng)的廠商供應(yīng)的控制軟件模塊,其中,廠商供應(yīng)的控制軟件模塊被組織成多個廠商供應(yīng)的模塊控制部件,基于該模塊控制框架和多個廠商供應(yīng)的模塊控制部件,配置該模塊化測試系統(tǒng),以及使用該模塊控制框架,根據(jù)多個廠商供應(yīng)的模塊控制部件,訪問該廠商供應(yīng)的測試模塊。模塊化測試系統(tǒng)包括控制至少一個測試模塊及其相應(yīng)的被測設(shè)備(DUT)的控制器,以及建立廠商供應(yīng)的測試模塊和模塊化測試系統(tǒng)之間的標(biāo)準(zhǔn)模塊控制接口的模塊控制框架。模塊化測試系統(tǒng)進一步包括用于安裝廠商供應(yīng)的測試模塊和相應(yīng)的廠商供應(yīng)的控制軟件模塊的裝置,其中廠商供應(yīng)的控制軟件模塊被組織成多個廠商供應(yīng)的模塊控制部件,用于基于該模塊控制框架和多個廠商供應(yīng)的模塊控制部件,配置該模塊化測試系統(tǒng)的裝置,以及用于使用模塊控制框架,根據(jù)多個廠商供應(yīng)的模塊控制部件,訪問廠商供應(yīng)的測試模塊的裝置。當(dāng)聯(lián)系附圖參考本發(fā)明實施方式的具體描述時,以上提到的本發(fā)明特征與優(yōu)點及其另外的特征與優(yōu)點將在下文中更清楚地理解。圖1說明了傳統(tǒng)的測試器體系。圖2說明了根據(jù)本發(fā)明實施方式的測試器體系。圖3說明了根據(jù)本發(fā)明實施方式的測試器軟件體系。圖4說明了根據(jù)本發(fā)明實施方式的測試程序編譯器。圖5說明了根據(jù)本發(fā)明實施方式有多少不同的測試實例可以從單個測試類導(dǎo)出。圖6說明了根據(jù)本發(fā)明實施方式的模式編譯器。圖7說明了根據(jù)本發(fā)明實施方式有序的模式樹例子。圖8說明了根據(jù)本發(fā)明實施方式的另一有序的模式樹例子。圖9說明了根據(jù)本發(fā)明實施方式測試程序所需的文件之間的關(guān)系。圖10說明了根據(jù)本發(fā)明實施方式的波形生成。圖11說明了根據(jù)本發(fā)明實施方式用于定時的映射。圖12說明了根據(jù)本發(fā)明實施方式用于定時的另一映射。圖13說明了根據(jù)本發(fā)明實施方式用于將廠商軟件模塊集成到開放體系結(jié)構(gòu)測試系統(tǒng)的方法。圖14說明根據(jù)本發(fā)明實施方式的模塊控制框架。具體實施例方式提供用于控制模塊化測試系統(tǒng)中可互換部件的方法和系統(tǒng)。以下描述的提出是為了使本領(lǐng)域任何技術(shù)人員能夠制造并使用本發(fā)明。特定實施方式與應(yīng)用的描述僅僅是作為例子提供的。在此所描述的例子的各種修改與組合對本領(lǐng)域技術(shù)人員是顯而易見的,而且在不背離本發(fā)明主旨與范圍的情況下在此所定義的通用原理適用于其它例子與應(yīng)用。因此,本發(fā)明不是要限定到所描述和示出的例子,而是要符合與在此所公開的原理與特征一致的最廣泛范圍。本發(fā)明總的來說是根據(jù)如本受讓人的美國申請No.60/449,622、10/404,002和10/403,817中所描述的開放體系來描述的。但是,本領(lǐng)域技術(shù)人員將認識到本發(fā)明不僅適用于開放測試器體系,而且也適用于固定測試器體系。開放體系結(jié)構(gòu)測試系統(tǒng)的描述可以在要求本受讓人的美國申請No.60/449,622的權(quán)益的美國申請No.10/772,372“MethodandApparatusforTestingIntegratedCircuits”中找到。圖1說明了顯示信號如何生成并施加到進行測試的設(shè)備(DUT)的傳統(tǒng)測試器的通用結(jié)構(gòu)。每個DUT輸入引腳都連接到施加測試數(shù)據(jù)的驅(qū)動器2,而每個DUT輸出引腳都連接到比較器4。在大多數(shù)情況下,使用三態(tài)驅(qū)動器比較器,使得每個測試器引腳(通道)都可以既充當(dāng)輸入引腳,又充當(dāng)輸出引腳。專用于單個DUT的測試器引腳共同形成與相關(guān)定時發(fā)生器6、波形發(fā)生器8、模式存儲器10、定時數(shù)據(jù)存儲器12、波形存儲器數(shù)據(jù)14及定義數(shù)據(jù)率的塊16一起工作的測試站點。圖2說明了根據(jù)本發(fā)明實施方式的系統(tǒng)體系100。系統(tǒng)控制器(SysC)102耦合到多個站點控制器(SiteC)104。系統(tǒng)控制器還可以耦合到網(wǎng)絡(luò),以便訪問文件。通過模塊連接使能器106,每個站點控制器都耦合成控制位于測試站點110的一個或多個測試模塊108。模塊連接使能器106允許所連接硬件模塊108的重新配置,還充當(dāng)數(shù)據(jù)傳輸?shù)目偩€(用于加載模式數(shù)據(jù)、收集響應(yīng)數(shù)據(jù)、提供控制,等等)??赡艿挠布崿F(xiàn)包括專用連接、開關(guān)連接、總線連接、環(huán)形連接及星形連接。模塊連接使能器106可以由例如開關(guān)陣列實現(xiàn)。每個測試站點110都與一個DUT112關(guān)聯(lián),DUT112通過加載板114連接到對應(yīng)站點的模塊。在一種實施方式中,單個站點控制器可以連接到多個DUT站點。系統(tǒng)控制器102充當(dāng)全局系統(tǒng)管理器。它協(xié)調(diào)站點控制器的動作、管理系統(tǒng)級的并行測試策略并附加地提供操縱器/探測器控制及系統(tǒng)級數(shù)據(jù)登錄與錯誤處理支持。依賴于操作設(shè)置,系統(tǒng)控制器102可以部署到獨立于站點控制器104運行的CPU上??蛇x地,系統(tǒng)控制器102和站點控制器104可共享一個CPU。類似地,每個站點控制器104可以部署到其自己的專用CPU(中央處理單元),或者作為相同CPU中的獨立處理器或線程。上述系統(tǒng)體系可以從概念上設(shè)想為圖2所示的分布式系統(tǒng),應(yīng)當(dāng)理解,單獨的系統(tǒng)部件也可以看作集成、單塊系統(tǒng)的邏輯組件而不一定是分布式系統(tǒng)的物理組件。圖3說明了根據(jù)本發(fā)明實施方式的軟件體系200。軟件體系200代表了分布式操作系統(tǒng),具有對應(yīng)于相關(guān)硬件系統(tǒng)元件102、104、108的系統(tǒng)控制器220、至少一個站點控制器240和至少一個模塊260元素。除了模塊260,體系200還包括用于軟件模塊仿真280的對應(yīng)元件。作為示例選擇,用于這種平臺的開發(fā)環(huán)境可以基于微軟的Windows。這種體系的使用還有程序與支持的便攜性方面的好處(例如,站點服務(wù)引擎可以連接運行測試器操作系統(tǒng)的膝上型電腦,以便執(zhí)行事先的診斷)。但是,對于大的計算密集操作(例如測試模式編譯),可以使相關(guān)軟件作為能夠獨立運行以便允許在整個分布式平臺上進行任務(wù)調(diào)度的獨立實體。因此,用于批任務(wù)的相關(guān)軟件工具能夠運行在多種平臺類型上。作為示例選擇,ANSI/ISO標(biāo)準(zhǔn)C++可以作為軟件的本機語言使用。當(dāng)然,有多種允許帶其自己的可選語言的第三方集成到系統(tǒng)中的選擇(提供標(biāo)準(zhǔn)C++接口上的層)。圖3說明了通過標(biāo)準(zhǔn)的源,根據(jù)各個元件的組織對其進行陰影表示(或者作為子系統(tǒng)集中開發(fā)),包括測試操作系統(tǒng)、用戶部件292(例如,由用戶為測試目的提供的)、系統(tǒng)部件294(例如,為基本連接性和通信作為軟件基礎(chǔ)結(jié)構(gòu)提供的)、模塊開發(fā)部件296(例如,由模塊開發(fā)器提供的)及外部部件298(例如,由除模塊開發(fā)器之外的外部源提供的)。從基于源的組織的觀點看,測試操作系統(tǒng)(TOS)接口290包括用于站點控制器接口的系統(tǒng)控制器222、框架類224、用于模塊接口的站點控制器245、框架類246、預(yù)定義的模塊級接口、背板通信庫249、底盤槽IF(接口)262、加載板硬件IF264、背板模擬IF293、加載板模擬IF285、DUT模擬IF287、用于DUT的Verilog模型的VerilogPLI(編程語言接口)288及用于DUT的C/C++模型的C/C++語言支持289。用戶部件292包括用戶測試計劃242、用戶測試類243、硬件加載板265及DUT266、DUTVerilog模型293和DUTC/C++模型291。系統(tǒng)部件294包括系統(tǒng)工具226、通信庫230、測試類244、加載板驅(qū)動器250、HW背板261、模擬框架281、背板仿真282及加載板模擬286。模塊開發(fā)部件296包括模塊命令實現(xiàn)248、模塊硬件263及模塊仿真284。外部部件298包括外部工具225。系統(tǒng)控制器220包括用于站點控制器的接口222、框架類224、系統(tǒng)工具226、外部工具225及通信庫230。系統(tǒng)控制器軟件是用戶的主要交互點。它提供到本發(fā)明的站點控制器的網(wǎng)關(guān)及多站點/DUT環(huán)境中站點控制器的同步,如在本受讓人的美國申請No.60/449,622中所描述的?;趫D形用戶接口(GUI)或其它的用戶應(yīng)用與工具運行在系統(tǒng)控制器上。系統(tǒng)控制器還可充當(dāng)用于所有測試計劃相關(guān)信息的倉庫,包括測試計劃、測試模式和測試參數(shù)文件。存儲這些文件的存儲器可以對系統(tǒng)控制器是本地的或者離線的,例如通過網(wǎng)絡(luò)連接到系統(tǒng)控制器。測試參數(shù)文件包含在本發(fā)明實施方式中面向?qū)ο蟮沫h(huán)境中用于測試類的參數(shù)化數(shù)據(jù)。除標(biāo)準(zhǔn)系統(tǒng)工具226之外(或者代替之),第三方開發(fā)人員也可提供工具。系統(tǒng)控制器220上的標(biāo)準(zhǔn)接口222包括工具用來訪問測試器和測試對象的接口。工具(應(yīng)用)225/226允許測試和測試器對象的交互性與批控制。工具包括用于(通過例如SECS/TSEM等的使用)提供自動化能力的應(yīng)用。駐留在系統(tǒng)控制器220上的通信庫230提供以對用戶應(yīng)用和測試程序透明的方式與站點控制器240通信的機制。駐留在與系統(tǒng)控制器220關(guān)聯(lián)的存儲器中的接口222提供與在系統(tǒng)控制器上執(zhí)行的框架對象的開放式接口。包括允許基于站點控制器的模塊軟件訪問并檢索模式數(shù)據(jù)的接口。還包括應(yīng)用與工具用于訪問測試器和測試對象的接口及提供通過腳本引擎訪問并控制測試器與測試組件的能力的腳本接口。這使得用于交互的機制、批與遠程應(yīng)用能夠執(zhí)行它們的功能。與系統(tǒng)控制器220關(guān)聯(lián)的框架類224提供與上面提到的這些對象交互的機制,提供標(biāo)準(zhǔn)接口的引用實現(xiàn)。例如,本發(fā)明的站點控制器240提供功能性測試對象。系統(tǒng)控制器框架類可提供對應(yīng)的功能性測試代理作為功能性測試對象基于遠程系統(tǒng)控制器的代理。因此,使系統(tǒng)控制器220上的工具可具有標(biāo)準(zhǔn)功能性測試接口。框架類有效地提供與主系統(tǒng)控制器關(guān)聯(lián)的操作系統(tǒng)。它們還構(gòu)成提供到站點控制器的網(wǎng)關(guān)并在多站點/DUT環(huán)境中提供站點控制器同步的軟件元素。因此,這一層在本發(fā)明的實施方式中提供了適于控制和訪問站點控制器而不需要直接處理通信層的對象模型。站點控制器240是用戶測試計劃242、用戶測試類243、標(biāo)準(zhǔn)測試類244、標(biāo)準(zhǔn)接口245、站點控制器框架類246、模塊高級命令接口(即,預(yù)定義的模塊級接口247)、模塊命令實現(xiàn)248、背板通信庫249和背板驅(qū)動器250的主機。優(yōu)選地,大部分測試功能是由站點控制器104/204處理的,從而允許測試站點110的獨立運行。測試計劃242是用戶寫的。計劃可以直接由采用面向?qū)ο蠼Y(jié)構(gòu)的標(biāo)準(zhǔn)計算機語言,如C++,來寫,或者在高級測試編程語言中描述,來產(chǎn)生C++代碼,然后C++代碼可以編譯成可執(zhí)行測試程序。對于測試程序開發(fā),本發(fā)明的一種實施方式采用受讓人的創(chuàng)造性測試程序語言(TPL)編譯器。參考圖4,測試程序編譯器400部分地充當(dāng)代碼生成器,包括將描述測試與相關(guān)參數(shù)的測試程序開發(fā)人員的源文件404翻譯成例如C++代碼的面向?qū)ο蠼Y(jié)構(gòu)的翻譯器部分402。編譯器部分406又將代碼編譯并鏈接成可執(zhí)行文件,例如DLL,以便創(chuàng)建可以由測試器系統(tǒng)執(zhí)行的測試程序。盡管將TPL代碼生成器/翻譯器的應(yīng)用于測試系統(tǒng)是新穎的,但請注意,代碼生成器是本領(lǐng)域已知的。而且,編譯器部分可以是本領(lǐng)域已知的標(biāo)準(zhǔn)C++編譯器。測試計劃通過使用框架類246和/或標(biāo)準(zhǔn)或與站點控制器關(guān)聯(lián)的用戶提供的測試類244創(chuàng)建測試對象、利用標(biāo)準(zhǔn)接口245配置硬件并定義測試計劃流。它還提供測試計劃執(zhí)行過程中所需的任何附加邏輯。測試計劃支持一些基本服務(wù)并提供與例如調(diào)試服務(wù)(例如,斷點)的底層對象的服務(wù)的接口,及對底層框架與標(biāo)準(zhǔn)類的訪問。輸入到測試程序編譯器400的源代碼包括指定測試計劃中所使用對象及其彼此關(guān)系的測試計劃描述文件。這個文件被翻譯成在站點控制器上執(zhí)行的形式為標(biāo)準(zhǔn)接口實現(xiàn)的C++代碼,這可以指示為ItestPlan。這個代碼被打包成可以加載到站點控制器上的Windows動態(tài)鏈接庫(DLL)。生成具有標(biāo)準(zhǔn)已知輸入點的測試程序DLL,使得站點控制器軟件可以使用該輸入點生成并返回它所包含的TestPlan對象。站點控制器軟件將測試程序DLL加載到其處理空間中并使用一個輸入點來創(chuàng)建測試計劃對象的實例。一旦測試計劃對象已經(jīng)創(chuàng)建,站點控制器軟件就可以執(zhí)行測試計劃。與站點控制器關(guān)聯(lián)的框架類246是實現(xiàn)公共的測試相關(guān)操作的一組類與方法。站點控制器級框架包括例如用于電源和引腳電子排序、設(shè)置電平與定時條件的類、獲得測量值的類及控制測試流的類??蚣苓€提供用于運行時間服務(wù)與調(diào)試的方法??蚣軐ο罂梢酝ㄟ^實現(xiàn)標(biāo)準(zhǔn)接口工作。例如,TesterPin框架類的實現(xiàn)標(biāo)準(zhǔn)化成實現(xiàn)測試類可以與硬件模塊引腳交互的通用測試器引腳接口。特定的框架對象可以實現(xiàn)成利用模塊級接口247的幫助工作,與模塊通信。站點控制器框架類實際上充當(dāng)支持每個站點控制器的本地操作系統(tǒng)。大體上,多于90%的程序代碼是用于設(shè)備測試的數(shù)據(jù),而剩余的10%代碼實現(xiàn)測試方法。設(shè)備測試數(shù)據(jù)是依賴于DUT的(例如,電源條件、信號電壓條件、定時條件等)。測試代碼包括將特定的設(shè)備條件加載到ATE硬件上的方法,還有那些實現(xiàn)特定于用戶的目標(biāo)(例如,數(shù)據(jù)登錄)所需的方法。本發(fā)明一種實施方式的框架提供獨立于硬件的允許用戶執(zhí)行DUT測試編程任務(wù)的測試與測試器對象模型。為了增加測試代碼的可重用性,可以使這種代碼獨立于任何特定于設(shè)備的數(shù)據(jù)(例如,引腳名、模擬數(shù)據(jù),等等)或特定于設(shè)備測試的數(shù)據(jù)(例如,用于DC單元的條件、測試引腳、目標(biāo)引腳數(shù)、模式文件名、模式程序地址)。如果測試代碼利用這些類型的數(shù)據(jù)編譯,則測試代碼的可重用性降低。因此,根據(jù)本發(fā)明的實施方式,可以使任何特定于設(shè)備的數(shù)據(jù)或者特定于設(shè)備測試的數(shù)據(jù)在外部對測試代碼可用,作為代碼執(zhí)行時的輸入。在本發(fā)明的實施方式中,在此表示為Itest的一個測試類(它是標(biāo)準(zhǔn)測試接口的實現(xiàn))實現(xiàn)測試數(shù)據(jù)的與用于特定類型測試的代碼(及因此代碼的可重用性)的分離。這種測試類可以看作是用于其自己的獨立實例的“模板”,彼此只根據(jù)特定于設(shè)備和/或特定于設(shè)備測試的數(shù)據(jù)不同。測試類在測試計劃文件中指定。每個測試類一般實現(xiàn)特定類型的設(shè)備測試或用于設(shè)備測試的設(shè)置。例如,本發(fā)明的實施方式可以提供Itest接口的特定實現(xiàn),例如FunctionalTest,作為所有DUT功能性測試的基礎(chǔ)。它提供設(shè)置測試條件、執(zhí)行模式和基于失敗的選通脈沖的存在確定測試狀態(tài)的基本功能性。其它類型的實現(xiàn)可以包括AC和DC測試類,在此表示為ACParametricTests和DCParametricTests。所有的測試類型都可以提供某些虛擬方法(例如,init()、preExec()和postExec())的缺省實現(xiàn)。這些方法變成測試工程師覆蓋缺省特征并設(shè)置任何特定于測試的進入點。但是,定制的測試類也可以在測試計劃中實現(xiàn)。測試類允許用戶通過提供用于指定該測試特定實例的選項的參數(shù)來配置類特征。例如,F(xiàn)unctionalTest可以取參數(shù)Plist和TestConditionS,來分別指定要執(zhí)行的模式列表和測試的電平與定時條件。指定這些參數(shù)的不同值(通過使用測試計劃描述文件中不同的“測試”塊)允許用戶創(chuàng)建函數(shù)Test的不同實例。圖5說明了不同的測試實例可以如何從單個測試類中導(dǎo)出。這些類可以直接以面向?qū)ο蟮慕Y(jié)構(gòu),例如C++代碼,編程,或者設(shè)計成允許測試程序編譯器從測試計劃文件取該測試及其參數(shù)的描述并生成對應(yīng)的C++代碼,C++代碼可以編譯并鏈接以便生成測試程序??梢圆捎媚0鍘熳鳛橐话闼惴ㄅc數(shù)據(jù)結(jié)構(gòu)的通用庫。這個庫可以對測試器用戶是可見的,使得用戶可以例如修改測試類的實現(xiàn),以便創(chuàng)建用戶定義的測試類。關(guān)于用戶開發(fā)的測試類,系統(tǒng)的實施方式支持這種測試類集成到框架中,因為所有測試類都從例如ITest的單個測試接口導(dǎo)出,因此框架可以與標(biāo)準(zhǔn)系統(tǒng)測試類集合相同的方式控制它們。在理解它們必須在其測試程序中使用定制代碼以便利用這些附加功能的情況下,用戶可以自由地將附加功能結(jié)合到它們的測試類中。每個測試站點110都專用于測試一個或多個DUT106,并通過可配置的測試模塊集合112起作用。每個測試模塊112都是執(zhí)行特定測試任務(wù)的實體。例如,測試模塊112可以是DUT電源、引腳卡、模擬卡,等等。這種模塊方法提供了高度的靈活性和可配置性。模塊命令實現(xiàn)類248可以由模塊硬件廠商提供,并依賴于廠商所選的命令實現(xiàn)方法,實現(xiàn)用于硬件模塊的模塊級接口或者提供標(biāo)準(zhǔn)接口的特定于模塊的實現(xiàn)。這些類的外部接口是由預(yù)定義的模塊級接口需求和背板通信庫需求定義的。這一層還提供標(biāo)準(zhǔn)測試命令集合的擴展,以便允許方法(函數(shù))與數(shù)據(jù)元素的添加。背板通信庫249提供跨背板的標(biāo)準(zhǔn)通信的接口,從而提供與連接到測試站點的模塊通信所必需的功能。這使得特定于廠商的模塊軟件可以使用背板驅(qū)動器250與對應(yīng)的硬件模塊通信。背板通信協(xié)議可以使用基于包的格式。測試引腳對象表示物理測試器通道,并從測試器引腳接口導(dǎo)出,在此表示為ITesterPin。本發(fā)明實施方式的軟件開發(fā)包(SDK)提供也可以稱為TesterPin的ItesterPin的缺省實現(xiàn),這是根據(jù)預(yù)定義的模塊級接口IChannel實現(xiàn)的。如果他們可以根據(jù)Ichannel實現(xiàn)他們的模塊功能性,則廠商可以自由地使用TesterPin,否則,他們必須提供與他們的模塊一起工作的ItesterPin的實現(xiàn)。在此表示為Imodule的由本發(fā)明測試器系統(tǒng)提供的標(biāo)準(zhǔn)模塊接口一般地表示廠商的硬件模塊。不同的廠商可以提供不同的模塊。而且,一個廠商可以提供多個不同的模塊。廠商支持的特定于模塊的系統(tǒng)軟件可以例如動態(tài)鏈接庫(DLL)的可執(zhí)行代碼的形式提供。用于來自一個廠商的每種模塊類型的軟件可以封裝到單個DLL中。每個這種軟件模塊都負責(zé)提供用于模塊接口命令的特定于廠商的實現(xiàn),這包括用于模塊軟件開發(fā)的API。有兩方面的模塊接口命令第一,它們充當(dāng)用戶與系統(tǒng)中特定硬件模塊(間接)通信的接口,第二,它們提供第三方開發(fā)人員可以用于將他們自己的模塊集成到站點控制器級框架中的接口。因此,由框架提供的模塊接口模塊分成兩種類型[73]第一種且最顯著的類型是通過框架接口暴露給用戶的那些“命令”。因此,例如,測試器引腳接口(ITesterPin)提供獲得和設(shè)置電平與定時值的方法,而電源接口(IPowerSupply)提供用于上電和下電的方法。此外,框架提供預(yù)定義模塊級接口的特定類,這可以用于與模塊通信。這些是由框架類(即,框架接口的“標(biāo)準(zhǔn)”實現(xiàn))用于與廠商模塊通信的接口。但是,第二方面的使用,模塊級接口,是可選的。這樣做的好處是廠商可以利用如ITesterPin和IPowerSupply等的類的實現(xiàn),同時集中到通過實現(xiàn)模塊級接口發(fā)送到其硬件的特定消息的內(nèi)容。但是,如果這些接口對廠商不合適,則他們可以選擇提供他們框架接口的定制實現(xiàn)(例如,ITesterPin、IpowerSupply等的廠商實現(xiàn))。然后這些將提供對他們硬件合適的定制功能。以這種開放體系作為背景,以下進一步描述本發(fā)明的測試程序開發(fā)系統(tǒng)。以下的部分A描述用于描述其中測試程序?qū)⑹褂玫臏y試環(huán)境的規(guī)則;部分B描述用于測試程序開發(fā)的方法與規(guī)則;部分C指定開發(fā)測試計劃及如何定義測試程序主結(jié)構(gòu)的方法與規(guī)則;部分D描述如何在開放體系的測試系統(tǒng)上運行測試程序;部分E描述用于測試模式的方法;部分F描述用于描述測試模式定時的規(guī)則;而部分G描述用于整體測試器操作的規(guī)則。A.部件[77]測試環(huán)境包括指定提供測試器并用于使之準(zhǔn)備運行一組測試所必需條件的一組文件。測試環(huán)境優(yōu)選地包括用于以下功能的文件1.測試器資源定義用于在開放體系測試系統(tǒng)中可用的測試器資源類型及這種資源支持的參數(shù)的說明。2.測試器配置用于站點控制器、站點及對應(yīng)映射的說明。3.模塊配置用于每個站點中硬件模塊的說明。4.引腳描述用于DUT引腳的命名,例如信號引腳、電源,并描述引腳組,5.套接字用于DUT引腳到測試器引腳分配的說明。6.引腳選項用于引腳特定選項或模式的說明。7.模式列表用于測試模式及其序列的說明。8.模式用于測試向量的說明。以上所述1-3項是由ICF(安裝與配置文件)利用來自CMD(配置管理數(shù)據(jù)庫)的信息創(chuàng)建,并使得可以在眾所周知的位置獲得,而4-8項是特定于用戶的。這部分提供了以上1-6項的描述;7-8項在部分E中更具體地描述。這些組件中的每一個優(yōu)選地使用特定的方法與規(guī)則開發(fā);這些方法與規(guī)則將在這部分中通過例子描述。A1.資源定義[79]每個硬件模塊提供測試系統(tǒng)所使用的一種或多種類型的硬件資源(簡單地說是資源)。測試器資源定義優(yōu)選地用于聲明一組用于可用資源類型的資源名及一組參數(shù)名和與每種特定資源類型關(guān)聯(lián)的類型。例如,資源名dpin用于指數(shù)字測試器引腳。這些資源具有例如VIL(用于輸入低電壓)、VIH(用于輸入高電壓)、VOL(用于輸出低電壓)、VOH(用于輸出高電壓)等的參數(shù)。資源定義文件將具有“.rsc”的后綴。以下所示是例子資源定義,包含一些測試器資源##FileResources.rsc#Version0.1.2;ResourceDefs{#digitalpinsdpin{#LowandHighvoltagesforinputpinsVoltageVIL,VIH;#LowandHighvoltagesforoutputpinsVoltageVOL,VOH;}#powerstuppliesdps{##PRE_WAITspecifiesthetimetowaitaftervoltage#reacheditsfinalvaluetostartpattern#generation.Theactualtimethatthesystem#willwaitisasmallsystemspecifiedrange:#PRE_WAIT-delta<=actual<=PRE_WAIT+delta##PRE_WAIT_MINisamininmurnamounttowaitaftervoltage#reacheditsfinalvaluetostartpatterngeneration.#Itisasystemspecifiedrarnge:#PRE_WAIT_MIN<=actual<=PRE_WAIT_MIN+delta##POST_WAITspecifiesthetimetowaitafterpattem#generationendstoshutdownthepower.Theactual#timethatthesystemwillwaitisasmallsystern#definedrange:#POST_WAIT-delta<=actual<=POST_WAIT+delta##POST_WAIT_MINspecifiesthetimetowaitafterpattern#gerneratiornendstoshutdownthepower.Theactual#timethatthesystemwillwaitisasmallsystem#definedrange:#POST_WAIT_MIN<=actual<=POST_WAIT_MIN+delta#TimePRE_WAIT;TimePRE_WAIT_MIN;TimePOST_WAIT;TimePOST_WAIT_MIN;#Thevoltage.VoltageVCC;}}應(yīng)當(dāng)指出,資源參數(shù)的類型(例如,電壓或時間)優(yōu)選地是標(biāo)準(zhǔn)工程單位。廠商提供的推薦不同參數(shù)說明的特定用途資源應(yīng)當(dāng)提供他們自己的資源定義文件。資源定義的結(jié)構(gòu)[81]以下給出根據(jù)本發(fā)明優(yōu)選實施方式的資源定義的結(jié)構(gòu)resource-file:version-inforesource-defsversion-info:Versionversion-identifer;resource-defs:ResoureeDefs{resource-def-list}resource-def-list:resource-defresouirce-def-listresource-defresource-def:resotwce-name{resource-params-decl-list}resource-params-decl-list:resource-params-declresource-params-decl-listresource-params-declresource-params-decl:elementary-type-nameresource-param-name-list;resource-param-name-list:resource-param-nameresource-param-name-list,resource-param-name[82]以下指定以上未定義的非終結(jié)符號1.versionidentifier從的一個或多個字符的序列。它表示版本號。2.resource-name從[a-zA-Z0-9]的一個或多個字符的序列,不能以數(shù)字開頭。它表示資源名,例如dpin或dps。3.elementary-type-name從[a-zA-Z0-9]的一個或多個字符的序列,不能以數(shù)字開頭。它表示基本類型名,例如Voltage(cf.)。4.resource-param-name從[a-zA-Z0-9]的一個或多個字符的序列,不能以數(shù)字開頭。它表示資源參數(shù)名,例如VIL。A2.測試器配置[83]測試器配置是一組優(yōu)選地用于列出特定系統(tǒng)配置中站點控制器及站點控制器與開關(guān)陣列輸入端口連接的規(guī)則。在本發(fā)明一個實施方式的體系中,單個站點控制器可以連接到單個開關(guān)陣列輸入端口。因此,在這種環(huán)境下,開關(guān)陣列連接充當(dāng)系統(tǒng)中站點控制器的隱含標(biāo)識符(其它配置也是可能的)。以下是典型測試器配置的例子##TesterConfiguration,Sys.cfg#Version1.2.5;SysConfig{##ThefirstfieldisthehostnameoftheSiteControllermachine;#itcanbespecifiedaseitheradotted-decimalIPaddressora#domain-qualifiedhostname.##Thesecondfieldistheswitchmatrixinputportnumber,which#implicitlyservesastheidentifierfortheSiteController#connectedtoit.#zeus.olympus.deities.org2;127.0.0.24;127.0.0.01;#SITEC-1127.0.0.33;}[84]用于特定測試層系統(tǒng)的系統(tǒng)配置是系統(tǒng)簡介的一部分,而且使得可以作為系統(tǒng)配置文件Sys.cfg訪問。應(yīng)當(dāng)指出,在一種實施方式中,連接到端口1(在以上例子中是“127.0.0.0”)的站點控制器可以享受特定狀態(tài),其中它獨自配置開關(guān)陣列。該“特定”站點控制器將稱為SITEC-1。還應(yīng)當(dāng)指出,因為站點控制器可以通過內(nèi)部網(wǎng)連接到系統(tǒng)控制器,所以在這個例子中指出的站點控制器是IP地址。相反,系統(tǒng)控制器可以連接到外部網(wǎng),以訪問文件,如模式數(shù)據(jù)。測試器配置的結(jié)構(gòu)[85]以下給出根據(jù)本發(fā)明實施方式系統(tǒng)配置文件的結(jié)構(gòu)system-config-file:version-infosystem-configversion-info:Versionversion-identifer;system-config:SysConfig{site-controller-connection-list}site-controller-connection-list:site-controller-connectionsite-controller-connection-listsite-controller-connectionsite-controller-connection:site-controller-hostnameinput-port;site-controller-hostname:ip-addressdomain-qualified-hostnameip-address:octet.octet.octet.octetdomain-qualified-hostname:namedomain-qualified-hostname.name[86]以下指定以上未定義的非終結(jié)符號1.versionidentifier從的一個或多個字符的序列。它表示版本號。2.octet從0到255的非負整數(shù)(十進制標(biāo)記)。3.name從[a-zA-Z0-9]的一個或多個字符的序列,不能以數(shù)字開頭。它表示有域名資格的主機名中的名字片斷。4.input-port非負整數(shù),十進制標(biāo)記A3.模塊配置[87]模塊配置允許測試器物理配置的說明,例如系統(tǒng)底盤中每個模塊的物理位置與類型。測試器總線配置的動態(tài)屬性使之稱為必需,其中測試器總線配置的動態(tài)屬性允許測試器總線地址到物理槽位置的映射。這種信息允許在系統(tǒng)引導(dǎo)時發(fā)生的硬件發(fā)現(xiàn)處理,以便使系統(tǒng)配置有效。開關(guān)陣列的每個輸出端口定義優(yōu)選地由單個硬件模塊占有的物理槽。以下所示是在根據(jù)本發(fā)明實施方式的文件Modules.cfg中指定的模塊配置的例子##ModuleConfigurationFile,Modules.cfg#Version0.0.1;ModuleConfig{##Aconfigurationdefinitionwhichprovidesinformationabout#themoduletypethatisattachedtoslots1-12and32-48.#Notethatamodulemightprovidemorethan#asingletypeofresource.#Slot1-12,32-48#Switchmatrixoutputports#whichusetheconfiguration#definedbelow.{VendorID1;#definedvendorcode.ModuleID1;#Vendor-definedidcode.ModuleDrivermodl.dll;#Modulesoftware.##Resourcenameddpinspecifieschannels#fordigitaldata.Thenamedpinisnot#akeyword.Itissimplythenameofahardware#resource,andisobtainedfromtheresource#definitionfile.#Resourcedpin{MaxAvailable32;#Resourceunits1..32.}Resourcearnalog{MaxAvailable16;#Resourceunits1..16.Disabled1-8;#Disabledresources1..8.#So,ernabledonesare9..16.}}##Aconfigurationdefinitionwhichprovidesinformationabout#themoduletypethatisattachedtoslots16-30,50,and61-64.#Slot16-30,50,61-64{Resourcedpin{MaxAvailable32;#Maxavailableresourceunits.Disabled3,30-32;#Disabledresources.}ModuleDriver″moduletwo.dll″;VendorID2;ModuleID2;}##Aconfigurationdefinitiorn,whichprovidesinformationabout#themoduletypethatisattachedtoslots65-66.#Slot65-66{ModuleID4;#DPSmodulewith8supplies.ModuleDrivetmod4.dll;VendorID1;##Resourcetypedpsspecifyingresourceunitsfora#DevicePowetSupply#Resourcedps{MaxAvailable4;Disabled1;}}}如前面所提到的,在一種實施方式中,槽指硬件模塊可以通過其連接的連接器,如開關(guān)陣列的輸出端口。每種配置定義提供關(guān)于可以連接到一個或多個槽的模塊的信息。在配置定義中指定的VendorID是與廠商關(guān)聯(lián)的唯一ID。ModuleID指由該廠商提供的模塊的類型。在測試器配置中,可以有相同ModuleID的幾個實例。ModuleDriver指為模塊提供服務(wù)的廠商提供的DLL。最后,Resource指由這個模塊提供服務(wù)的單元,并提供資源類型的名字;資源名是從資源定義文件獲得的。以上例子描述了模塊配置文件中的三個配置模塊。在一種實現(xiàn)中,第一個配置塊,槽1-12和32-48,是由廠商1生產(chǎn)的模塊提供服務(wù)的。該廠商提供模塊,標(biāo)識符“1”指這個模塊的類型,還提供控制模塊的模塊驅(qū)動器庫。這個模塊可以提供兩種類型的資源單元,一種由資源名“dpin”指示,優(yōu)選地是總共32個資源單元(即,“通道”),所有這些通道都是可用的,而另一種由資源名“analog”指示,總共16個資源單元,其中只有9至16是可用的。第二和第三個配置塊以與第一個配置類似的方式指定。應(yīng)當(dāng)指出,允許通道標(biāo)記為“disabled”使得可以識別仍然工作的模塊上損壞的資源單元。還應(yīng)當(dāng)指出,配置塊可以具有一個或多個槽標(biāo)識符。當(dāng)一個塊具有多于一個槽標(biāo)識符時,所標(biāo)識的槽被稱為是克隆的。模塊配置文件,Modules.cfg,是作為系統(tǒng)簡介的一部分由ICM(安裝配置管理系統(tǒng))(具有用戶提供的特定于測試層的信息)創(chuàng)建的,而且使得在眾所周知的位置可用。ICM可以是測試系統(tǒng)本地的實體,例如在系統(tǒng)控制器上,或者也可以駐留在系統(tǒng)控制器連接的網(wǎng)絡(luò)上的某個其它位置。ICM管理CMD(配置管理數(shù)據(jù)庫),并且一般隨著系統(tǒng)配置的硬件變化而更新。ICM允許用戶配置系統(tǒng),例如站點控制器和模塊。CMD是存儲配置的數(shù)據(jù)庫。對于實際的測試器配置/操作,ICM生成例如模塊配置的配置文件和其它文件,并將它們和例如特定模塊DLL的相關(guān)文件拷貝到測試器上。模塊配置的結(jié)構(gòu)以下是根據(jù)以上優(yōu)選實施方式的模塊配置結(jié)構(gòu)file-contentsversion-infomodule-config-defversion-infoVersionversion-identifier;module-config-defModuleConfig{slot-entry-list}slot-entry-llstslot-entryslot-entry-listslot-entryslot-entrySlotpositive-integer-list{slot-info}slot-inforequired-config-listrequired-config-listrequired-configrequired-config-listrequired-configrequired-configVendorIDid-code;ModuleIDid-code;ModuleDriverfile-name;Resourceresource-name{max-specdisabled-specopt}max-specMaxAvailablepositive-integer;disabled-specDisabledpositive-integer-list;positive-integer-listpositive-integer-list-entrypositive-integer-list,positive-integer-list-entrypositive-integer-list-entrypositive-integerpositive-integer-number-rangepositive-integer-number-range:positive-integer-pos-integer以下指定以上未定義的非終結(jié)符號1.version-identifier從的一個或多個字符的序列,其中第一個字符必須是從。2.positive-integer從的一個或多個字符的序列,不能以0開頭。3.id-code從[a-zA-Z0-9]的一個或多個字符的序列。4.resource-name從[a-zA-Z0-9]的一個或多個字符的序列,其中第一個字符必須是從[a-zA-Z]。支持注釋;注釋以“#”字符開頭,而且可以延伸到一行的結(jié)束。A4.引腳描述[95]DUT引腳描述利用引腳描述文件描述。用戶使得DUT的描述在引腳描述文件中可用,該文件具有后綴.pin。這個純文本文件至少包含以下內(nèi)容DUT引腳名的列表;及命名引腳組的初始定義,該定義使用所定義DUT引腳名(說“初始”是因為它們以后可以編程性地修改或添加等)。數(shù)據(jù)說明與測試計劃描述的分離允許DUT引腳定義一般的重用,并允許描述編譯器從引腳描述文件導(dǎo)出(分解在向量說明中所使用的引腳名引用所需的)引腳名,而不需要將處理綁定到特定的測試計劃。以下示出的是引腳描述文件的例子##Pindescriptionfile,myDUT.pin.##Notethatthisimplicitlyimportstheresource#configurationfile,Resources.rsc.#Version1.1.3a;PinDescription{Rcsourcedpin{A0;A1;A2;A3;A4;#Thissyntaxexpandstothenames″ABUS[1]″and″ABUS[2]″ABUS[1:2];A5;BBUS[1:8];DIR;CLK;GroupGrp1{DIR,CLK,A0,A1,A2,A3,A4,BBUS[1:4]}GroupGrp2{A5,##Thefollowinglinewillexpandto#″DIR,A1,A2,A4,A5,BBUS[2]″:#Grp1-CLK-A0-A3-BBUS[1]-BBUS[3:4]+A5,BBUS[5:8]}}Resourcedps}vcc1;vcc2;vcc3;GroupPSG{vcc1,vcc2}}應(yīng)當(dāng)指出,DUT引腳與引腳組定義封裝在資源類型塊中,以便允許編譯器關(guān)聯(lián)引腳和引腳組與電平所允許的參數(shù)設(shè)置等。應(yīng)當(dāng)注意以下關(guān)于引腳描述的點1.引腳組與引腳共享相同的命名空間并具有全局(即,測試計劃)范圍。這些名字的全局范圍的一個結(jié)果是即使當(dāng)在不同的資源塊中聲明時,引腳和引腳組也不能使用復(fù)制的名字。2.在引腳描述文件中需要至少一個資源定義。3.在每個資源中至少應(yīng)當(dāng)定義一個引腳名。4.在資源邊界中引腳和組名需要唯一。5.相同的引腳或組名可以對兩個或更多資源定義。但是,相同資源中的復(fù)制被忽略。6.出現(xiàn)在組定義中的所有引腳名與組名應(yīng)當(dāng)已經(jīng)在該資源中定義。7.如果給出了,則組定義應(yīng)當(dāng)具有至少一個引腳名或組名(即,組定義不能為空)。8.引腳組定義可以包括對已經(jīng)定義的引腳組的引用。9.引腳組定義可以包括例如已經(jīng)定義的引腳和/或引腳組的加減的集合運算。引腳描述的結(jié)構(gòu)[100]以下給出的是根據(jù)本發(fā)明優(yōu)選實施方式的引腳描述的結(jié)構(gòu)pin-description-file:version-infopin-descriptionversion-info:Versionversion-identtfer;pin-description:PinDescription{resource-pins-def-list}resource-pins-def-list:resource-pins-defresource-pins-def-listresource-pins-defresource-pins-def:Resourceresource-name{pin-or-pin-group-def-list}pin-or-pin-group-def-list:pin-or-pin-group-defpin-or-pin-group-def-listpin-or-pin-group-defpindef-or-pin-groupdef:pin-def;pin-group-defpin-def:pin-namepin-name[index:index]pin-group-def:Grouppin-group-name{pin-group-def-item-list}pin-group-def-item-list:pin-defpin-group-def-item-list,pin-def[101]以下指定以上未定義的非終結(jié)符號1.version-identifier從的一個或多個字符的序列。它表示版本號。2.resource-name從[a-zA-Z0-9]的一個或多個字符的序列,不能以數(shù)字開頭。它表示資源名,如dpin或dps。3.pin-name從[a-zA-Z0-9]的一個或多個字符的序列,不能以數(shù)字開頭。它表示引腳A0的名字。4.pin-group-name從[a-zA-Z0-9]的一個或多個字符的序列,不能以數(shù)字開頭。它表示引腳組ABUS的名字。5.index非負整數(shù)。它表示相關(guān)引腳組的下界或上界。A5.套接字[102]套接字指定DUT引腳名與物理測試器引腳(通道)指定(物理測試器通道號在模塊配置文件中定義)之間的映射。應(yīng)當(dāng)指出,套接字可以用于支持不同的DUT包和不同的加載板配置等。對于多DUT系統(tǒng),用于DUT/通道指定的套接字定義可以支持基本套接字到多個站點的“克隆”。但是,不同的套接字(即,用于相同邏輯引腳的不同物理映射)應(yīng)當(dāng)考慮站點模塊分區(qū)。因此,除了提供DUT引腳到測試器通道指定,套接字還可以有效地定義站點分區(qū)。因此,套接字文件可以包含用于幾個獨立站點套接字的定義。以下所示是定義三個DUT站點的樣本套接字文件Version1.1.3SocketDef{DUTTypeCHIP3{PinDescriptiondutP3.pin;#ThepindescriptionfileforCHIP3DUT2#Usesthefull-specificationsyntax{SiteController1;#SwitchMatrixinputportResourcedpin{##TheCLKpinisassignedtoresourcedpin,#slot2,resourceunit(channel)13.#CLK2.13;##TheDIRpinisassignedtoresourcedpin,#slot5,resourceunit15.DIR5.15;##Thefollowingstatementwillbeexpandedto#BBUS[7]5.4#BBUS[6]5.5#BBUS[5]5.6##Soforexample,thepinsequenceBBUS[7],BBUS[6],#BBUS[5]isassignedtothesameslot5,andto#resourceunits4,5and6respectively.#BBUS[7:5]5.[4:6];BBUS[1:4]7.[21:18];BBUS[8]9.16;}Resourcedps{##TheV1pinisassignedtoresourcedps,#slot1,resourceunit(channel)1.#VCCl1.1;##TheVCC2pinisassignedtoresourcedps,#slot1,resourceunit(chanrnel)2.#VCC21.2;}}#EndDUT2DUT1#Thisis″cloned″″fromDUT2above{SiteController1;#SameSiteControllerasforDUT2Resourcedpin{SlotOffset1;#Offsetvalueforslots}Resourcedps{SlotOffset10;#Offsetvalueforslots}##Theoffsetsyntaxaboveindicatesthattheslot/resource#unitassignmentsare″cloned″fromthefirstDUTdefined#forthisDUTType,i.e.,DUT2,withtheslorsoffsetby#theSlotOffsetvalues.##Lookingatthedefinitionofdpinresourceunitsfor#DUT2,CLKisboundtoslot2.Hence,forthepresent#DUT,CLKisboundtoslot2+1=3.##Someofthenewbindingsineffectduetotheoffset#assignmentsareshowninthetablebelow##-------------------------------------#PinResourceRUnitSlot#-------------------------------------#CLKdpin132+1=3#DIRdpin155+1=6#BBUS[8]dpin169+1=10#VCC1dps11+10=11#VCC2dps21+10=11#}#EndDUT1}#EndDUTTypeCHIP3DUTType74LS245{PinDescriptiondutLS.pin;DUT3disabled#ThisDUTsiteisdisabled,andwillbeignored{…}}#EndDUTType74LS245}#EndSocketDef[103]以下關(guān)于套接字的點應(yīng)當(dāng)注意1.套接字文件使用來自模塊配置文件和用于給定DUT類型的用戶引腳描述文件(見上例中PinDescription的說明)。使模塊配置信息對套接字文件編譯器隱含可用。套接字文件編譯器是模式編譯器的子部分,它讀取并分析套接字DUT名到測試器通道映射,讀取并分析模塊配置與引腳描述文件來設(shè)置模式編譯器所使用的測試器引腳到DUT引腳的映射。2.每種DUT類型至少需要一個DUT站點定義,而且與SlotOffset語法相反,它必須使用完全說明語法。如果對同一DUT類型提供多于一個DUT站點定義,則第一個必須使用完全說明語法。3.每個后續(xù)的DUT站點定義(對于同一DUT類型)可用使用完全說明語法或者SlotOffset語法,但不能兩者都使用。這使得單個站點可能(由于,例如,不起作用的通道)偏離標(biāo)準(zhǔn)模式。4.偏離SlotOffset語法的綁定是關(guān)于為該DUT類型定義的第一個站點(該站點使用完全說明語法)定義的。5.DUT站點不需要以實際的物理次序聲明。這允許第一(物理)站點偏離模式的情況。6.DUT站點ID需要在整個套接字(即,所有在其中定義的DUT類型)上是唯一的。7.對每個DUT站點定義需要至少一個資源定義。8.站點定義必須與模塊配置一起使用,以確定測試配置是單站點/單DUT還是單站點/多DUT。9.在所有情況下,套接字文件都應(yīng)當(dāng)指定一組與引腳模式文件和模塊配置文件一致的DUT通道映射。10.在有些情況下,期望允許套接字定義指定一個或多個DUT通道從測試器斷開(例如,通過指定所分配物理通道為具有特定ID“0.0”的通道)。在這種情況下,這些DUT通道可在測試環(huán)境下使用和參考。這種通道上的操作將導(dǎo)致系統(tǒng)警告(但不是錯誤)。在加載時,將丟棄斷開通道的模式數(shù)據(jù)。套接字的結(jié)構(gòu)[104]以下是根據(jù)本發(fā)明優(yōu)選實施方式的模塊配置的結(jié)構(gòu)socket-file:version-infosocket-defversion-info:Versionversion-identifer;socket-def:SocketDef{device-specific-socket-def-list}device-specific-socket-def-list:device-specic-socket-defdevice-specific-socket-def-listdevice-specific-socket-defdevice-specific-socket-def:DUTTypeDUT-type-name{pin-description-filedut-info-list}pin-description-file:PinDescpin-description-file-name;dut-info-list:du-infodut-info-listdut-infodut-infoDUTdut-id{site-controller-input-portresource-info-list}site-controller-input-port:SiteControllerswitch-muitrix-input-port-number;resource-info-list:resource-inforesource-info-listresource-inforesource-info:Resourceresource-name{resource-item-unit-assignment-list}resource-item-unit-assignment-list:resource-item-unit-assignmentresource-item-unit-assignment-listresource-item-unit-assignmentresource-item-unit-assignment:resource-item-nameslot-number.resource-unit;resource-item-name[resource-item-index]slot-number.resource-unit-index;resource-item-name[resource-item-index-range]\slot-number.[resource-unit-index-range];resource-item-index-range:resource-item-index:resource-item-indexresource-unit-index-range:resource-unit-index:resource-unit-index[105]以下指定以上未定義的非終結(jié)符號1.version-identifier選自集合的一個或多個字符的序列。它表示版本號。2.DUT-type-name選自集合的一個或多個字符的序列,其中第一個字符不能是選自集合。它不是DUT的類型,如CHIP3。3.pin-description-file-name簡單的文件名,不包括其目錄名,但包括所有后綴。文件名具有由主機操作系統(tǒng)識別的語法,并且如果包含在引號中,則允許空格和其它字符。4.switch-matrix-input-port-number十進制標(biāo)記的非負整數(shù),表示連接到站點控制器的輸入端口的端口號。5.dut-id十進制標(biāo)記的非負整數(shù),識別DUT的實例。6.resource-name選自集合的一個或多個字符的序列,其中第一個字符不能選自集合。它表示資源文件中所定義的資源的名字。7.resource-item-name選自集合的一個或多個字符的序列,其中第一個字符不能選自集合。它表示資源單元的名字,例如pin或pin組。8.resource-item-index十進制標(biāo)記的非負整數(shù),表示一組資源項的特定成員。當(dāng)在resource-item-index-range的環(huán)境下時,它表示連續(xù)資源項組序列的下或上界。9.resource-unit-index十進制標(biāo)記的非負整數(shù),表示一組資源單元(通道)的特定成員。當(dāng)在resource-unit-index-range的環(huán)境下時,它表示連續(xù)資源單元組序列的下或上界。A6.Pins[106]應(yīng)當(dāng)指出,除了物理通道映射的邏輯引腳名(如由套接字所提供的),幾種屬性可以用于指定測試器資源。例如,選項可以用于定義通道的特定硬件配置,這可以是特定于測試的、特定于廠商的和/或特定于測試系統(tǒng)的。這些將利用引腳模式選項進行描述,并使得可以通過引腳模式選項文件獲得。引腳模式選項定義將支持測試通道的特定選項或模式的配置。例如,這可以用于選擇并配置通道復(fù)用。由于它可能需要重要的通道配置,因此優(yōu)選地引腳模式選項只用作測試集合初始化流的一部分。引腳選項語法支持廠商定義的選項。一個例子在下面示出PinModeOptions{clockINdouble;a0OUTsingle;…};測試環(huán)境配置[108]如前面所指出的資源定義文件(Resources.rsc)、系統(tǒng)配置文件(Sys.cfg)與模塊配置文件(Modules.cfg)都優(yōu)選地在“眾所周知的”位置可以獲得。這種“眾所周知的”位置是由系統(tǒng)環(huán)境變量Tester_ACTIVE_CONFIGS的值指定的目錄。例如,如果Tester_ACTIVE_CONFIGS的值是目錄F:\Tester_SYS\configs,則系統(tǒng)將期望以下文件存在F:\Tester_SYS\configs\Resources.rsF:\Tester_SYS\configs\Sys.cfgF:\Tester_SYS\configs\Modules.cfg[109]在安裝過程中,駐留在主計算機上的安裝與配置管理系統(tǒng)(ICM)將優(yōu).選地設(shè)置Tester_ACTIVE_CONFIGS的值。每次當(dāng)ICM創(chuàng)建以上文件之一的新版本時,它就將新版本放置到由Tester_ACTIVE_CONFIGS指向的位置。應(yīng)當(dāng)指出,除了以上三個文件,例如模擬配置文件的其它系統(tǒng)配置文件也放置在由Tester_ACTIVE_CONFIGS指向的位置。B.用于測試程序開發(fā)的規(guī)則[110]測試器系統(tǒng)的兩個主要面向終端用戶的組件中的一個是測試環(huán)境。另一組件是測試器使之對終端用戶(即,測試工程師和測試類開發(fā)人員)可用的編程工具。編程環(huán)境的主要組件是測試計劃。測試計劃使用測試類(這是由Test標(biāo)記的測試接口的不同實現(xiàn)),該類實現(xiàn)用于特定類型測試的測試數(shù)據(jù)與代碼的分離。計劃可以直接寫為C++測試程序,或者在測試計劃描述文件中描述,該文件可以由測試程序生成器(翻譯器402)處理,以便產(chǎn)生例如C++代碼的面向?qū)ο蟠a。然后,所生成的C++代碼可以編譯成可執(zhí)行測試程序。構(gòu)成測試類實例所需的數(shù)據(jù),例如電平、定時等,由用戶在測試計劃描述文件中指定。測試程序包括一組指定在設(shè)備上運行測試的細節(jié)的用戶書寫文件。本發(fā)明的實施方式包括允許用戶利用C++結(jié)構(gòu)寫這些文件的規(guī)則集合。根據(jù)本發(fā)明實施方式的一個需求是遵循開發(fā)體系結(jié)構(gòu)測試系統(tǒng)的模塊化。模塊化開發(fā)允許用戶寫處理測試不同方面的獨立組件,然后允許這些組件以多種方式混合與匹配,以輸出完整的測試程序。根據(jù)本發(fā)明優(yōu)選實施方式的測試程序包括如下一組文件用于用戶變量和常量的文件*.usrv;用于說明組的文件*.spec;用于電平的文件*.lvl;用于定時的文件*.tim;用于測試條件組的文件*.tcg;用于bin定義的文件*.bdefs;用于定制功能和測試類的文件,用于pre-header的文件*.ph;用于定制類型的文件*.ctyp;用于定制變量的文件*.cvar;及用于測試計劃的文件*.tpl。以上的文件后綴是傳統(tǒng)推薦的方便的文件分類。單個測試程序?qū)?yōu)選地包括單個測試計劃文件及其導(dǎo)入的文件?!皩?dǎo)入”指具有或者直接由導(dǎo)入者引用的數(shù)據(jù)(指定導(dǎo)入的文件)或者由導(dǎo)入者直接引用的某個其它文件導(dǎo)入的數(shù)據(jù)的其它文件。測試計劃文件可以在其中定義全局符、流及其它這種對象,或者它可以從其它文件導(dǎo)入這種信息。這些規(guī)則允許任何以上組件或者在其自己的獨立文件中,或者直接內(nèi)聯(lián)到測試計劃文件。應(yīng)當(dāng)指出,測試計劃在概念上與C語言的main()函數(shù)類似。測試程序特征用戶變量與常量,說明組,電平,定時,測試條件,bin定義,pre-header,定制類型,定制變量,測試計劃,[116]測試程序標(biāo)識符優(yōu)選地以大寫或小寫字母字符開始,后面可以是任何數(shù)量的字母、數(shù)字或下劃線(_)字符。它具有在以下給出的描述中提供的幾個關(guān)鍵詞。這些關(guān)鍵字在該文檔中利用如Version的粗體可視識別。關(guān)鍵字是保留的,而且優(yōu)選地不用作標(biāo)識符。有幾個以下描述的特定符合,例如{,}(,),及其它。測試對象的確立[117]測試描述文件的導(dǎo)入使導(dǎo)入文件能夠引用由被導(dǎo)入文件使其可用的對象的名字。這允許導(dǎo)入文件引用被導(dǎo)入文件命名的對象??紤]導(dǎo)入引腳描述文件xxx.pin的套接字文件aaa.soc??梢杂幸矊?dǎo)入xxx.pin的另一bbb.soc文件。但是,這些文件中任何一個都不會使由xxx.pin所描述的對象形成。它們僅僅是引用已經(jīng)假設(shè)存在的對象。問題就提出來了這些對象什么時候形成這就是測試計劃文件根本不同的地方。與C類似,它是其中具有main()例程的文件。測試計劃文件中的“Import”語句將形成這些對象,即,使這些對象形成。以下所示的測試計劃mickey.tpl使得xxx.pin和aaa.soc中的對象形成#FileforMickey’sTestPlanVersion3.4.5;##Theseimportstatementswillactuallycausethe#objectstocomeintoexistence:#Importxxx.pin;#Elaboratespinandpin-groupokbjectsImportaaa.soc;#Elaboratessitesocketmapobjects#Otherimportsasnecessary…FlowFlow1{…}[119]測試計劃中xxx.pin的導(dǎo)入使得所有在xxx.pin中聲明的引腳和引腳組對象形成。這如下描述“文件xxx.pin形成”。對于測試計劃來說,直接導(dǎo)入需要形成的所有文件不是必需的。如果以下兩個語句中的任何一個為真,則文件x由文件y導(dǎo)入1.y有命名x的導(dǎo)入語句;或2.x由z導(dǎo)入,而y有命名z的導(dǎo)入語句。當(dāng)編譯測試計劃時,它將在文件中形成由測試計劃導(dǎo)入的所有對象。由測試計劃導(dǎo)入的文件集合按拓撲結(jié)構(gòu)排序,以便產(chǎn)生文件形成的次序。由測試計劃導(dǎo)入的文件集合稱為測試計劃的導(dǎo)入閉包。如果測試計劃的導(dǎo)入閉包不能按拓撲結(jié)構(gòu)排序,則必須有導(dǎo)入循環(huán)。這種狀態(tài)是不正確的,而且將被編譯器拒絕。用戶變量與常量全局變量與常量將利用用戶變量與常量定義。常量是其值在編譯時綁定而且不能改變的對象。例如,最大整數(shù)值將是常量。另一方面,綁定到變量的表達式可以通過API在運行時改變。整數(shù),無符號整數(shù),雙精度型,字符串,單位為伏特的電壓(V),單位為伏特每秒的電壓回轉(zhuǎn)(VoltageSlew)(VPS),單位為安培的電流(A),單位為瓦特的功率(W),單位為秒的時間(S),單位為米的長度(M),單位為赫茲的頻率(Hz),單位為歐姆的電阻(歐姆),及單位為法拉的電容(F)。類型整數(shù)、無符號整數(shù)、浮點數(shù)與字符串稱為基本類型?;绢愋蜎]有測試單位。不是基本類型的基礎(chǔ)類型是雙精度型,它具有相關(guān)聯(lián)的測試單位與比例。比例符號是通用的工程比例符號p(pico)是10-12,例如以pF(皮法)為單位n(nano)是10-9,例如以nS(納秒)為單位u(micro)是10-6,例如以uS(微秒)為單位m(milli)是10-3,例如以mV(毫伏)為單位k(kilo)是10+3,例如以kOhm(千歐)為單位M(mega)是10+6,例如以MHz(兆赫)為單位G(giga)是10+9,例如以GHz(千兆赫)為單位[123]具有用戶變量與常量的獨立文件具有后綴.usrv。以下是具有一些全局常量的文件的例子。具有一些變量的文件的例子稍后給出。#---------------------------------#Filelimits.usrv#---------------------------------Version1.0.0;##ThisUserVarscollectiondeclarationdeclaresasetof#globallyavailablevariablesandconstants.#UserVars{#SomeconstantIntegerglobalsusedinvariousplaces.ConstIntegerMaxInteger=2147483647;ConstIntegerMinInteger=-2147483648;#Smallestvaluesuchthat1.0+Epsilon!=1.0ConstDoubleEpsilon=2.2204460492503131e-016;#SomeimportantconstantsrelatedtoDoubleConstDoubleMaxDouble=1.7976931348623158e+308;ConstDoubleMinDouble=-MaxDouble;ConstDoubleZeroPlus=2.2250738585072014e-308;ConstDoubleZeroMinus=-ZeroPlus;}[124]以上聲明的UserVars的集合被看作是‘=’左邊變量的定義。因此,最好是變量或常量的定義僅出現(xiàn)一次,而且應(yīng)當(dāng)初始化。如前面所提到的,常量一旦定義就不應(yīng)當(dāng)改變。綁定到常量的表達式可以涉及前面定義的常量和文字值。另一方面,變量可以通過API改變。綁定到變量的表達式可以涉及前面定義的變量、常量和文字值。每個變量都綁定到在運行時維護的表達式對象。這提供了在運行時改變與變量關(guān)聯(lián)的表達式然后重新求所有變量的值的能力。表達式對象是變量或常量定義右側(cè)的解析形式。在一種實施方式中,沒有提供在運行時改變常量的工具。它們的值優(yōu)選地是在編譯時固定的。具有全局符的任何數(shù)量的這種文件可以存在于測試計劃的導(dǎo)入閉包中。以上全局文件是一組數(shù)字限制,而這里是一組利用工程測量單位的工程全局符及一些隨機用戶變量#---------------------------------#Filemyvars.usrv#---------------------------------Version0.1;##ThisdeclaresaUserVarscollectionofsomeengineering#globals.#UserVarsMyVars{#Engineeringquantities.ConstVoltageVInLow=0.0;#0VoltsConstVoltageVInHigh=5.0;#5VoltsConstVoltageVOutLow=400.0mV;#400milliVoltsConstVoltageVOutHigh=5.1;#5.1VoltsConstTimeDeltaT=2.0E-9;#2nanosecondsConstTimeClkTick=1.0ns;#1nanosecondConstResistanceR10=10.0kOhms;#10kiloOhms#Somevariablesaredeclaredbelow.CurrentILow=1.0mA;#1milliAmpCurrentIHigh=2.0mA;#2miIliAmpPowerPLow=ILow*VInLow;#LowpowervaluePowerPHigh=IHigh*VInHigh;#Highpowervalue##AnarrayoflowvaluesforallAbuspins.#ThevilforA0willbeinABusVil,forA1#inABusVil[1],andsoon.#VoItageABusVil[8]={1.0,1.2,Others=1.5};}[128]編譯器優(yōu)選地檢查單位與類型匹配。應(yīng)當(dāng)指出,由于電壓乘以電流得出功率,因此以上用于PLow和PHigh的等式將編譯。但是,如以下的語句一般不編譯##DoesnotcompilebecauseaCurrentandaVoltagecannotbeaddedtoyield#apower#PowerPxxx=IHigh+VInHigh[129]編譯器將允許特定的自動類型轉(zhuǎn)換PowerPxxx=2;#Setthepowerto2.0wattsIntegerY=3.6;#Ygetassigned3PowerPyyy=Y(jié);#Pyyygetassigned3.0wattsDoubleZ=Pyyy;#PyyygetsconvertedtounitlessDouble[130]到雙精度型、無符號整數(shù)和整數(shù)的顯式類型轉(zhuǎn)換也是允許的PowerPxxx=3.5;#Explicittypeconversionisallowed,butnotrequired.#Xbecomes3.5DoubleX=Double(Pxxx);#Xbecomes3.5IntegerY=Integer(Pxxx);[131]通過轉(zhuǎn)換成中間基本類型,不相關(guān)類型之間的轉(zhuǎn)換也是可能的PowerPxxx=3.5;#Explicittypeconversionisrequired.LengthL=Double(Pxxx);#Lbecomes3.5metersVoltageV=Integer(Pxxx);#Vbecomes3.0Volts[132]TestPlan對象提供了UserVars類,該類是包含名字及其關(guān)聯(lián)的表達式、值與類型的集合。用戶變量可以進入缺省用戶變量集合,或者進入命名用戶變量集合。以上例子中沒有指定名字的UserVars聲明進入缺省集合。但是,有可能顯式地如下命名集合#DeclareXandYintheMyVarsUserVarscollection.UserVarsMyVars{IntegerX=2.0;##ReferstotheaboveX,andtotheglobally#availableMaxIntegerfromthedefault#UserVarscolleotion.#IntegerY=MaxInteger-X;}#DeclareX,Y1andY2intheYourVarsUserVarscolleotion.UserVarsYourVars{IntegerX=3.0;#ReferstotheXfromMyVars.IntegerY1=MaxInteger-MyVars.X;#ReferstotheXdeclaredabove.IntegerY2=MaxInteger-X;}#MorevariablesbeingaddedtotheMyVarscollectionUserVarsMyVars{##ReferstoXandYfromtheearlierdeclaration#ofMyVars.#IntegerZ=X+Y;}[133]UserVars集合中的名字分解如下進行如果名字是合格的一即,名字包括被點分開的兩段-則變量來自由點前面的段命名的命名用戶變量集合。因此,上面的MyVars.X指MyVars集合中的X。名字“_UserVars”可以用于顯式地表示缺省用戶變量集合。如果名字不合格,且當(dāng)前集合中有同一名字的常量或變量,則名字分解成常量或變量。否則,名字分解成缺省用戶變量集合中的常量或變量。UserVars集合中定義塊的估計可以看作在順序發(fā)生的,從第一個定義到最后一個定義。這可能需要每個變量在其使用之前定義。此外,對于一個UserVars集合,可以有幾個定義塊,每個定義塊定義幾個變量。所有這些定義塊都可以看作是按照測試計劃中的聲明次序進行估計,然后,每個塊的變量也以聲明次序檢查。最后,可以有幾個UserVars集合,每個集合定義幾個定義塊上的變量。所有變量同樣可以看作是以聲明次序初始化。因此,在上例中,估計次序?qū)⑹荕yVars.X、MyVars.Y、YourVars.X、YourVars.Y1、YourVars.Y2、MyVars.Z。當(dāng)UserVars集合使用來自另一集合的變量時,它優(yōu)選地使用該變量的原始值。在集合之間不維護從屬信息。因此,基于從屬關(guān)系的重新估計可以限定到單個集合。每個用戶變量集合都指C++UserVars類的一個實例。C++UserVars類的缺省對象命名為“_UserVars”。UserVars聲明中未命名的變量是來自缺省用戶變量集合,并添加到這個缺省對象。命名用戶變量集合中的變量添加到具有該名字的C++UserVars類對象中。在上例中,“MyVars”C++對象將以變量X、Y和Z結(jié)束。用于用戶變量的C++[142]用戶變量實現(xiàn)為n元組的集合,每個n元組具有name串、const/var布爾值、作為枚舉值的type和作為表達式樹的expression。名字的表達式可以由以下調(diào)用設(shè)置enumElemenaryType{UnsignedIntegerT,IntegeT,DoubleT,VoltageT,...};StatussetExpression(constString&name,constboolisConst,constelemenaryType,constExpression&expression);[143]類型表達式是對應(yīng)于賦值右側(cè)的文本的解析形式的類型。有UserVars全局可用的實例。例如,limits.usrv(cf.page)中用戶變量的集合由以下所示的調(diào)用集合實現(xiàn)_UserVars.serExpression(“MaxInteger”,true,IntegerT,Expression(2147483647));_UserVars.setExpression(“Minlnteger”,true,IntegerT,Expression(-2147483648));_UserVars.setExpression(“Epsilon”,true,DoubleT,Expression(2.2204460492503131e-016));_UserVars.setExpression(“MaxDouble”,true,DoubleT,Expression(1.7976931348623158e+308));_UserVars.setExpression(“MinDouble”,true,DoubleT,Expression(“-MaxDouble”));_UserVars.setExpression(“ZeroPlus”,true,DoubleT,Expression(2.2250738585072014e-308));_UserVars.setExpression(“ZeroMinus”,true,DoubleT,Expression(“-ZeroPlus”));[144]以下是對myvars.usrv中聲明的變量所執(zhí)行的C++語句myVars.setExpression(“VlnLow”,true,VoltageT,Expression(0.0));myVars.setExpression(“VlnHigh”,true,VoltageT,Expression(5.0));myVars.setExpression(“DeltaTr”,true,TimeT,Expression(2.0E-9));myVars.setExpression(“ClkTick”,true,TimeT,Expression(1.0E-9));myVars.setExpression(“R10”,true,ResisranceT,Expression(10.0E+3));myVars.setExpression(“ILow”,false,CurrentT,Expression(1.0E-3));myVars.setExpression(“IHigh”,false,CurrentT,Expression(2.0E-3));myVars.setExpression(“PLow”,false,PowerT,Expression(“ILow*VlnLow”));myVars.setExpression(“PHigh”,false,PowerT,Expression(“IHigh*VInHigh”));myVars.setExpression(“ABusVil”,false,VoltageT,Expression(1.0));myVars.setExpression(“ABusVil[1]”,false,VoltageT,Expression(1.2));myVars.setExpression(“ABusVil[2]”,false,VoltageT,Expression(1.5));myVars.setExpression(“ABusVil[3]”,false,VoltageT,Expression(1.5));myVars.setExpressiom(“ABusVil[4]”,false,VoltageT,Expression(1.5));myVars.setExpression(“ABusVil[5]”,false,VoltageT,Expression(1.5));myVars.setExpression(“ABusVil[6]”,false,VoltageT,Expression(1.5));myVars.setExpression(“ABusVil[7]”,false,VoltageT,Expression(1.5));[145]在以上代碼中,Expression類優(yōu)選地具有表示表達式解析形式的構(gòu)造函數(shù)。Expression有幾個構(gòu)造函數(shù),包括一個取字符串字面量并解析的,還有一個取字符串字面量并只是作為字符串字面量使用的。這是通過為了可讀性在以上未指定的附加參數(shù)區(qū)分的。缺省用戶變量集合中的用戶變量將由類UserVars的_UserVars對象管理。命名用戶變量集合Xxx中的用戶變量將由名字為Xxx的UserVars對象管理。用于UserVars的運行時API[147]包含這些名字與表達式的C++UserVars類導(dǎo)出在運行時估計并修改這些值的應(yīng)用編程接口(API)。與UserVars關(guān)聯(lián)的表達式的修改也解決什么時候UserVars將重新估計和估計有什么影響的問題。首先考慮作為改變的結(jié)果,UserVars的重新估計什么時候應(yīng)當(dāng)被觸發(fā)的問題。如果在對表達式進行改變后立即觸發(fā),則用戶將不能夠在觸發(fā)重新估計之前進行一系列的相關(guān)改變。因此,重新觸發(fā)是由用戶的顯式調(diào)用觸發(fā)的。接下來考慮重新估計的影響。根據(jù)優(yōu)選上述發(fā)送,有三種類型可用的重新估計[150]UserVars集合重新估計是限定到單個UserVars集合的重新估計。這種操作的語義是再次重新估計這個集合中的所有變量。UserVars目標(biāo)重新估計是限定到對綁定到單個名字的表達式改變的重新估計。這將使用戶能夠改變單個名字的表達式,并使得集合的重新估計只考慮這個特定改變的發(fā)生。UserVars全局重新估計是所有UserVars集合的重新估計。這基本上以聲明次序觸發(fā)所有UserVars集合的重新估計,而且代價相當(dāng)高。所有以上重新估計都將在重新估計UserVars之后重新估計例如Level、Timings等的從屬對象。從屬對象將具有表示它需要重新估計的dirty位。在任何時候UserVars集合編程性改變時,它都將設(shè)置所有從屬對象的dirty位。這將觸發(fā)從屬對象的重新估計??偟膩碚f,命名UserVars集合幫助包含重新估計影響問題。重新估計通常限定到單個集合。使用UserVars的一種簡單方式將是僅使用缺省UserVars集合。以這種方式,進行改變的連鎖反應(yīng)可以對所有UserVars發(fā)生。這種連鎖反應(yīng)可以限定到幾個命名的UserVars集合。多個集合可以引用彼此的變量,但綁定到變量的值是在使用時綁定的。在UserVars集合之間不維護從屬關(guān)系。對于每種基本類型Xxx(無符號整數(shù)、電流、電壓等),獲得值的方法是StatusgetXxxValue(constString&name,Xxx&value)const;應(yīng)當(dāng)指出,沒有直接設(shè)置值的方法,它是通過在reevaluateCollection()的調(diào)用之后設(shè)置表達式的調(diào)用完成的。獲得和設(shè)置表達式的方法。setExpression()調(diào)用還可以用于定義到目前為止還沒有定義的新變量。enumelementaryType{UnsignedIntegerT,IntegerT,DoubleT,VoltageT,...};StatusgetExpression(constString&name,Expression&expression)const;StatussetExpression(constString&name,constboolisConst,constelementaryType,constExpression&expression);[158]setExpression()定義可能在表達式導(dǎo)致循環(huán)從屬關(guān)系的情況下失敗。例如,如果進行以下兩個調(diào)用,則第二個調(diào)用將以循環(huán)從屬錯誤而失敗setExpression(“X”,true,IntegerT,Expression(“Y+1”));setExpression(“Y”,true,IntegerT,Expression(“X+1”));這是因為綁定到名字的值是等式而不是賦值。當(dāng)變量的值改變時,提供重新估計所有直接和間接從屬名字的方法。例如以上成對調(diào)用的等式導(dǎo)致循環(huán)從屬關(guān)系,這是不允許的。應(yīng)當(dāng)指出,這個API一般不支持自發(fā)的重新估計。對setExpression()的調(diào)用不會使變量及依賴它的所有其它變量重新估計。綁定到所有變量的值將保持不變,直到發(fā)生對(以下)reevaluateCollection()的調(diào)用。確定特定名字是否為常量的方法是StatusgetIsConst(constString&name,bool&isConst);[161]獲得類型的方法是enumElementaryType{UnsignedIntegerT,IntegerT,DoubleT,VoltageT,...};StatusgetType(constString&name,ElementaryType&elementaryType)const;[162]UserVars集合重新估計方法是StatusreevaluateCollection();[163]該類將維護關(guān)于所有變量的等式及其從屬關(guān)系。當(dāng)這個方法被調(diào)用時,所有變量都將重新估計。UserVars目標(biāo)重新估計方法是StatusreevaluateTargeted(constString&var);[165]該類將維護關(guān)于所有變量的等式及其從屬關(guān)系。當(dāng)這個方法被調(diào)用時,命名變量及所有依賴它的對象都將重新估計。UserVars全局重新估計方法是staticStatusreevaluateAllCollections();[166]該類將維護關(guān)于所有變量的等式及其從屬關(guān)系。當(dāng)這個方法被調(diào)用時,以未指定的次序?qū)λ蠻serVars集合調(diào)用reevaluateCollection()。確定是否定義了特定名字的方法StatusgetIsDefined(constString&name,bool&isDefined)const;[168]確定是否所有用戶變量當(dāng)前都定義了的方法StatusgetNames(StringList&names)const;[169]刪除目前定義的變量的方法StatusdeleteName(constString&name);[170]如果名字用在涉及其它變量的表達式中,則這個操作將失敗。獲得依賴于給定變量或常量的變量和常量列表的方法StatusgetDependents(constString&name,StringList&dependents);說明集[171]說明集用于提供可以基于選擇器取值的變量集合。例如,考慮以下使用選擇器Minnie、Mickey、Goofy和Daisy的說明集。#-------------------------------#FileAaa.spec#-------------------------------Version1.0;ImportLimits.usrv;SpecivicationSetAaa(Minnie,Mickey,Goofy,Daisy){Doublexxx=1.0,2.0,3.0,4.0;Integeryyy=10,20,30,40;Integerzzz=MaxInteger-xxx,MaxInteger-xxx-1,MaxInteger-xxx-2.MaxInteger-xxx;#Thefollowingdeclarationassociatesasingle#value,whichwillbechosenregardlessofthe#selector.Itisequivalentto#Integerwww=y(tǒng)yy+zzz,yyy+zzz,yyy+zzz,yyy+zzzIntegerwww=y(tǒng)yy+zzz;}以上利用選擇器Goofy的說明集將進行以下關(guān)聯(lián)xxx=3.0;yyy=30;zzz=MaxInteger-xxx-2;www=y(tǒng)yy+zzz;[173]在說明集上設(shè)置選擇器的操作將在以后描述測試時討論。按照句法,說明集是選擇器(上例中的Minnie、Mickey、Goofy和Daisy)的列表及變量定義列表(上例中的xxx、yyy、zzz和www)。變量的定義涉及或者與選擇器列表一樣長或者只包括單個表達式的表達式列表。從概念上講,說明集可以看作是表達式陣列,其列是選擇器,行是變量,項是表達式。特定的選擇器(列)將每個變量(行)綁定到特定的表達式(項)。如果列表具有單個表達式,則表示具有該表達式的行復(fù)制與選擇器個數(shù)一樣多的次數(shù)。說明集可以出現(xiàn)在兩者獨立的環(huán)境中。它們可以獨立地在.spec文件中說明,在這種情況下它們?nèi)缟纤境霈F(xiàn)。這是命名說明集。否則,本地說明集可以在測試條件組中聲明。在這種聲明中,說明集將沒有名字。它將是本地說明集,只對所包含的測試條件組起作用。命名說明集可以在模仿命名用戶變量集合。以上說明集可以建模為命名為Aaa的UserVars集合,該集合將具有用于xxx[Mickey]、xxx[Goofy]、xxx[Daisy]、yyy[Minnie]等的表達式。當(dāng)在測試環(huán)境中選擇特定的選擇器(例如Mickey)時,xxx、yyy和zzz的值從變量名及說明集名獲得。測試條件組可以有最多一個說明集,或者是本地說明集,或者是對命名說明集的引用。本地說明集只出現(xiàn)在測試條件組的環(huán)境下,而且沒有顯式指定的名字。這種說明集具有由所包含的測試條件組的名字定義的隱含名字。為了在幾個說明集和幾個UserVars集合可見的時候在測試條件組中分解名字,應(yīng)用以下規(guī)則1.如果名字是合格的,則它必須在命名用戶變量集合中分解。2.如果名字不合格,則如果它在測試條件組中聲明,則名字在本地說明集中分解,而如果是在測試條件組中引用,則名字在命名說明集中分解。3.如果名字沒有被以上規(guī)則分解,則在缺省用戶變量集合中分解。為了說明這些規(guī)則,考慮以下利用(后述)測試條件組的例子。Version1.2.3;Imnporrlimits.usrv;#PicksupthelimitsUserVarsfileabove.Importaaa.spec;#picksuptheSpecificationSetAAAabove.TestConditionGrotupTCG1{SpecificationSet(Min,Max,Typ){vcc=4.9,5.1.5.0;}#Rule1:Resolutioninanameduservariablescollection.#AreferencetoMyVars.VInLowreferstoVInLowfromMyVars.#Rule2:Resolutioninalocalspecificationset.#Areferenceto“vcc”herewillresolveinthecontext#ofthelocalspecificationsetabove.#Rule3:Resolutionindefaultuservariablescollection.#Areferenceto“MaxInteger”herewillresolvetolimits.usrv.#Error:Resolutionofxxx#Areferencetoxxxdoesnotresolvebecauseitisneitherin#thelocalspecificationset,norinlimits.usrv.#Error:ResolutionofAaa.xxx#LooksforanamedUserVarscollectionnamedAaa.Thenamed#specificationsetdoesnotqualify.}TestConditionGroupTCG2{SpecificationSetAaa;#Referencestheimportedspecificationset#Rule1:Resolutioninanameduservariablescollection.#AreferencetoMyVars.VInLowreferstoVInLowfromMyVars.#Rule2:Resolutioninanamedspecificationset.#Areferenceto“xxx”herewillresolveinthecontext#ofthelocalspecificationsetAaaabove.#Rule3:Resolutionindefaultuservariablescollection.#Areferenceto“MaxInteger”herewillresolvetolimits.usrv.#Error:Resolutionofvcc#Areferencetovccdoesrnotresolvebecauseitisneiftherin#thenamedspecificationsetAaa,norinlimits.usrv.#Error:ResolutionofAaa.xxx#LooksforanamedUserVarscollectionnamedAaa.Thenamed#specificationsetdoesnotqualify.}[180]說明集中名字的分解(以上規(guī)則)需要設(shè)置的選擇器在需要名字分解時使能。這是通過測試條件組將通過指定選擇器在測試中被引用的事實實現(xiàn)的。用于說明集的C++[181]利用以上規(guī)則,說明集可以由C++SpecificationSet類實現(xiàn)。SpecificationSet類具有基本上與UserVars類相同的API,除了用于選擇器的額外字符串參數(shù)。因此,這個API不具體描述。所有命名說明集都優(yōu)選地與該名字的C++對象關(guān)聯(lián)。測試條件組環(huán)境中的本地說明集將具有對于該測試條件組唯一的名字。引用一個本地說明集的變量,而該變量處于它在其中定義的測試條件組環(huán)境之外,是非法的。電平[183]電平用于指定引腳和引腳組的參數(shù)。它是以下形式的聲明集合<pin-or-pin-group-name>{<pin-param-1>=xxx;<pin-param-2>=y(tǒng)yy;}[184]這種聲明指定命名引腳或引腳組的各種參數(shù)的設(shè)置。例如,如在以下例子中所示的,這種語句可以用于設(shè)置InputPins組中所有引腳的VIL值#---------------------------------#FileCHIPlevels.lvl#---------------------------------Version1.0;ImportCHIP3resources.rsc;ImportCHIP3pins.pin;LevelsCHIP3Levels{##Specifiespin-parametersforvariouspinsand#pingroupsusingglobalsandvaluesfrom#thespecificationset.##Theorderofspecificationissignificant.#Pinparameterswillbesetinorderfrom#firsttolastinthisLevelssection,and#fromfirsttolastforeachpinorpin-group#subsection.##FromtheimportedpindescriptionfileCHIP3pins.pin,#theInPinsgroupisinthe“dpin”resource.Fromthe#importedresourcedefinitopnfileCHIP3resources.rsc,#the“dps”resourcehasparametersnamedVILandVIH.#InPins{VIL=v_il;VIH=v_ih+1.0;}#Thefollowingstatementrequiresadelayof10uSafter#thecalltosettheInPinslevels.Actualdelaywillbe#asmallsystemdefinedrangearound10.0E-6:#10.0E-6-delta<=actual<=10.0E-6+deltaDelay10.0E-6;##FortheOutPins,thelevelsfortheparameters#VOLandVOHarespecified.#OutPins{VOL=v_ol/2.0;VOH=v_oh;}#Theclockpinwillhavespecialvalues.Clock{VOL=0.0;VOH=v_ih/2.0;}#ADelayof10uSafterthecalltosetClocklevels.#Thisisaminimumdelay,thatisguaranteedtobefor#atleast10.0uS,thoughitmaybealittlemore;#10.0E-6<=actual<=10.0E-6+deltaMinDelay10.0uS;##ThePowerPinsgroupisinthe“dps”resource.Pinsofthis#pingrouphavespecialparameters:#PRE_WAITspecifiesthetimetowaitaftervoltage#reacheditsfinalvaluetostartpattern#generation.Actualwaittimewillbeasmall#systemdefinedrangearoundPRE_WAIT(see)#POST_WAlTspecifiesthetimetowaitafterpattern#generationendstoshutdownthepower.Actual#waittimewillbeasmallsystemdefinedrange#aroundPRE_WAlT(see).#PowerPins{PRE_WAIT=10.0ms;POST_WAIT=10.0ms;#VCCreachesitsfinalvalueof2.0Vfromits#presentvalueinarampwithaVoltageSlewRate#of±.01VoltsperSecond.VCC=Slew(0.01,2.0V);}}LevelsCHIp4Levels{#...}[185]如上面所看到的,每個Level塊都優(yōu)選地由多個level項構(gòu)成,每個level項指定一個引腳或引腳組的參數(shù)。每個level項可以指定多個資源參數(shù)。用于設(shè)置這些level值的運行時語義如下[186]Level塊的level項是以聲明次序處理的。在多于一個Level項中出現(xiàn)的任何引腳都將被處理多次。用于單個參數(shù)的多個值說明應(yīng)當(dāng)以說明次序維護并應(yīng)用。Level項中的資源參數(shù)以它們被指定的次序處理。在設(shè)置下一組電平時,Delay語句使設(shè)置電平的處理暫停大約所指示的持續(xù)時間。實際的等待時間可以在大約所指定延遲的小系統(tǒng)定義范圍之內(nèi)。因此,如果延遲t秒,則實際的延遲將滿足t-Δt<=實際等待<=t+Δt[189]Delay語句將Level說明分成多個子序列,每個子序列將需要獨立測試條件存儲器設(shè)置來處理。MinDelay語句使設(shè)置電平的處理在設(shè)置下一電平組之前暫停至少所指定的持續(xù)時間。實際的等待時間可以在具有所指定最小延遲的最小值的小的系統(tǒng)定義范圍之內(nèi)。因此,如果最小延遲是t秒,則實際的延遲將滿足t<=實際等待<=t+Δt[191]MinDelay語句將Level說明分成多個子序列,每個子序列將需要獨立測試條件存儲器設(shè)置來處理。每個引腳或引腳組名字精確地在引腳描述文件(suffix.pin)中的一個資源中指定,因此具有在資源文件(suffix.rsc)中指定的特定的可行資源參數(shù)集合。所有命名的參數(shù)必須來自這個可行的資源參數(shù)集合中,而且必須具有與用于設(shè)置其值的表達式相同的基本類型。關(guān)于資源參數(shù)的名字與類型的信息來自資源文件。資源文件Resources.rsc隱含導(dǎo)入,向測試器提供如dpin和dps的標(biāo)準(zhǔn)資源的參數(shù)的名字與類型。資源參數(shù)是可以使用UserVars及來自命名說明集或當(dāng)前可視本地說明集的值的所分配表達式。Dps引腳資源具有特定的參數(shù)PRE_WAIT和POST_WAIT。PRE_WAIT參數(shù)指定從電源引腳達到其目的電壓的時間到模式生成可以開始的時間所需要經(jīng)過的時間段。POST_WAIT參數(shù)指定從模式生成停止的時間到電源引腳切斷所需要經(jīng)過的時間段。Dps引腳還指定電壓參數(shù)如何到達其最終的值。它們可以簡單地提供等式指定它,就象所有其它的引腳參數(shù)。在那種情況下,所述值將到達硬件所允許的值。它們還可以利用回轉(zhuǎn)語句指定它?;剞D(zhuǎn)語句指定電源電壓以具有指定絕對電壓回轉(zhuǎn)速度的斜率從初始值達到其最終值。用于Levels的C++[197]利用以上規(guī)則,C++Levels對象可以寫成支持以下操作有一種操作StatussetParameter(constString&pinOrPinGroupName,constString&parameterName,ElementaryTypeelementaryType,constExpression&Expression);[198]這個操作將表達式綁定到引腳或引腳組的參數(shù)。例如,dpin.InPinsVIH值由以下操作設(shè)置setParameter(”InPins”,”VIH”,VoltageT,Expression(”v_ih+1.0”));[199]對于Level對象中的所有聲明,這個操作將調(diào)用幾次。有一種操作StatusassignLevels(constString&selector);如前面所描述的,該操作將通過并產(chǎn)生所有預(yù)定義的模塊級接口以說明次序分配所有的參數(shù)電平。選擇器參數(shù)用于根據(jù)前面所指定的規(guī)則分解表達式中的名字。測試條件組[200]測試條件組子語言將說明、定時與電平的描述包裝在一起。定時對象常常利用參數(shù)指定。參數(shù)可以在定時中用于指定各種脈沖的上升邊緣和下降邊緣。同樣,電平可以通過指定各種電壓電平的最大、最小和一般值來參數(shù)化。測試條件組(TCG)對象根據(jù)這些說明將定時與電平的說明與實例化匯總到一起。TestConditionGroup聲明包含可選的SpecificationSet。SpecificationSet聲明可以是內(nèi)聯(lián)的(及未命名的)本地SpecificationSet,或者它也可以是對在其它地方聲明的命名SpecificationSet的引用。TCG聲明中可選的SpecificationSet聲明后面跟著至少一個Level或Timing聲明。它可以以任何次序既有Level又有Timing。但是,不允許有多于一個Level和Timing聲明。這些約束是通過句法實施的。除了沒有名字,TCG中的說明集聲明與獨立聲明的聲明設(shè)置完全一樣。它的名字隱含地是包含它的TCG的名字。Timing聲明包括來自指定定時文件的Timing對象的單個聲明。這里是具有測試條件組的文件的例子#---------------------------------#FilemyTestConditionGroups.tcg#---------------------------------Version0.1;ImportCHIPlevels.lvl;Importedges.spec;Importtiming1.tim;Importtiming2.tim;TestConditionGroupTCG1{#ThisLocalSpecificationSetusesuser-definedselectors#“min”,“max”and“typ”.Anynumberofselectorswithany#userdefinednamesisallowed.##Thespecificationsetspecifiesatablegivingvaluesfor#variablesthatcanbeusedinexpressionsttoinitialize#timingsandlevels.Thespecificationsetbelowdefines#valuesforvariablesasperthefollowingtable:#minmaxtyp#v_cc2.93.13.0#v_ihvInHigh+0.0vInHigh+0.2vInHigh+0.1#v_ilvInLow+0.0vInLow+0.2vInLow+0.1#...#Areferencesuchas“vInHigh”mustbepreviouslydefined#inablockofUserVars.##Thus,ifthe“max”selectorwasselectedinafunctional#test,thenthe“max”columnofvalueswouldbeboundto#thevariables,settingv_ccto3.1,v_ihtovInHigh+2.0#andsoon.##Notethatthisisalocalspecificationset,andhasno#name.SpecificationSet(min,max,typ){#Minimum,MaximumandTypicalspecificationsfor#voltages.Voltagev_cc=2.9,3.1,3.0;Voltagev_ih=vInHigh+0.0,vInHigh+0.2,vInHigh+0.1;Voltagev_il=vInLow+0.0,vInLow+0.2,vInLow+0.1;#Minimum,MaximumandTypicalspecificationsfor#leadingandtrailingtimingedges.Thebase#valueof1.0E-6uScorrespondsto1picosecond,#andisgivenasanexampleofusingscientific#notationfornumbersalongwithurnits.Timet_le=1.0E-6uS,1.0E-6uS+4.0*DeltaT,1.0E-6uS+2.0*DeltaT;Timette=30ns,30ns+4.0*DeltaT,30ns+2.0*DeltaT;}#ReferstotheCHIP3Levelsimportedearlier.It#isoneofpossiblymanylevelsobjectsthathavebeen#importedfromtheabovefile.LevelsCHIP3Levels;#Referstofiletirmingl.timcontainingthesingle#timingTiming1.Thefilenameshouldbequotedif#ithaswhitespacecharactersinit.TimingsTimingl;}#AnothertestconditiongroupTestConditionGroupTCG2{#ClockAndDataEdgesSpecsisaspecificationsetwhich#isavailableintheedges.specsfile.Assumeithas#thefollowingdeclaration:#SpecificationSetClockAndDataEdgesSpecs(min,max,typ)#{#Timeclock_le=10.00uS,10.02uS,10.01uS;#Timeclock_te=20.00uS,20.02uS,20.01uS;#Timedata_le=10.0uS,10.2uS,10.1uS;#Timedata_te=30.0uS,30.2uS,30.1uS;#}#ASpecificationSetreferencetothisnamedsetisbelow:SpecificationSetClockAndDataEdgesSpecs;#Aninlinedlevelsdeclaration.Sincetheassociated#specificaionset(above)doesnothavevariablessuch#asVInLow,VInHigh,VOutLowandVOutHigh,theymust#resolveinthedefaultUserVarscollection.Levels{InPins{VIL=VInLow;VIH=VInHigh+1.0;}OutPins{VOL=VOutLow/2.0;VOH=VOutHigh;}}#ThisTimingisfromthefile“timing2.tim”.Thetimings#willneedtheleadingandtrailingedgetimingsforclock#anddataasspecifiedintheabovespecificationset.TimingsTiming2;}在以上例子中,測試條件組TCG1描述了具有名字為“min”、“typ”和“max”的三個選擇器的說明集??梢杂腥魏螖?shù)量不同的選擇器。在說明集的主體中,對應(yīng)于選擇器,變量v_il、v_ih、t_le和t_te以值的三元組初始化。因此,在以上例子中,TCG1具有選擇器“min”的實例將綁定變量v_il具第一數(shù)字值(vInputLow+0.0)。它支持用于說明集的選擇器是用戶定義的重復(fù),而且允許任何次數(shù)的重復(fù)。唯一的要求是[204]說明集的選擇器是唯一的標(biāo)識符。在說明集中指定的每個值與精確地是與選擇器集合元素個數(shù)相同的值數(shù)組關(guān)聯(lián)。挑選第i個選擇器將使每個值綁定到其關(guān)聯(lián)的值向量的第i個值。在TCG中的說明集之后,可以有Level聲明或Timing聲明或兩者都有。Level聲明用于設(shè)置各種引腳參數(shù)的電平。在說明集中識別的變量將用于設(shè)置這些電平,以便允許用于引腳參數(shù)的不同實際值基于用于初始化TCG的選擇器的動態(tài)綁定。為了示例說明,考慮啟用選擇器“min”的測試。參考頁面上給出的說明集CHIP3Level,用于InPins組中引腳的引腳參數(shù)“VIH”將通過以下聲明被初始化成表達式(v_ih+1.0)InPins{VIL=v_il;VIH=v_ih+1.0;}[208]當(dāng)選擇器“min”啟用時,這分解成(VinHigh+0.0+1.0)。同樣,Timing對象可以基于說明集變量所選的值初始化。沒有必要同時具有Timing和Level聲明。如由以下例子所說明的,每個都可以自己出現(xiàn),或者以任何次序同時出現(xiàn)。#----------------------------------#FileLevelsOnlyAndTimingsOnly.tcg#----------------------------------Version0.1;#ALevels-onlyTestConditionGroup.TestConditionGroupLevelsOnlyTCG{SpecificationSet(Min,Max,Typ){Voltagev_il=0.0,0.2,0.1;Voltagev_ih=3.9,4.1,4.0;}#Aninlinedlevelsdeclaration.Sincetheassociated#specificationset(above)doesnothavevariablessuch#asVInLow,VInHigh,VOutLowandVOutHigh,theymust#resolveinthedefaultUserVarscollection.Levels{InPins{VIL=v_il;VIH=v_ih+1.0;}OutPins{VOL=v_il/2.0;VOH=v_ih;}}}#ATimings-onlyTestConditionGroupTestConditionGrouPTimingsOnlyTICG{SpecificationSet(Min,Max,Typ){Timet_le=0.9E-3,1.1E-3,1.0E-3;}TimingsTiming2;}[209]但是,應(yīng)當(dāng)指出,在一個TCG中不應(yīng)當(dāng)有多于一個Timing和多于一個Level。因此,總的來說,應(yīng)當(dāng)有至少一個Timing或Level,且每個至多有一個。測試條件[210]TestCondition對象將TCG綁定到特定的選擇器。一旦TCG已經(jīng)如上所示進行了聲明,則有可能如下所示聲明TestCondition對象TestConditionTCMin{TestConditionGroup=TCG1;Selector=min;}TestConditionTCTyp{TestConditionGroup=TCG1;Selector=typ;}TestConditionTCMax{TestConditionGroup=TCG1;Selector=max;}[211]這些測試條件將在測試計劃中如下實例化##DeclareaFunctionalTest“MyFunctionalTest”thatreferstothree#TestConditionGroupinstances.#TestFunctionalTestMyFunctionalTest{#SpecifythePatternListPList=patlAlist;#AnynumberofTestConditionscanbespecified:TestCondition=TCMin;TestCondition=TCMax;TestCondition=TCTyp;}在TCG(測試條件組)中名字分解[212]測試條件組中名字的分解在前面已經(jīng)討論過了。但是,這些規(guī)則可以重復(fù),而且以下再次給出1.如果名字是合格的(cf.page),則它必須在命名用戶變量集合中分解。2.如果名字不合格,則如果它在測試條件組中聲明,則名字在本地說明集中分解,而如果是在測試條件組中引用,則名字在命名說明集中分解。3.如果名字沒有被以上規(guī)則分解,則在缺省用戶變量集合中分解。TCG運行時[213]測試條件組具有以下運行時語義[214]利用實例化的TestCondition,測試(如FunctionalTest)將引用具有來自其SpecificationSet的特定選擇器的TCG。這種選擇器將SpecificationSet中的每個變量綁定到其與所選選擇器關(guān)聯(lián)的值。然后,變量與其值的綁定將用于確定Levels和Timings。TestConditionGroup中的參數(shù)Level優(yōu)選地以Level塊中出現(xiàn)的次序順序設(shè)置。因此,在CHIP3Level塊中,參數(shù)電平設(shè)置的次序如下(符號<resource-name>.<resource-parameter>)InputPins.VIL,InputPins.VIH,OutputPins.VIL,OutputPins.VIH,Clock.VOL,ClockVOH.這種順序的次序使測試寫程序看著電源的形式供點順序。此外,如果電平項出現(xiàn)兩次,即為一個引腳命名相同的引腳參數(shù),則該引腳參數(shù)被設(shè)置兩次。這也可以編程發(fā)生。如果參數(shù)由Slew語句設(shè)置,如VCC=Slew(0.01,2.0V);其意味著VCC將從其當(dāng)前值以具有每秒±0.01伏特的電壓回轉(zhuǎn)速度的斜率達到其2.0伏特的最終值。說明集變量也可以傳遞到TCG中的Timings對象。然后,Timings對象將基于所選的變量初始化。例如,通過指定波形的上升邊緣和下降邊緣,這種機制可以用于定制Timings對象。用于TCG的C++[218]利用以上規(guī)則,測試條件組可以在C++TestConditionGroup類中聲明并如下初始化[219]進行對TestConditionGroup成員函數(shù)的調(diào)用StatussetSpecificationSet(SpecificationSet*pSpecificationSet);該函數(shù)將設(shè)置TestConditionGroup的說明集。這可以是本地說明集,或者命名說明集,或者為空(如果都沒有)。進行對TestConditionGroup成員函數(shù)的調(diào)用StatussetLevels(Levels*pLevels);該函數(shù)將設(shè)置TestConditionGroup的Level對象。這可以是局部聲明的Level對象,或者是外部聲明的Level對象,或者為空(如果都沒有)。進行對TestConditionGroup成員函數(shù)的調(diào)用StatussetTimings(Timings*pTimings);該函數(shù)將設(shè)置TestConditionGroup的Timings對象。這可以是局部聲明的Timings對象,或者為空(如果都沒有)。Bin定義[222]Bin定義類定義Bin,即概括測試許多DUT的結(jié)果的計數(shù)器的集合。在測試DUT的過程中,DUT可以設(shè)置成任何bin,例如,指示特定測試的結(jié)果。在測試進行中,DUT可以設(shè)置成其它bin。DUT最終設(shè)置成的bin是在測試結(jié)束時所設(shè)置的最后一個。這種最終bin的計數(shù)器在這個DUT的測試結(jié)束時遞增。具有bin定義的獨立文件應(yīng)當(dāng)具有后綴.bdefs。Bin定義優(yōu)選地是分層的。例如,在最外面的一層,可以有具有名字為Pass和Fail的兩個bin的PassFailBins。然后,可以有幾個HardBins,其中一些映射到Passbin,其它則映射到Failbin。HardBins被認為是PassFailBins的求精。最后,可以有大量的SoftBins,它們是HardBins的求精,其中很多映射到相同的HardBin。以下是說明bin層次的例子。#-----------------------------------#FileCHIPbins.bdefs#------------------------------------Version1.2.3;BinDefs{#TheHardBinsareanoutermostlevelof#bins.Theyarenotarefinementofanyother#bins.BinGroupHardBins{“3GHzPass”:“DUTspassing3GHz”;“2.8GHzPass”:“DUTspassing2.8GHz”;“3GHzFail”:“DUTsfailing3GHz”;“2.8GHzFail”:“DUTsfailing2.8GHz”;LeakageFail:“DUTsfailingleakage”;}#TheSoftBinsareanextlevelofrefinement.#SoftBinsarearefiementofHardBins.BinGroupSoftBins:HardBins{“3GHzAllPass”:“GoodDUTsat3GHz”,“3GHzPass”;“3GHzCacheFail”:“CacheFailsat3GHz”,“3GHzFail”;“3GHzSBFTFail”:“SBFTFailsat3GHz”,“3GHzFail”;“3GHzLeakage”:“Leakagesat3GHz”,LeakageFail;“2.8GHzAllpass”:“GoodDUTsat2.8GHz”,“2.8GHzPass”;“2.8GHzCacheFail”:“CacheFailsat2.8GHz”,“2.8GHzFail”;“2.8GHzSBFTFail”:“SBFTFailsat2.8GHz”,“2.8GHzFail”;“2.8GHzLeakage”:“Leakagesat2.8GHz”,LeakageFail;}}在以上例子中,最基本的bin是BinGroupHardBins。如果某個其它BinGroup是X的求精,則BinGroupX被看作是一組基本bin。因此,由于BinGroupSoftBins是HardBins的求精,所以BinGroupHardBins是一組基本bin。如果沒有其它BinGroup是Y的求精,則BinGroupY被看作是一組leafbin。其中具有單個BinGroupZ的BinDefs塊的退化情況將使Z為一組最基本的bin及一組leafbin。BinGroup名字是全局范圍的??梢杂腥魏螖?shù)量的BinDefs塊,但所聲明的BinDefs必須是獨特的。來自一個BinDefs塊的BinGroup允許來自另一BinDefs塊的BinGroup的求精。因此,在以上例子中,SoftBins可以在與HardBins獨立的BinDefs塊中。但是,為了可讀性,強烈推薦定義所有BinGroup的單個BinDefs塊?,F(xiàn)在,通過添加另一BinGroup,以上層次可以擴展成計算有多少DUT通過和失敗。#-----------------------------#FileCHIPbins.bdefs#-------------------------------Version1.2.3;BinDefs{#ThePassFailBinsareanoutermostlevelof#bins.Theyarenotarefinementofanyother#bins.BinGroupPassFailBins{Pass:“CountofpassingDUTS.”;Fail:“CountoffailingDUTS”;}#TheHardBinsareanextlevelofrefinement.#HardBinsarearefinementofthePassFailBins,#asindicatedby“HardBins:PassFailBins”.BinGroupHardBins:PassFailBins{“3GHzPass”:“DUTspassing3GHz”,Pass;“2.8GHzPass”:“DUTspassing2.8GHz”,Pass;“3GHzFail”:“DUTsfailing3GHz”,F(xiàn)ail;“2.8GHzFail”:“DUTsfailing2.8GHz”,F(xiàn)ail;LeakageFail:“DUTsfailingleakage”,F(xiàn)ail;}#TheSoftBinsareanextlevelofrefinement.#SoftBinsarearefinementofHardBins.BinGroupSoftBins:HardBins{“3GHzAllPass”:“GoodDUTsat3GHz”,“3GHzPass”;“3GHzCacheFail”:“CacheFailsat3GHz”,“3GHzFail”;“3GHzSBFTFail”:“SBFTFailsat3GHz”,“3GHzFail”;“3GHzLeakage”:“Leakagesat3GHz”,LeakageFail;“2.8GHzAllPass”:“GoodDUTsat2.8GHz”,“2.8GHzPass”;“2.8GHzCacheFail”:“CacheFailsat2.8GHz”,“2.8GHzFail”;“2.8GHzSBFTFail”:“SBFTFailsat2.8GHz”,“2.8GHzFail”;“2.8GHzLeakage”:“Leakagesat2.8GHz”,LeakageFail;}}[227]這次,最基本的bin是BinGroupPassFailBins。它們一般不是任何bin的求精。BinGroupHardBins是PassFailBins的求精,而且也是基本bin。SoftBins是HardBins的求精,而且是一組leafbin。以上例子的層次中只有三個BinGroup。以下是更復(fù)雜的層次。BinDefs{#AgroupofmostbasebinsBinGroupA{...}#AgroupofbasebinsthatisarefinementofABinGroupAx:A{...}#AgroupofleafbinsthatisarefinementofAxBinGroupAxx:Ax{...}#AgroupofbasebinsthatisarefinementofABinGroupAy:A{...}#AgroupofleafbinsthatisarefinementofAyBinGroupAyy:Ay{...}#AgroupofmostbasebinsBinGroupB{...}#AgroupofleafbinsthatisarefinementofBBinGroupBx:B{...}}[228]在這個例子中,Ax和Ay是A的求精,Axx是Ax的求精,而Ayy是Ay的求精。這個例子還提供了BinGroupB和Bx,其中Bx是B的求精。以上具有名字為PassFailBins、HardBins和SoftBins的BinGroup的BinDefs聲明將在這部分中繼續(xù)用作例子。BinGroup中的每個bin具有1.或者是標(biāo)識符或者是字符串文字的名字2.描述這個bin概括什么的說明3.如果這個bin是在求精的BinGroup中,則它求精的bin的名字也稱為基本bin。PassFailBins中的兩個bin名字為“Pass”和“Fail”。HardBins中的五個bin名字為“3GHzPass”、“2.8GHzPass”、“3GhzFail”、“2.8GhzFail”、“LeakageFail”。Bin名字可以是文字字符串,或者是標(biāo)識符。Bin名字在BinGroup中必須唯一,但不同BinGroup之間可以重復(fù)。但是,BinGroup名字是全局范圍的,而且必須在整個測試計劃中唯一。在五個HardBins中,“3GHzPass”和“2.8GHzPass”都映射到PassFailBins的“Pass”bin。剩余的HardBins映射到PassFailBins的“Fail”bin。最后,有八個SoftBins。用于SBFT(softbin功能測試)和高速緩沖存儲器在3GHz的兩個失敗映射到“3GhzFail”HardBin。同樣,用于SBFT和高速緩沖存儲器在2.8GHz的兩個失敗映射到“2.8GhzFail”HardBin。由于泄漏造成的兩個失敗都映射到相同的“LeakageFail”HardBin,而不管它們發(fā)生的速度。例如,最粗的測試(在最外面的級)是DUT通過還是未通過測試。例如,求精是DUT以特定頻率,例如3Hz等,通過還是未通過測試。如下面所描述的,bin分配給測試計劃流項(TestPlanFlowItem)中的DUT。測試計劃流項具有結(jié)果子句,其中測試計劃描述作為從執(zhí)行測試而獲得特定結(jié)果的結(jié)果所發(fā)生的動作與變化。在這個時候,SetBin語句可以發(fā)生#AFlowItemResultclause.Itisdescribedlater.Result0{#Actiontobetakenongettinga0backfrom#executingatest.#SetthebintoSoftBin.“3GHZPass”expressingthatthe#DUTwasexcellent.SetBinSoftBins.“3GHzPass”;}[234]許多SetBin語句可以在對DUT運行測試的過程中執(zhí)行。當(dāng)測試最終完成時,運行時將遞增用于為該DUT和為所有其求精設(shè)置的finalbin的計數(shù)器??紤]具有在其測試過程中執(zhí)行的以下SetBin語句的DUTSetBinSoftBins.”3GHzSBFTFail”;SetBinSoftBins.”2.8GHzAllPass”;[235]這個DUT通過3GHz的高速緩沖存儲器與泄漏測試,但沒有通過SBFT測試,因此分配給”3GHzSBFTFail”bin。然后,在2.8GHz進行測試,所有測試都通過。因此,最終bin分配是SoftBins集合中的”2.8GHzAllPass”。這個最終分配將遞增以下bin的計數(shù)器1.SoftBins.”2.8GHzAllPass”2.HardBins.”2.8GHzPass”的求精3.PassFailBins.”Pass”的求精[236]當(dāng)測試完成時,運行時將遞增該DUT的最終bin分配和所有其求精的其它bin的計數(shù)器。SetBin只允許對leafbin進行。設(shè)置基本bin是非法的。以上計數(shù)器遞增語義假設(shè)1.如果bin是leafbin,則是測試DUT結(jié)束時對該bin執(zhí)行的SetBin語句的次數(shù)。2.如果bin是基本bin,則是其求精的bin的計數(shù)器之和。因此,在以上例子中,在SetBin語句中只允許SoftBins。用于HardBins.”LeakageFail”的計數(shù)器是用于SoftBins.”3GHzLeakageFail”與SoftBins.”2.8GHzLeakageFail”的計數(shù)器之和。以下是關(guān)于bin定義的一些規(guī)則1.BinDefinitions聲明包括幾個BinGroup聲明。2.每個BinGroup聲明都有名字及作為其求精的可選BinGroup名,后面是bin聲明的一個塊。3.bin聲明包括名字,后面是描述,可選地還跟著該bin是其求精的基本bin的名字。4.bin名可以是字符串文字,或者是ID。空字符串不應(yīng)當(dāng)是有效的bin名。bin名應(yīng)當(dāng)在BinGroup聲明的名字中唯一,但相同的名字可以在其它BinGroup聲明中使用。5.如果BinGroup聲明Xxx是另一BinGroup聲明Yyy的求精,則Xxx中的所有bin聲明必須聲明來自Yyy的基本bin的名字。因此,因為SoftBins聲明為HardBins的求精,所以SoftBins中每個bin聲明都是HardBins的bin的求精。6.不是其它BinGroup聲明的求精的BinGroup聲明,例如PassFailBins,將優(yōu)選地具有不聲明基本bin的bin聲明。binBbb具有一組Bbb是其求精的整個bin集合的base。它在形式上如下定義1.如果Aaa是Bbb的基本bin,則Aaa在Bbb的base集合中。2.Aaa的任何base都在Bbb的base集合中。BinGroup名字在TestPlan中是全局的。bin名字對BinGroup是局部的。SetBin語句只允許對leafbin進行。用于bin定義的C++[243]利用以上規(guī)則,可以為BinDefs聲明中的每個BinGroup聲明構(gòu)造對象類型BinGroup。類BinGroup將具有子類LeafBinGroup。除了BinGroup::incrementBin是C++受保護操作,而LeafBinGroup::incrementBin是C++公有操作,這兩個類的其它操作是相同的。以下是建立BinGroup或不是任何其它BinGroup求精的LeafBinGroup的缺省構(gòu)造函數(shù)。構(gòu)造函數(shù)BinGroup(BinGroup&baseBinGroup);LeafBinGroup(BinGroup&baseBinGroup);建立作為給定baseBinGroup的求精的baseBinGroup。一種方法StatusaddBin(constString&binName,constString&description,constString&baseBinName);定義bin及其描述。如果它是最基本的bin,則baseBinName參數(shù)必須是空字符串。遞增bin計數(shù)器的方法StatusincrementBin(cosntString&binName);這個操作將遞增用于這個bin和用于作為該binbase的所有bin的計數(shù)器。這個操作在類BinGroup中是受保護的,而在類LeafBinGroup是公有的。復(fù)位bin計數(shù)器的方法StatusresetBin(constString&binName);這個操作將復(fù)位用于該bin和用于作為該binbase的所有bin的計數(shù)器。獲得關(guān)于bin的信息的方法StatusgetBinDescription(constString&binName,String&description);StatusgetBaseBin(constString&binName,BinGroup*pBaseBinGroup,String&baseBinName);StatusgetBinValue(constString&binName,unsignedint&value);[250]提供迭代器來獲得所有當(dāng)前定義的bin名字。TestPlan聲明將包括BinGroup成員的個數(shù),每個BinGroup聲明一個。用于以上BinDefinitions的C++將如下TestPlanconstructorTestPlan::TestPlan():m_PassFailBins(),DefaultConstructorm_HardBins(&m_PassFailBins),m_SoftBins(&m_HardBins){}Bininitializationsm_PassFailBins.addBin(“Pass”,“CountofpassingDUTS.”,“”);m_PassFailBins.addBin(“Fail”,“CountoffailingDUTS.”,“”);m_HardBins.addBin(“3GHzPass”,“Dutspassing3GHz”,“Pass”);[252]TestPlan的聲明包括初始化為未定義BinGroup(NULL)的m_pCurrentBinGroup和初始化為未定義bin名(空字符串)的m_currentBin。每次當(dāng)執(zhí)行SetBin語句時,通過調(diào)用,將m_pCurrentBinGroup改變成指示BinGroup的名字,而m_currentBin改變成指示組中的命名bin:TranslationofSetBinSoftBins.”3GHzAllPass”;pTestPlan->setBin(“SoftBins”,“3GHzAllPass”);[253]當(dāng)測試計劃完成執(zhí)行時,它將調(diào)用m_pCurrentBinGroup->incrementBin(m_currentBin);使得這個bin和所有其基本bin都遞增它們的計數(shù)器。當(dāng)設(shè)計好測試計劃時,測試計劃BinGroup計數(shù)器復(fù)位,但不會在每次運行測試時重新初始化。計數(shù)器可以通過對BinGroup::resetBin的顯式調(diào)用復(fù)位。C.測試計劃[255]測試計劃可以看作是測試程序的主要結(jié)構(gòu)。測試計劃可以導(dǎo)入文件及定義類似的構(gòu)造內(nèi)聯(lián)函數(shù)。因此,有可能導(dǎo)入給出一些全局符定義及聲明附加全局符內(nèi)聯(lián)函數(shù)的文件。C1.測試計劃流程與FlowItem[256]測試計劃的一個關(guān)鍵元素是流。流封裝了有限狀態(tài)機。它包括運行IFlowable對象然后轉(zhuǎn)換到另一FlowItem的幾個FlowItem。運行IFlowable涉及運行實現(xiàn)IFlowable接口的對象。實現(xiàn)IFlowable接口的典型對象是Test與Flow本身。因此,流程具有運行Test與其它流程,然后轉(zhuǎn)換成另一FlowItem的FlowItem。它還提供對從運行IFlowable返回的各種結(jié)果調(diào)用用戶定制例程的機會。一般來說,F(xiàn)low具有以下形式##FlowTest1implementsafinitestatemachineforthe#Min,TypandMaxflavorsofMyFunctionalTest1.On#successittestsTest1Min,Test1Typ,Test1Max#andthenreturnstoitscallerwith0asasuccessful#status.Onfailure,itreturns1asafailingstatus.##AssumethatthetestsMyFunctionalTest1Min,…all#returnaResultof0(Pass),1and2(foracouple#oflevelsoffailure).#Result0Result1Result2#Test1MinTest1Typreturn1return1#Test1TypTest1Maxreturn1return1#Test1Maxreturn0return1return1#FlowFlowTest1{FlowItemFlowTest1_MinMyFunctionalTest1Min{Result0{PropertyPassFail=“Pass”;IncrementCountersPassCount;GoToFlowTest1_Typ;}Result1{PropertyPassFail=“Fail”;IncrementCountersFailCount;Return1;}#Thisresultblockwillbeexecutedif#MyFunctionalTest1Minreturnsanyof#2,5,6,7,-6,-5or-4Result2,5:7,-6:-4{PropertyPassFail=“Fail”;IncrementCountersFailCount;Return1;}}FlowItemFlowTest1_Typ{...}FlowItemFlowTest1_Max{...}}[258]流FlowTest1的操作如下1.以執(zhí)行FlowItemFlowTest1_Min開始。2.FlowTest1_Min運行功能性測試,MyFunctionTest1Min。這種測試的細節(jié)在以下給出完整的測試計劃時提供。3.期望從運行這個測試得到九種結(jié)果,0、1、2、5、6、7、-6、-5或-4。前兩個Result子句分別處理0和1,第三個處理所有剩余的結(jié)果值。4.如果結(jié)果“0”(通過)出現(xiàn),則FlowTest1_Min將遞增計數(shù)器PassCounter。然后,將轉(zhuǎn)換到新的FlowItemFlowTest1_Typ。5.如果結(jié)果“1”或結(jié)果“2”出現(xiàn),則FlowTest1_Min將遞增計數(shù)器FailCounter,然后從該流程返回。6.FlowTest1_Typ將以相同的方式操作,后續(xù)調(diào)用FlowTest1_Max。7.FlowTest1_Max將將以相同的方式操作,然后當(dāng)結(jié)果成功時,從該流程返回(“0”)。因此,對于成功的運行,F(xiàn)lowTest1將通過Test1的最小化、典型和最大化版本運行設(shè)備,然后返回。FlowTest2將以類似的方式運行。如上所述的流程基本上描述了有限狀態(tài)機的狀態(tài)與轉(zhuǎn)換。FlowItem基本上是狀態(tài),它將做以下動作1.執(zhí)行IFlowable(它可以是前面定義的Flow或Test或可以利用以上規(guī)則在C++中實現(xiàn)的用戶定義的流程)。2.IFlowable的執(zhí)行返回數(shù)字結(jié)果?;谠摻Y(jié)果,特定的動作發(fā)生(更新一些計數(shù)器),然后發(fā)生以下兩件事情中的一個a.流程返回到具有該數(shù)字結(jié)果的調(diào)用者。b.流程通過轉(zhuǎn)換到另一狀態(tài)(FlowItem)繼續(xù)。因此,F(xiàn)lowItem具有以下成分FlowItem有名字。FlowItem有要執(zhí)行的IFlowable。FlowItem有數(shù)字或Result子句。FlowItem的每個Result子句提供動作并以transition結(jié)束并與一個或多個結(jié)果值關(guān)聯(lián)。這些項在FlowItem中的句法如下。FlowItem<name><IFlowabletobeexecuted>{Result<oneormoreresultvalues>{<actionsfortheseresultvalues><transitionfortheseresultvalues>}Result<oneormoreotherresultvalues>{…}…}[263]要執(zhí)行的IFlowable可以是Test或者用戶定義的IFlowable,或者是Flow。用于結(jié)果的動作可以是以下任何一個將由GUI工具使用的字符串值實體設(shè)置成屬性結(jié)果的屬性動作。這可以在以上FlowTest1例子中看到PropertyPassFail=”Pass”;[264]屬性基本上是與結(jié)果語句關(guān)聯(lián)的命名字符串或整數(shù)值實體。屬性的數(shù)量可以是任意的,并且其優(yōu)選由諸如GUI這樣由用戶用來顯示與該結(jié)果關(guān)聯(lián)的信息的工具使用。它們對實際測試結(jié)果或測試流程沒有影響。一個計數(shù)行為將計數(shù)器的某些數(shù)字遞增。這可以從上例中的語句IncrementCountersPassCount;看出。一個例程調(diào)用程序調(diào)用一個任意的或用戶的例程。這在下面討論。最后,F(xiàn)lowItem具有一個Transition,其可以是將控制轉(zhuǎn)移給另一FlowItem的GoTo語句,或者將控制返回給調(diào)用者(可以是調(diào)用流程,也可以是發(fā)起該測試計劃的系統(tǒng)例程)的Return語句。預(yù)定義的流程(Flow)[267]Flow對象的典型應(yīng)用是定義測試順序。然后,該順序作為測試計劃服務(wù)器(TPS)中所發(fā)生事件,即執(zhí)行測試計劃事件,的結(jié)果執(zhí)行。每個站點控制器上的測試計劃服務(wù)器執(zhí)行用戶的測試計劃。但是,F(xiàn)low對象也響應(yīng)其它事件執(zhí)行。圓括號中的名字是用于將Flow分配給這些事件的名字。1.系統(tǒng)加載流程(SysLoadFlow)。當(dāng)測試計劃加載到一個或多個站點控制器上時,這個流程在系統(tǒng)控制器上執(zhí)行。它是在測試計劃實際加載到任何站點控制器上之前執(zhí)行的。這個流程允許測試計劃開發(fā)人員定義應(yīng)當(dāng)源自系統(tǒng)控制器的動作。這種動作包括模式文件的廣播加載、校準(zhǔn)動作,等等。2.站點加載流程(SiteLoadFlow)。這個流程在測試計劃已經(jīng)加載到站點上并初始化以后在站點控制器上執(zhí)行。這允許任何特定于站點的初始化發(fā)生。3.批(lot)啟動/結(jié)束流程(LotStartFlow/LotEndFlow)。當(dāng)通知測試計劃服務(wù)器新批的啟動時,這些流程在站點控制器上執(zhí)行。這典型地用于生產(chǎn)環(huán)境中注釋具有特定于批的信息的數(shù)據(jù)登錄流程。4.DUT改變流程(DutChangeFlow)。當(dāng)其DUT信息改變時,這個流程在站點控制器上執(zhí)行。同樣,這也典型地用于生產(chǎn)環(huán)境中更新數(shù)據(jù)登錄流程。5.測試計劃啟動/結(jié)束流程(TestPlanStartFlow/TestPlanEndFlow)。當(dāng)通知測試計劃服務(wù)器開始執(zhí)行當(dāng)前測試流程時和當(dāng)該流程結(jié)束執(zhí)行時,這些流程在站點控制器上執(zhí)行。6.測試啟動/結(jié)束流程(TestStartFlow/TestEndFlow)。當(dāng)測試流程開始運行新測試和當(dāng)該測試結(jié)束執(zhí)行時,這些流程在站點控制器上執(zhí)行。7.測試流程(TestFlow)。這個流程是當(dāng)測試計劃服務(wù)器接收到“執(zhí)行測試計劃”消息時執(zhí)行的主要流程對象。應(yīng)當(dāng)指出,如果用戶在用戶的測試計劃中定義了不是TestFlow或其它預(yù)定義流程中一種的流程,則執(zhí)行它的優(yōu)選方式是將其包括在這些預(yù)定義流程中一個的轉(zhuǎn)移狀態(tài)中。測試計劃舉例[269]在以下例子中,一起給出流程與描述該流程實現(xiàn)的有限狀態(tài)機的注釋。有限狀態(tài)機是作為轉(zhuǎn)移矩陣給出的。矩陣的行對應(yīng)于FlowItem,列對應(yīng)于結(jié)果。矩陣行的項指示當(dāng)返回結(jié)果是列中所指定值時從該行的FlowItem轉(zhuǎn)移到的FlowItem。以下示出具有三個流程,F(xiàn)lowTest1、FlowTest2和FlowMain,的測試計劃。FlowTest1如上所述操作。它將在“min”、“typ”與“max”中的每一個中運行名字為MyFunctionalTest1的測試。同樣,F(xiàn)lowTest2將在這些配置的每個中運行MyFunctionalTest2。最后,F(xiàn)lowMain將運行FlowTest1和FlowTest2。有限狀態(tài)機轉(zhuǎn)移矩陣在這些流程中的每個開始部分的注釋中提供。#----------------------------#FilemySimpleTestPlan.tpl#----------------------------Version0.1;Importxxx.pin;#Pins#Constantsandvariablesgivinglimitingvalues.Importlimits.usrv;#ImporttestconditiongroupsImportmyTestConditionGroups.tcg;#Inmportsomebindefinitions.Importbins.bdefs;#----------------------------#Startofthetestplan#----------------------------TestPlanSample;#ThisblockdefinesPatternListsfile-qualifiednamesand#PatternListvariablesthatareusedinTestdeclarations.#Patternlistvariablesaredeferredtillcustomizationis#examined.PLtstDefs{#Filequalifiedpatternlistnamesp11A.plist:pat1Alist,p12A.plist:pat2AList}#Thesocketforthetestsinthistestplan(thisisnotimported,#butresolvedatactivationtime):SocketDef=mytest.soc;#DeclaresomeuservariablesinlineUserVars{#StringnameforcturrenttestStringCurrentTest=″MyTest″;}TestConditionTC1Min{TestConditionGroiup=TCG1;Selector=min;}TestConditionTC1Typ{TestConditionGroup=TCG1;Selector=typ;}TestConditionTC1Max{TestConditionGroup=TCG1;Selector=max;}#LikewiseforTC2Min,TC2Typ,TC2Max...##DeclareaFunctionalTest.″FurctionalTest″referstoaC++#testclassthatrunsthetest,andreturnsa0,1or2as#aResult.TheTestConditionGroupTCG1isselectedwith#the″min″selectorbyreferringtotheTC1MinTestCondition.#TestFunctionalTestMyFunctionalTest1Min{PListParam=pat1AList;TestConditionParam=TC1Min;}#AnotherFunctionalTestseleotingTCG1with″typ″TestFtunctionalTestMyFtunctionalTest1Typ{PListParam=patlAList;TestConditionParam=TC1Typ;}#AnotherFunctionalTestselectingTCG1with″max″TestFunctiornalTestMyFunctionalTest1Max{PListparam=pat1AList;TestConditionParam=TC1Max;}#NowselectTCG2with″min″Tes1tFunctionalTestMyFunctionalTest2Min{PListParam=pat2AList;TestConditionParam=TC2Min;}#LikewiseforTCG2with″typ″andTCG2with″max″TestFunctionalTestMyFunctionalTest2Typ{PListParam=pat1AList;TestConditionParam=TC2Typ;}TestFunctionalTestMyFtinctionalTest2Max{PListParam=pat1AList;TestConditionParam=TC2Max;}##AtthistimethefollowingTestobjectshavebeendefined#MyFunctionalTest1Min#MyFunctionalTest1Typ#MyFunctionalTest1Max#MyFunctionalTest2Min#MyFunctionalTest2Typ#MyFunctionalTest2Max###Countersarevariablesthatareincrementedduringthe#executionofatest.TheyareUnsignedIntegersthatare#initializedtozero.#Counters{PassCount,F(xiàn)ailCount}##Flowscannowbepresented.AFlowisanobiectthat#essentiallyrepresentsafinitestatemachinewhich#canexecute“Flowables”,andtransitiontootherflowablesbaased#ontheResultreturnedfromexecutingaFlowable.AFlowcanalso#callanotherflow.##AFlowconsistsofanumberofFlowItemsandtransitions#betweenthem.FlowItemshavenameswhichareuniquein#theenclosingFlow,executea“Flowable”object,andthen#transitiontoanotherFlowIteminthesameenclosingFlow.##FlowableobiectsincludeTestsandotherFlows.When#aFlowableobjectexecutes,itreturnsanumericResult#whichisusedbytheFlowItemtotransitiontoanother#FlowItem.Asaresultofthis,bothTestsandFlows#terminatebyreturninganumericResultvalue.##FlowTest1implementsafinitestatemachinefbrthe#Min,TypandMaxflavorsofMyFunctionalTest1.On#successittestsTest1Min,Test1Typ,Test1Max#andthenreturnstoitscallerwith0asasuccessful#Result.Onfailure,itreturns1asafailingResult.##AssumethatthetestsMyFunctionalTest1Min,....all#returnaResultof0(Pass),1and2(foracouple#oflevelsoffailure).TheTransitionMatrixofthe#finitestatemachineimplementedbyFlowTest1is;#-----------------------------------#Result0Result1Result2#-----------------------------------#FlowTest1_MinFlowTest1_Typreturn1return1#FlowTest1_TypFlowTest1_Maxreturn1return1#FlowTest1_Maxreturn0return1return1##wheretheIFlowablesrunbyeachFlowItemare:#FlowItemIFlowablethatisrun#FlowTest1_MinMyFunctionalTest1Min#FlowTest1_TypMyFunctionalTest1Typ#FlowTest1_MaxMyFunctionalTest1Max#FlowFlowTest1{FlowItemFlowTest1_MinMyFunctionalTest1Min{Result0{PropertyPassFail=″Pass″;IncrementCountersPassCount;GoToFlowTest1_Typ;}Result1,2{PropertyPassFail=″Fail″;IncrementCountersFailCount;Return1;}}FlowItemFlowTest1_TypMyFunctionalTest1Typ{Result0{PropertyPassFail=″Pass″;IncrementCountersPassCount;GoToFlowTest1_Max;}Result1,2{PropertyPassFail=″Fail″;InerementCountersFailCount;Return1;}}#LikewiseforFlowTest1_MaxFlowItemFlowTest1_MaxMyFunctionalTest1Max{Result0{PropertyPassFail=″Pass″;IncrementCounntersPassCount;Return0;}Result1,2{PropertyPassFail=″Fail″;IncrementCountersFailCount;Return1;}}}##FlowTest2issimilartoFlowTest1.Itimplemernsa#finitestatemachinefortheMin,TypandMaxflavors#ofMyFunctionalTest2.OnsuccessittestsTest2Min,#Test2Typ,Test2Maxandthenreturnstoitscallerwith#0asasuccessfulResult.Onfailure,itreturns1as#afailingResult.##AssumethatthetestsMyFunctionalTest2Min,...all#returnaResultof0(Pass),1and2(foracouple#oflevelsoffailure).TheTransitionMatrixofthe#finitestatemachineimplementedbyFlowTest2is:#-----------------------------------#Result0Result1Result2#-----------------------------------#FlowTest2_MinFlowTest2_Typreturn1retum1#FlowTest2_TypFlowTest2_Maxreturn1return1#FlowTest2_Maxreturn0return1return1##WheretheIFlowablesrunbyeachFlowItemare:#FlowItemIFlowablethatisrun#FlowTest2_MinMyFunctionalTest2Min#FlowTest2_TypMyFunctionalTest2Typ#FlowTest2_MaxMyFunctionalTest2Max#FlowFlowTest2{#...}##NowtheFlowMain,themaintestflow,canbepresented.It#implementsafinitestatemachinethatcallsFlowTest1#andFlowTest2asbelow:#-------------------------#Result0Result1#-------------------------#FlowMain_1FlowMain_2return1#FlowMain_2return0return1##WheretheIFlowablesrunbyeachFlowItemare:#FlowItemIFlowablethatisrun#FlowMain_1FlowTest1#FlowMain_2FlowTest2FlowFlowMain{#Thefirstdeclaredflowistheinitialflowtobe#executedi.ItgoestoFlowMain_2onsuccess,and#returns1onfailure.FlowItemFlowMain_1FlowTest1{Result0{PropertyPassFail=″Pass″;IncrementCountersPassCount;GoToFlowMain_2;}Result1{#Sorry...FlowTest1failedPropertyPassFail=″Fail;InerementCountersFailCount;#AddtotherightsoftbinSetBinSoftBins.“3GHzSBFTFaij”;Return1;}}FlowItemFlowMain_2FlowTest2{Result0{#Allpassed!PropertyPassFail=″Pass″;IncrementCountersPassCount;#AddtotherightsoftbinSetBinSoftBins.“3GHzAllPass”;Return0;}Result1{#FlowTest1passed,butFlowTest2failedPropertyPassFail=″Fail″;IncrementCountersFailCount;#AddtotherightsoftbinSetBinSoftBins.“3GHzCacheFail”;Return1;}}}TestFlow=FlowMain;[271]以上測試計劃是以優(yōu)選次序如下構(gòu)造的1.首先,提供版本號。這個號用于確保與編譯器版本的兼容性。2.然后,聲明多個導(dǎo)入。這些是具有分解測試計劃中所使用名字所需的聲明的各種文件。3.接下來,聲明測試計劃名字,其后是測試計劃的內(nèi)聯(lián)聲明。4.然后聲明一組PlistDefs。這些包括指定來自所指定文件的GlobalPLists的文件限定名字。它們還包括模式列表變量。模式列表變量是可以在執(zhí)行時的定制flowable中初始化的變量。它們提供了將測試與實際模式列表的綁定延遲到運行時的方式。5.接下來,聲明一組用戶變量。這些包括字符串。6.然后,聲明一些計數(shù)器,以便確定通過和未通過的測試的個數(shù)。計數(shù)器是初始化為0并在IncrementCounter語句遞增的簡單變量。它們與前面描述的bin不同,bin的語義是只有當(dāng)前設(shè)置的bin在DUT測試結(jié)束時遞增。7.接下來聲明一系列測試條件。這些條件中的每個指定一個測試條件組和選擇器。在這個例子中,測試條件組來自mytestconditionsgroups.tcg。但是,它們也可以內(nèi)聯(lián)在測試計劃中。8.接下來,聲明一系列Flowables或測試。它們每一個都是選擇模式列表與測試條件的已知測試功能測試。因此,例如,MyFunctionalTest1Max選擇測試條件TC1Max與模式列表。9.然后,聲明三個流程,F(xiàn)lowTest1、FlowTest2和FlowMain。流程運行Flowables。Flowables包括測試(例如MyFunctionalTest1Max)和其它流程(例如FlowTest1和FlowTest2)。FlowTest1和FlowTest2中的每一個都分別運行通過Test1和Test2的最小、典型與最大版本。流程FlowMain調(diào)用前面聲明的流程,先是FlowTest1,然后是FlowTest2。10.最后,TestFlow事件分配給FlowMain流程。因此,流程FlowMain是當(dāng)用戶選擇執(zhí)行這個計劃時由這個測試計劃執(zhí)行的流程。用于流程的C++[272]利用以上規(guī)則,大部分元素可以用C++實現(xiàn),除了流程本身。用于FlowItem的C++[273]表示FlowItem的C++類可以具有以下接口一種操作StatussetFlowable(IFlowable*pIFlowable);該操作將設(shè)置對這個FlowItem要執(zhí)行的IFlowable。一旦FlowItem從需要執(zhí)行這個IFlowable的調(diào)用集合返回,它就將需要遞增依賴于結(jié)果值的計數(shù)器列表。為此,F(xiàn)lowItem需要有要遞增的計數(shù)器向量。這通過以下調(diào)用初始化StatussetCounterRefs(unsignedintresult,CounterRefListcounterRefs);這個調(diào)用將對計數(shù)器的引用向量設(shè)置到FlowItem中,使得一旦IFlowable完成執(zhí)行它就可以遞增它們。例如,語句IncrementCountersA,B,C;將優(yōu)選地如下使用以上調(diào)用SomewhereearlierCounterRefListcounters;…CodeforResultclauseResult2,3{...}offlowObiect.counters.reset();counters.add(&A);counters.add(&B);counters.add(&C);flowObject.setCounterRefs(2,counters);flowObject.setCounterRefs(3,counters);[275]使用臨時的CounterRefList對象指定計數(shù)器。最開始調(diào)用counters.reset(),然后是設(shè)置計數(shù)器列表的多個counters.add()調(diào)用。然后,這可以用于設(shè)置針對結(jié)果值2和3要更新的計數(shù)器向量。然后,F(xiàn)lowItem可能需要轉(zhuǎn)移到關(guān)于特定結(jié)果的另一FlowItemStatussetTransition(unsignedintresult,F(xiàn)lowItem*pFlowItem);在特定Result語句處理許多結(jié)果值的情況下,自然需要幾個這樣的調(diào)用。FlowItem可能需要返回結(jié)果。這可以通過以下進行StatussetRetumResult(unsignedintresult,unsignedintreturnResult);[278]例如,對于前面例子中的FlowItemFirstFlowItem,以上調(diào)用中“result”的值是“2”,而“retumResult”的值是“1”。最后,F(xiàn)lowItem需要執(zhí)行操作Statusexecute(unsignedint&result,F(xiàn)lowItem*pNextFlowItem);[279]這個操作將執(zhí)行IFlowable,然后更新所指示的計數(shù)器,然后或者返回結(jié)果,或者返回指向下一FlowItem的指針。如果這個指針為NULL,則結(jié)果是返回值。為FlowItemFlowMain_1生成的代碼如下FlowItemFlowMain_1;FlowItemFlowMain_2;CounterRefListcounters;FlowMain_1.setFlowable(FlowTest1);Result0counters.reset();counters.add(&PassCount);FlowMain_1.setCounterRefs(0,counters);FlowMain_1.setTransition(0,&FlowMain_2);Result1counters.reset();counters.add(&FailCount);FlowMain_1.setCounterRefs(1,counters);ThefollowingcallfromITestPlanwillsetthecurrentbingroupandbinname.pTestPlan->setBin(“SoftBins”,“3GHzSBFTFail”);FlowMain_1.setRetumResult(1,1);[281]以上生成的代碼設(shè)置FlowMain_1運行IFlowable“FlowTest1”,然后設(shè)置它遞增用于每個結(jié)果的合適計數(shù)器列表,最后采取必需的動作。在結(jié)果“0”的情況下必需的動作是轉(zhuǎn)移到FlowMain_1,而在結(jié)果“1”的情況下是返回。C2.Testplan中的計數(shù)器支持[282]計數(shù)器是初始化為0并且可以在測試運行中的各個點由IncrementCounter語句遞增的變量。它們與只在測試結(jié)束時遞增的Bin不同。此外,bin是層次性的,而計數(shù)器是簡單變量。因此,計數(shù)器比bin具有更簡單更有限的功能。計數(shù)器可以通過維護一組作為無符號整數(shù)的指定計數(shù)器的Counter類在TestPlan中支持。對象將通過Counter聲明在這個類中定義。計數(shù)器不能在測試開始時自動復(fù)位,從而允許TestPlan在測試許多DUT的過程中收集計數(shù)。需要提供對一個計數(shù)器的值進行復(fù)位、遞增和查詢的方法。這使得可以有bining的替代,以便確定作為運行測試結(jié)果的計數(shù)。TestPlan優(yōu)選地包含成員變量,m_modifiedCounters,這是通過在DUT上運行測試修改的計數(shù)器的集合。這個集合在測試的開始初始化成空集合。在進行IncrementCounters調(diào)用的每個地方,將生成向m_modifiedCounters成員添加指定計數(shù)器的代碼。因此,這個成員收集在DUT上測試執(zhí)行過程中修改的所有計數(shù)器。用于Flow對象的C++[285]一旦所有的FlowItem都創(chuàng)建了,則Flow對象就可以如下所示作為C++對象創(chuàng)建添加FlowItem的操作StatusaddFlowItem(FlowItem*pFlowItem,boolisInitalFlowItem);該操作向Flow添加所指示的FlowItem。如果這是Flow的初始FlowItem,則布爾值設(shè)置成True。執(zhí)行流程的操作StatusexecuteFlow(unsignedint&result);[286]這優(yōu)選地在Flow返回時返回,結(jié)果是執(zhí)行流程。其動作是利用初始FlowItem開始執(zhí)行流程。只有當(dāng)前FlowItem返回下一個要執(zhí)行的FlowItem,它就將持續(xù)執(zhí)行FlowItem。因此,為Flow生成的C++具有幾個對addFlowItem()的重復(fù)調(diào)用,以便將FlowItem添加到Flow。當(dāng)選擇測試計劃中的這個流程執(zhí)行時,executeFlow()操作將發(fā)生。C3.測試類[288]總的來說,大部分程序代碼是用于設(shè)備測試的數(shù)據(jù),剩余的是實現(xiàn)測試方法的測試程序代碼。數(shù)據(jù)是依賴DUT的(例如,電源條件、信號電壓條件、定時條件等)。測試條件包括將指定的設(shè)備條件加載到ATE硬件上的方法,還有那些實現(xiàn)用戶指定目標(biāo)(如數(shù)據(jù)登錄等)所需的方法。如上面所解釋的,為了提高測試代碼的重用性,這種代碼一旦獨立于任何特定于設(shè)備的數(shù)據(jù)(例如,引腳名、模擬數(shù)據(jù)等)或特定于設(shè)備測試的數(shù)據(jù)(例如,用于DC單元的條件、測量引腳、目標(biāo)引腳的個數(shù)、模式文件的名字、模式程序的地址等)。如果測試代碼利用這些類型的數(shù)據(jù)編譯,則測試代碼的重用性將降低。因此,應(yīng)當(dāng)使任何特定于設(shè)備的數(shù)據(jù)或特定于設(shè)備測試的數(shù)據(jù)對測試代碼在外部可用,作為代碼執(zhí)行時的輸入。在開放體系結(jié)構(gòu)測試系統(tǒng)中,作為Itest接口實現(xiàn)的Test類實現(xiàn)對于特定類型的測試測試數(shù)據(jù)與代碼的分離(從而實現(xiàn)代碼的重用性)。這種測試類可以看作是其獨立實例的“模板”,獨立實例彼此的區(qū)別只有特定于設(shè)備或特定于設(shè)備測試的數(shù)據(jù)。測試類在測試計劃文件中指定。每個測試類典型地實現(xiàn)特定類型的設(shè)備測試或者設(shè)備測試的安裝。例如,F(xiàn)unctional、AC和DC參數(shù)化測試優(yōu)選地是由獨立的Test類實現(xiàn)的。但是,定制的測試類也可以用在測試計劃中。測試類允許用戶通過提供用于指定該測試的特定實例的選項的參數(shù)來配置類行為。例如,F(xiàn)unctionalTest將分別取參數(shù)Plist和TestConditions來指定要執(zhí)行的模式列表和該測試的Level和Timing條件。(通過測試計劃描述文件中不同“Test”塊的使用)指定這些參數(shù)的不同值允許用戶創(chuàng)建FunctionalTest的不同實例。圖5示出了不同的測試實例502將如何從單個測試類504導(dǎo)出。這些類應(yīng)當(dāng)設(shè)計成允許編譯器400從測試計劃文件取測試的描述及其參數(shù)并生成正確的C++代碼,該代碼可以編譯鏈接以生成測試程序。測試類實例可以添加到描述測試流程的對象,其中測試流程創(chuàng)建設(shè)備測試的復(fù)雜執(zhí)行序列。C4.從ITest和IFlowable的導(dǎo)出[293]如上面所提到的,Test類從ITest導(dǎo)出。利用以上規(guī)則,這些可以在實現(xiàn)ITest接口的C++類中實現(xiàn)。除了為ITest接口指定的方法,這些類提供執(zhí)行指定的設(shè)備測試類所需的特定于測試的智能與邏輯。Test類還實現(xiàn)IFlowable接口。因此,Test類的實例可以用在運行測試的FlowItem中。定制[294]提供定制機制來允許用戶調(diào)用C函數(shù)并開發(fā)他們自己實現(xiàn)ITest與IFlowable接口的類。自我測量能力[295]如果Test類的對象可以被詢問關(guān)于其方法與簽名,則可以驗證合適的參數(shù)可以包括在所生成的源代碼中。這種特征對于轉(zhuǎn)移階段中的錯誤檢查與確認是非常有用的。如果測試工程師在參數(shù)的名字中或?qū)@些參數(shù)的變元個數(shù)(或者可能是類型)中犯了錯誤,則轉(zhuǎn)移階段可以捕捉到它并在翻譯時提供有意義的錯誤消息,而不是等待來自C++編譯器的編譯時錯誤消息。這對測試工程師更加有用。自檢(Introspection)指要求對象在其自身當(dāng)中查找并返回關(guān)于其屬性與方法的能力。例如Java的有些語言將這種能力作為語言的一部分提供。諸如VisualBasic的其它語言將這種需求強加到要與其一起使用的對象上。C++不提供這種特征。這種方法還很好地適于提供缺省參數(shù)值,及可選參數(shù)的指示。此外,如果這種能力作為所有Test類實現(xiàn)的一部分提供,則GUI應(yīng)用還可以使用這種信息動態(tài)建立對話框及其它用戶接口元素來幫助工程師有效地使用這些類。這些復(fù)雜性在本發(fā)明的實施方式中是通過代替完全自我測量而提供允許測試類開發(fā)人員在單個基于文本的源文件(每個Test類)中完全指定Test類的公有方法/屬性的方法的機制抵消的,其中開發(fā)人員已經(jīng)指定該Test類為參數(shù)化類所需的Test類。單個源是優(yōu)選的任何人都不想在一個文件中有Test類的參數(shù)化接口的描述,而在另一獨立的(頭)文件中有C++接口描述,然后麻煩地需要使這兩個源保持同步。為此,“基于文本的”描述嵌入到用于Test類的Preheader文件中,該Preheader文件由編譯器用于有限的自我測量及用于生成Test類的C++頭。所生成的C++頭文件是用于最終編譯Test類C++代碼的頭文件。Pre-header[300]C++中頭的使用是眾所周知的。因此,因為C++難以解析和閱讀,所以本發(fā)明的實施方式定義允許編譯器創(chuàng)造可以由測試類開發(fā)人員用作頭的C++輸出。根據(jù)這種實施方式,測試類開發(fā)人員寫Preheader,該Preheader由編譯器400作為頭文件輸出,從而允許到對應(yīng)測試類或其它測試實體的可見性。以下例子說明了根據(jù)本發(fā)明優(yōu)選實施方式用于Test類的Preheader文件的概念??紤]以下從源文件的節(jié)選,對于測試FuncTest1…TestConditionTC1{TestConditionGroup=TCG1;#PreviouslydefinedTCGforLevelsSelector=min;}TestConditionTC2{TestConditionGroup=TCG2;#PreviouslydefinedTCGforTimingSelector=min;}…TestFunctionalTestFuncTest1{PListParam=patList1;#PreviouslydefinedpatternlistTestConditionParam=TC1;TestConditionParam=TC2;}[302]編譯器需要知道哪個FunctionalTest是確定以上FuncTest1的說明是否合法所必需的。哪個FunctionalTest必需的定義可以在Preheader中定義,而不是在知道FunctionalTest的情況下建立到編譯器中。假定C++類中的FunctionalTest具有基類Test1和Test2,并具有是Plist和TestConditions陣列的成員。編譯器需要知道FunctionalTest成員的類型,以便識別以上FuncTest1的聲明是否合法。此外,為了生成FunTest1的C++對象聲明,需要構(gòu)建類FunctionalTest的C++頭文件。這需要編譯器也知道FunctionalTest類的基本類、其成員名、以及其它這樣的信息。本發(fā)明一個實施例的Pre-header子語言為編譯器提供其識別聲明的合法性和生成對應(yīng)于聲明的C++頭文件和對象聲明所需的信息。注意,F(xiàn)unctionalTest是簡單的類型(如果考慮參數(shù)化),因此,將使用非常簡單的描述來參數(shù)化。因此可以按照以下所示來寫支持上述參數(shù)化的Pre-header,F(xiàn)unctionalTest.ph(假設(shè)Pre-header對于基本測試類Test1和Test2)Version1.0;##Parameterizationspecificationpre-headerforFunctionalTest#ImportTest1.ph;#Forbaseclass.Test1ImportTest2.ph;#ForbaseclassTest2TestClass=FunctionalTest;#ThenameofthistestclassPublicBases=Test1,Test2;#Listofpublicbaseclasses#Theparameterslistor“parameterblock”;Parameters{#ThefollowingdeclarationspecifiesthataFunctionalTesthas#-aparameteroftypePList#-[representedbyC++typeTester::PattemTree]#-storedinamembernamedm_pPatList#-afunctiontosetitnamedsetPattemTree.#-aparameterdescriptionfortheGUItouseasatooltipPListPListParam{Cardinality=1;Attribute=m_pPatList;SetFunction=setPattemTree;Description=“ThePListparameterforaFunctionalTest”;}##ThefollowingdeclarationspecifiesthataFunctionalTesthas#-1ormoreparametersoftypeTestCondition#-[representedbyC++typeTester::TestCondition]#-storedinamembernamedm_testCondnsArray#-afunctiontosetitnamedaddTestCondition.#-aparameterdescripionfortheGUItouseasatooltip#The[irnplement]clausecausesthetranslationphaseofto#generateadefaultimnplementationofthisfunction.#TestConditionTFestConditionParam{Cardinality=1-n;Attribute=m_testCondnsArray;SetFunetion=addTestCondition[Implement];Description=“TheTestConditionparameterforaFunctionalTest”;}}##ThesectionbelowispartofthePre-Headerwhichisanescape#intoC++code.Thiswillbereferredtoasa“templateblock.”##Everythinginthissectionwillbereproducedverbatiminthe#generatedheaderfile,exceptfor“$Class”,“$Inc”,#“$ParamAryTypes”,“$ParamAttrs”,“$ParamFns”and“$Paramlmpls”.##Notethatnocommentsbeginningwiththe‘#’characteraresupported#withinthefollowingsection.#CplusPlusBegin$Incnamespace{class$Class{Arraytypsforparametersstorage:$ParamAryTypespublic:virtualvoidpreExec();virtualvoidexec();virtualvoidpostExec();$ParamFns…private:doublem_someVar;$ParamAttrs…};…$ParamImpls}EndnamespaceCPlusPlusEnd用于參數(shù)化的測試類的C++[307]當(dāng)編譯器處理Pre-Header文件時,它建立編譯器變量的值,如$Inc,$Class、$ParamAryTypes及其它。這使得它能夠通過逐字逐句地生成以上C++代碼并在所指示的位置在編譯器變量$Inc、$Class等的值中擴展來創(chuàng)建以下C++頭文件。對于FunctionalTest.ph,它為FunctionalTest類創(chuàng)建以下C++頭文件FunctionalTest.h。#line7″./FunctionalTest.ph″#include<ITest.h>#line5″./FunctionalTest.ph″#include<Test1.h>#line6″./FunctionalTest.ph″#include<Test2.h>#line55″./FunctionalTest.ph″#include<vector>#line55″./FunctionalTest.ph″#include<Levels.h>#line55″./FunctionalTest.ph″#include<TestCondnGrp.h>…#line56″./FunctionalTest.ph″namespace{#line7″/FunctionalTest.ph″classFunctionalTest:publiclTest,#line8″/FunctionalTest.ph″publicTest1,#line8″./FunctionalTest.ph″publicTest2#line59″./FunctionalTest.ph″{Arraytypesforparametersstorage:#line61″./FunctionalTest.ph″public:#line37″./FunctiornalTest.ph″typedefstd::vector<Tester::TestCondition*>TestConditionPtrsAry_t;#line62″./FuinctionalTest.ph″public:virtualvoidpreExec();virtualvoidexec();virtualvoidpostExec();public:#line7″./FunctionalTest.ph″voidsetName(OFCString&name);#Automaticforalltests#line22″./FunctionalTest.ph″voidsetPatternTree(PatternTree*);#line23″./FunctionalTest.ph″StringgetPListParamDescription()const;#line39″./FurnctionalTest.ph″voidaddTestCondition(TestCondition*);#line40″./FunctionalTest.ph″voidgetTestConditionParamDescription()const;#line67″./FunctionalTest.ph″…private:doublem_someVar;#line70″./FunctionalTest.ph″private:#line7″./FunctionalTest.ph″OFCStringm_name;#Automaticforalltests#line21″./FunctionalTest.ph″Tester::PatternTree*mpPatList;#line38″./FunctionalTest.ph″TestConditiouPtrsAry_tm_teatCondnsArray;#line71″./FunctionalTest.ph″…};…#line7″./FunctionalTest.ph″inlinevoid#line7″./FunctionalTest.ph″FunctionalTest::setName(OFCString&name)#line74″./FunctionalTest.h″{m_name=name;return;}#line39″/FunctionalTest.ph″inlinevoid#line39″./FunctionalTest.ph″FunctionalTest::addTestCondition(TestCondition*arg)#line74″./FunetionalTest.ph″{m_testCondnsArray.push_back(arg);return;}#line23″./FunctionalTest.ph″inlinevoidTester::StringFunctionalTest::getPListParamDescription(){return“ThePListparameterforaFunctionalTest”;}#line40″./FunctionalTest.ph″inlinevoidTester::StringFunctionalTest::getTestConditionParamDescription(){return“TheTestConditionparameterforaFunctionalTest”;}#line75″./FunctionalTest.ph″}Endnamespace[308]如前面所描述的,這個Pre-Header使得編譯器能夠檢查FunctionalTest聲明的有效性,來為其生成代碼并生成它所需的C++頭文件。作為例子,考慮前面給出的FunctionalTest聲明,為了方便,以下進行了復(fù)制TestFunctionalTestFuncTest1{PlistParam=patList1;#PreviouslydefinedpattemlistTestConditionParam=TC1;TestConditionParam=TC2;}[310]以上給出編譯器將為此生成的C++頭文件。編譯器將為以上FunctionalTest構(gòu)造函數(shù)生成以下代碼FunctionalTestFuncTest1;FuncTest1.setName(″FuncTest1″);FuncTest1.setPattemTree(&patList1);FuncTest1.addTestCondition(&TC1);FuncTest1.addTestCondition(&TC2);[311]還應(yīng)當(dāng)注意為Description函數(shù)生成的名字。名字為Xxx的每個參數(shù)都與以下成員函數(shù)關(guān)聯(lián)StatusgetXxxDescription()const;該函數(shù)返回具有GUI可以使用的工具提示描述的字符串。其它Pre-Header特征[312]Pre-Header支持一些其它用戶定義的枚舉類型作為附加類型。這允許GUI提供可以用于設(shè)置特定參數(shù)值的可能選擇的下拉列表。此外,Pre-Header提供關(guān)聯(lián)可以看作表的多個參數(shù)的特征。例如,將“屬性”陣列實現(xiàn)為關(guān)聯(lián)的名字字符串陣列與值的整數(shù)陣列的集合可能是方便的。實現(xiàn)這種特征的一種容易的方式是使用(后面討論的)定制類型陣列。但是,那需要用戶寫要使用的定制類型Pre-Header。這些特征都在以下例子中說明#-------------------------------#FileFooBarTest.ph##Parameterizationspecificationpre-headerfor#customtestclassFoobarTest#-------------------------------Version1.0;ImportTest1.ph;#ForbaseclassTest1TestClass=FoobarTest;#ThenameofthistestclassPublicBases=Test1;#Listofpublicbaseclasses#Theparameterslist:Parameters{#AnenumeratedtypeEnumWishyWashy=Y(jié)es,Perhaps,Possibly,Maybe,MaybeNot,No;#DcfineaWishyWashyparamcter.WishyWashyWW{Cardinalily=1;Attribute=m_ww;SetFunction=setWw;Description=“TheWWparameterforaFoobarTest″;}#Thisclasshasanarrayofname-numberpairsthatis#interpretedintheclass.ParamGroup{Cardinality=0-n;#TheNamefieldinthisarrayis:#-oftypeString#-[representedbyC++typeTester::String]#-storedinamembernamedm_NameArray#-afunctiontosetitnamedaddName.#-aparameterdescriptionfortheGUItouseasatooltipStringName{Attribute=m_NameArray;SetFunction=addName;Description=“ANamewithaValue”;}#TheNumberfieldinthisarrayis:#-oftypeInteger#-[representedbyC++typeint]#-storedinamembernamedm_NumberArray#-afunctiontosetitnamedaddNumber.#-aparameterdescriptionfortheGUItouseasatooltipIntegerNumber{Attribute=m_NumberArray;SetFunction=addNumber;Description=“ThevalueoftheName”;}}#ThefollowingdeclarationspecifiesthataFunctionalTesthas#-aparameteroftypePList#-[representedbyC++typeTester::PatternTree]#-storedinamembernamedm_pPatList#-afunctiontosetitnamedsetPatternTree.#-aparameterdescriptionfortheGUItouseasatooltipPListPListParam{Cardinality=1;Attribute=m_pPatList;SetFunction=setPattemTree;Description=“ThePListparameterforaFunctionalTest”;}##ThefollowingdeclarationspecifiesthataFunctionalTesthas#-1ormoreparametersoftypeTestCondition#-[representedbyC++typeTester::TestCondition]#-storedinamembernamedm_testCondnsArray#-afunctiontosetitnamedaddTestCondition.#The[implement]clausecausesthetranslationphaseofto#generateadefaultimplemerntationofthisfunction_#TestConditionTestConditionParam{Cardinality=1-n;Attribute=m_testCondnsArray;SetFunction=addTestCondition[Implement];Desription=“TheTestConditionparameterforaFunctionalTest”;}}CPlusPlusBeginSIncnamespace{class$Class{Arraytypesforparametersstorage:$ParamAryTypespublic:virtualvoidpreExec();virtualvoidexec();virtualvoidpostExec();$ParamFns...private:doublem_someVar;$ParamAttrs...};...$ParamImpls}EndnamespaceCPlusPlusEnd[313]必須指出,定制類型的名字-數(shù)字對可以是已經(jīng)聲明的,而且該定制類型的單個陣列參數(shù)可以是已經(jīng)用于具有與以上參數(shù)ParamGroup相同的作用。以上提出的技術(shù)是避免聲明定制類型的必要性的方便措施。C5.定制函數(shù)聲明[314]這允許用戶在流程轉(zhuǎn)移發(fā)生時調(diào)用定制函數(shù)。定制函數(shù)是通過Pre-Header如下聲明的#------------------------------#FileMyFunctions.ph##Parameterizationspecificationpre-headerforMyFunctions#------------------------------Version1.0;Functions=MyFunctions;#Thenameofthisgroupoffunctions#DeclarethefollowingC++functioninthe#MyFunctionsnamespacetodeterminetheminimum#oftwovalues.#Returntheminimumofx,y#doubleMyRoutines::Min#(ITestPlan*pITestPlan,int&x,int&y);IntegerMin(Integerx,Integery);#DeclarethefollowingC++functioninthe#UserRoutinesnamespacetoreturntheaverageof#anarray#Returntheaverageofthearray#doubleMyRoutines::Avg#(ITestPlan*pITestPlan,double*a,constinta_size);#TheC++functionwillbecalledwithaanda’LengthDoubleAvg(Doublea[]);#DeclarethefollowingC++functioninthe#UserRoutinesnamespacetoprintthedutid#andamessage#Returntheaverageofthearray#doubleMyRoutines::Print#(ITestPlan*pITestPlan,String*msg,unsignedint&dutId);#TheC++functionwillbecalledwithaanda’LengthVoidPrint(Stringmsg,UnsignedIntegerdutId);[315]一般來說,由于編譯器將以標(biāo)準(zhǔn)方式擴展這些聲明,因此需要為以上聲明提供C++部分。用戶當(dāng)然要負責(zé)這些函數(shù)的C++實現(xiàn)。應(yīng)當(dāng)指出,所有的以上函數(shù)都將可能取ITestPlan指針作為隱含的第一個參數(shù)。這個指針向函數(shù)書寫者提供對TestPlan中stateS的訪問。例如,函數(shù)書寫者可以使用ItestPlan接口來訪問當(dāng)前的Flow,流程中的當(dāng)前FlowItem,當(dāng)前的Result子句,UserVars的值,及其它這種信息。特定的測試器定義函數(shù)可以在文件Functions.ph中使用Version1.2.3;##FileFunctions.ph#Functions=Functions;#Thenameofthisgroupoffunctions#DeclarethefollowingC++functioninthe#Functionsnamespace#ReturnstheIDofthecurrentDUTbeingtestedbythe#caller.UnsignedIntegerGetDUTID();用于定制函數(shù)聲明的C++[316]由編譯器為以上MyFunctions生成的C++代碼是要簡單地聲明MyFunctions命名空間中的一些函數(shù)namespaceMyFunctions{doubleMin(ITestPlan*pITestPlan,int&x,int&y);doubleAvg(ITestPlan*pITestPlan,double*a,constinta_size);voidPrint(ITestPlan*pITestPlan,char*Msg,unsignedintdutID);}[317]這些函數(shù)將可以從流程調(diào)用。C6.定制Flowable[318]也有可能利用Pre-Header創(chuàng)建實現(xiàn)C++IFlowable接口的Pre-Header。這使得用戶能夠定義可以在FlowItem中運行的定制flowable。以下所示是用于用戶定義的FlowableMyFlowable的Pre-Header#----------------------------------#FileMyFlowable.ph##Pramneterizatjonspecificationpre-headerforMyFlowable#----------------------------------Version1.2.4;FlowableClass=MyFlowable;#Thenameofthiscustomclass#Theparameterslist:Parameters{#ThefollowingdeclarationspecifiesthataMyFlowablehas#-1optionalparameterIntloftypeInteger#-[representedbyC++typeint]#-storedinamembernamedm_intlVal#-afunctiontosetitnamedsetIntlVal.IntegerIntl{Cardinalty=0-1;Attribute=m_int1Val;SetFunction=setInt1Val;}#ThefollowingdeclarationspecifiesthataMyFlowablehas#-1mandatoryparameterInt2oftypeInteger#-[representedbyC++tyeint]#-storedinamembernsmedm_int2Val#-afunctiontosetitnamedsetlnt2Val.IntegerInt2{Cardinality=1;Attribute=m_int2Val;SetFunction=setInt2Val;}#ThefolloWingdeclarationspecifiesthataMyFlowablehas#-oneormoreparametersoftypeString#-[representedbyC++typeTester::String]#-storedinamembernamedm_stringArrVal#-afunctiontosetitnamedaddStringVal.StringStringltem{CardinaIity=1-n;Attribute=m_stringArrVal;SetFunction=addStringVal}#ThefollowingdeclarationspecifiesthataMyFloWablehas#-AsinglePListparameter#-[representedbytheC++typeTester::PList]#-storedinamembernamedm_plist#-afurnctiontosetitnamedsetPListParamPListPListParam{Cardinality=1;Attribute=m_plist;SetFunction=setPListParam;}}##ThesectionbelowispartofthePre-Headerwhichisanescape#intoC++code.##Everythinginthissectionwillbereproducedverbatiminthe#generatedheaderfile,exceptfor“$Class”,“$Inc”,#“$ParamAryTypes”,“$ParamAttrs”,“$ParamFns”and“$ParamImpls”.##Notethatnocommentsbeginningwiththe‘#’characteraresupported#withinthefollowingsection.#CPlusPlusBegin$Incnamespace{class$Class{Arraytypesforparametersstorage:$ParamAryTypespublic:virtualvoidpreExec();virtualvoidexec();virtualvoidpostExec();$ParamFns...private:doublem_someVar;$ParamAttrs...};...$ParamImpls}EndnamespaceCPlusPlusEnd[319]有幾個實現(xiàn)IFlowable接口的類。這些類包括1.用于程序加載的流程,它檢查測試計劃是否可以在當(dāng)前測試器配置中執(zhí)行。2.用于模式加載的流程,它將加載特定的模式與模式列表。3.用于初始化的流程,它將硬件與軟件放到已知的狀態(tài),加載全局變量,并進行其它初始化與確認功能。4.其它通常有用的測試流程。C7.定制類型[320]前面關(guān)于Test類的討論只允許測試類參數(shù)為已知類型,即,基本類型和測試器定義類型,例如PList和TestConditions。為了用戶的靈活性,提供類型可擴展性是很重要的,由此可以創(chuàng)建和使用(對編譯器是未知先驗的)類型。Customtype(CT)將在定制類型中定義。這些可以用于定義對應(yīng)于C語言struct(也稱為PlainoldData類型或者POD,這與它們在C++中的同名物差別很大)的類型及對應(yīng)于C語言函數(shù)簽名typedefs的類型。具有用戶類型的獨立文件將有擴展名.ctyp。這里是根據(jù)本發(fā)明優(yōu)選實施方式的用戶類型聲明的例子#-----------------------------#FileMyCustomTypes.ctyp#-----------------------------Version1.0.0;CustomTypes{#AstructuredPlain-Old-DatatypePodFoo{StringS1;#StringisastandardtypeIntegerI1;#...andsoisIntegerStringS2;}#AnotherstructuredtypeusingFooPodBar{FooFoo1;StringS1;FooFoo2;}##Apointertoafunction.#Returntype:Integer#Parameters:Integer,Integer#RoutineBinaryOp(Integer,Integer)ReturnsInteger;##Anotherpointerto.afunction.#Returntype:Void#Parameter:Integer#RoutineUnaryOp(Integer)ReturnsVoid;##Apointertoafunctionthattakes#noparametersanddoesnotreturnavalue.#RoutineNullaryOp()ReturnsVoid;}用于定制類型的C++[321]以上提出的定制類型聲明將由編譯器翻譯成以下C++代碼namespaceCustomTypes{structFoo{Tester::StringS1;intI1;Tester::StringS2};structBar{FooFoo1;Tester::StringS1;FooFoo2;};typedefint(*BinaryOp)(int&,int&);typedefvoid(*UnaryOp)(int);typedefvoid(*NullaryOp)();}[322]如以下所示出的,這些類型的對象可以作為參數(shù)傳遞到Test類。使用定制類型作為測試類參數(shù)[323]考慮用戶具有對測試的擴展的情況,除了模式列表和測試條件,這需要初始化其它類對象及在包含定制類型的文件(即,.ctyp文件)中定義的任意(即,用戶定義)對象。例如,假定用戶想使用在文件MyTestCTs.ctyp中定義的CTi#FileMyTesetCTs.ctypVersion1.0;CustomTypes{PodFoo{Stringname;PListpattemList;}PodBar{FoosomeFoo;DoubledVal;}RoutineBinaryOp(Integer,Integer)returnInteger;}[324]用戶使用以上類型所需要做的就是在他的測試類pre-header中導(dǎo)入以上文件。由于編譯器解釋如此定義的CT,由此當(dāng)其處理測試類pre-header時,用于Foo和Bar的定義可用。此外,編譯器定義兩個C語言strcut,分別對應(yīng)于以上類型Foo和Bar的structFoo和structBar,其定義放在文件myTestCTs.h中。myTestCTs.ctt的導(dǎo)入語句使文件myTestCTs.h包括在所生成的測試類C++頭中。以下例子說明了這個處理。首先,考慮測試計劃中對測試的聲明(為了清楚,忽略了對模式列表和測試條件的聲明)ImportMyFunctions.ph;ImportMyCustomTypes.ctyp;…#TheCustomVarsblockdefinesvariablesoftheCustom#typesdefinedearlier.CustomVars{…Barbar1={{″ThisisaFoo″,somePatList},#someFoo3.14159#dVal}##Afunctionobjectthatisabinaryoperator.#Thenameontherighthandsideoftheassignment#isaroutinedeclaredinMyFunctions,forwhich,#ofcourse,theuserhastoprovideanimplementation.#BinaryOpbopl=MyFunctions.Min;}…TestMyFancyTestMyTest1{…BarParam=bar1;BinaryOpParam=bop1;}…[325]在以上例子中,CustomVars塊包括在測試計劃中。具有定制變量的獨立文件將具有擴展名.cvar。用戶將如下寫用于支持以上參數(shù)化的pre-header(為了清楚,忽略用于模式列表和測試條件的參數(shù)化聲明)#------------------------------#FileMyFancyTest.ph##Parameterizationspecificationpre-headerforMyFancyTest#------------------------------Version1.02;ImportMyCustomTypes.ctyp;#ForCTsusedinMyFancyTestImportFunctionalTest.ph;#ForbaseclassFunctionalTestTestClass=MyFancyTest;#ThenameofthistestclassPublicBases=FunctionalTest;#Listofpublicbaseclasses#Theparameterslist:Parameters{#ThefollowingdeclarationspecifiesthataMyFancyTesthas#-anoptionalarrayofparametersofcustomtypeBar#-[representedbyC++typeCustomTypes::Bar]#-stoedinamembernamedm_barsArray#-afunctiontosetitnamedaddBarParam.#AnimplementationwillbegeneratedforaddBarParam.BarBarParam{Cardinality=0-n;Attribute=m_barsArray;SetFunction=addBarParam[Implement];}#ThefollowingdeclarationspcifiesthataMyFancyTesthas#-anoptionalparameterofcustomtypeBinaryOp#-[representedbyC++typCustomTypes::BinaryOp]#-storedinamembernamedm_binaryOp#-afunctiontosetitnamedsetBinaryOpParam.#AnimplementationwillbegeneratedforsetBinaryOpParam.BinaryOpBinaryOpParam{Cardinality=0-1;Attribute=m_binaryOp;SetFunction=setBinaryOpParam[lmplement];}}CPlusPlusBegin$Incnamespace{class$Class{$ParamAryTypespublic:virtualvoidpreExec();virtualvoidexec();virtualvoidpostExec();$ParamFns...private:doublem_someVar;$ParamAttrs...};...$ParamImnpls}EndnamespaceCplusPlusEnd用于利用定制類型的定制測試類的C++最后,一旦編譯器處理完這個pre-header文件,它就將創(chuàng)建以下用于MyFancyTest類的C++頭文件,MyFancyTest.h:#include<MyCustomTypes.h>#include<ITest.h>#include<FunctionalTesth>…narnespace{classMyFancyTest:publicITest,publicFunotionalTest{public:typedefstd::vector<CustomTypes::Bar*>BarAry_t;public:virtualvoidpreExec();virtualvoidexec();virutalvoidpostExec();public:voidsetName(OFCString&name);#AutomaticforalltestsvoidsetPatternTree(PatternTree*);voidaddTestCondition(TestCondition*);voidadBarParam(CustomTypes::Bar*);voidsetBinaryOpParam(CustomTypes::BinaryOp*);…private:doublem_someVar;private:OFCStringm_name;#AutomaticforalltestsPatternTree*m_pPatList;TestConditionPtrsAry_tm_testCondnsArray;BarAry_tm_barsArray;BinaryOp*m_binaryOp;…};EndclassMyFancyTest…inlinevoidMyFancyTest::addBarParam(CustomTypes::Bar*arg){m_barsArray.pusb_back(arg);return;}inlinevoidMyFancyTest::setBinaryOpParam(CustomTypes::BinaryOp*arg){m_binaryOp=arg;return;}}EndnamespaceC8.參數(shù)化[327]如上面所看到的,用于Test類、定制Flowable類或定制函數(shù)定義的pre-header通過參數(shù)化說明部分提供了對類/函數(shù)有限的自我測量。編譯器使用這個部分生成用于類/函數(shù)的參數(shù)化接口(并生成類/函數(shù)頭本身)。對于Test類和Flowable類,它還使用這部分隨后在測試計劃代碼中生成初始化該類實例的調(diào)用。應(yīng)當(dāng)注意以下關(guān)于pre-header和對應(yīng)聲明的點1.每個Test或定制Flowable類定義都優(yōu)選地在pre-header中指定。pre-header中的Parameter塊優(yōu)選地是可以指定用于這種類的參數(shù)列表的唯一地方。(因此,作為必然的結(jié)果,用于Test的“標(biāo)準(zhǔn)”參數(shù),例如模式列表和測試條件說明,也需要包括在Parameter塊的pre-header中;這允許標(biāo)準(zhǔn)和CT的所有測試統(tǒng)一處理)。2.在用于Test或Flowable的pre-header中定義為非可選(即,具有非零基數(shù))的所有參數(shù)都應(yīng)當(dāng)在用于該類實例的Test塊或Flowable塊聲明中初始化。3.用于Test/Flowable塊中參數(shù)初始化的對象應(yīng)當(dāng)在前面已經(jīng)定義了。替換指示符$Class、$Inc、$ParamAryTypes、$ParamFns、$ParamAttrs與$ParamImpls必須出現(xiàn)在pre-header的用戶代碼部分中用戶想將對應(yīng)的所生成代碼插入所生成類頭文件中的確切位置。由于為每個都生成特定的代碼,因此這些應(yīng)當(dāng)確切地只出現(xiàn)一次。5.pre-header的Parameter塊中參數(shù)說明的名字(例如以上例子中的PListParam、TestConditionParam或BarParam)是要用于該類實例的聲明中的參數(shù)名字。6.以下是用于參數(shù)說明中的描述的語義a.Cardinality這指出將支持的這種類型參數(shù)的個數(shù)。以下是一種實施方式中的可能值i1這個參數(shù)是強制的,而且應(yīng)當(dāng)確切地只指定一次。這個參數(shù)將作為對該類型參數(shù)對象的指針維護。ii0-1這個參數(shù)是可選的;如果指定,則必須只指定一次。這個參數(shù)將作為指向該參數(shù)類型對象的指針保持。iii1-n這個參數(shù)是強制的。而且,可以對這個參數(shù)指定多個值。值以指定的次序存儲。iv0-n這個參數(shù)是可選的??梢詫@個參數(shù)指定多個值。值以指定的次序存儲。應(yīng)當(dāng)注意,對于以上的()和(),所有指定的值都存儲在STL向量<>中,根據(jù)指向參數(shù)類型的指針建立模板。這個向量的類型將被定義并插入到由$ParamAryTypes指示的點。對這些類型定義的訪問級總是公有的。b.Attribute作為這種類型參數(shù)值的存儲使用的C++變量的名字。該名字將作為C++類的私有數(shù)據(jù)成員逐字被復(fù)制,并且必須遵循C++標(biāo)識符的需求。應(yīng)當(dāng)注意,這種屬性的類型是i如果只允許單個值,則是指向參數(shù)類型的指針;ii如果允許多個值(見以上()),則是關(guān)于指向參數(shù)類型的指針建立模板的STL向量<>。應(yīng)當(dāng)注意,屬性保持對由測試計劃創(chuàng)建和構(gòu)成的對象的引用,但不擁有這些對象。對象的壽命總是由測試計劃本身管理的。c.SetFunction用于設(shè)置這個參數(shù)值所使用的函數(shù)名。以下要點應(yīng)當(dāng)注意i名字應(yīng)當(dāng)是逐字復(fù)制的,因此必須遵循C++語言需求。ii函數(shù)的訪問級總是公有的。iii返回類型總是void。iv函數(shù)總是只帶單個變元,類型是指向參數(shù)類型的指針。應(yīng)當(dāng)注意,值總是單獨設(shè)置的,即,對于允許指定多個值的參數(shù),測試計劃中所生成的代碼將重復(fù)調(diào)用這個函數(shù),對每個指定的值調(diào)用一次,每個值都將添加到STL向量(如上所述)。函數(shù)名之后的可選關(guān)鍵字“[implement]”指示這個函數(shù)的通常實現(xiàn)將作為內(nèi)聯(lián)方法在類頭中可用(在由$ParamImpls指示的點插入)。否則,用戶負責(zé)提供該函數(shù)的實現(xiàn)。d.Description作為工具提示的字符串文字,將由GUI工具用于在這個參數(shù)的運行時修改中提供幫助。在用于名字為Xxx的參數(shù)的定制類中所生成的C++成員函數(shù)將是StringgetXxxDescription()const;該函數(shù)將返回指定的字符串。定制的測試計劃例子[330]以下所示是利用某種定制修飾的測試計劃例子#--------------------------------#FileMyCustomizedTestPlan.tpl#--------------------------------Version0.1;##Importsasbefore...#Thefollowingimportisimplicit,butcanbeexplicitly#provided.ImportFunctionalTest.ph;#ImportforMyFlowables,MyFunctionsandFurnctionsImportMyFlowables.ph;ImportMyFunctions.ph;ImportFunctions.ph;#--------------------------------#Startofthetestplan#--------------------------------TestPlanSample;#ThisblockdefinespatternListsfile-qualiflednamesand#PatternListvariablesthatareusedinTestdeclarations.#Thefile-qualifiednamesrefertopatternlistsinthenamed#files.ThevariablesrefertoStringvariableswhiohwill#holdthepattemlistnamesatruntime.UserdefinedFlowable#objectscouldsetthevaluesofthesevariablesthroughan#API.PListDefs{#Filequalifiedpatternlistnamesp11A.plist:pat1Alist,p12A.plist:pat2AList,#PatternlistvariablesplistXxx,plistYyy,plistZzz}#SocketDef,UserVarsdeclarationasbefore...#DeclarationsofTestConditionsTC1Min,TC1Typ,TC1Max,#TC2Min,TC2Typ,TC2Maxasbefore...##DeclareaFunctionalTest.“FunctionalTest”referstoaC++#testclassthatrunsthetest,andtereturnsa0,1or2as#aResult.TheTestConditionGroupTCG1isselectedwith#the″min″selectorbyreferringtotheTC1MinTestCondition.##Notethatcompilercancompilethisbecauseoftheimported#FurnctionalTest.phfile.#TestFunctionalTestMyFunctionalTest1Min{PListParam=patlAList;TestConditionParam=TC1Min;}##AdditonalFunctionalTestdeclarationsforthefollowing,asbefore#MyFunctionalTest1TyP#MyFunctionalTest1Max#MyFunctionalTest2Min#MyFunctionalTest2Typ#MyFunctionalTest2Max##HereisadeclafationofMyFlowable.ItusesaPatternListvariable#plistXxxwhichisinitializedbytheflowablepriortousehere.##CompilercancompilethisbecauseoftheimportedMyFlowables.phfile:FlowableMyFlowableMyFlowablel{Int1=10;Int2=20;StringItem=“HelloWorld”;PListParam=plistXxx;}#CountersforPassCountandFailCountasbefore...#Flowsasbefore.FlowsFlowTest1andFlowTest2are#unchangedfromthepreviousexample.FlowFlowTest1{#...}FlowFlowTest2{#...}##NowFlowMain,amainflow,canbepresented.It#implementsafinitestatemachinethatcallsFlowTest1#andFlowTest2asbelow:#-----------------------------#Result0Result1#-----------------------------#FlowMain_1FlowMain_2return1#FlowMain_2FlowMain_3return1#FlowMain_3FlowMain_4return1#FlowMain_4FlowMain_5return1#FlowMain_5return0return1##WheretheIFlowablesrunbyeachFlowItemare:#-----------------------------#FlowltemIFlowablethatisrun#-----------------------------#FlowMain_1MyFlowable1#FlowMain_2DatalogStartFlow#FlowMain_3FlowTest1#FlowMain_4FlowTest2#FlowMain_5DatalogStopFlow#FlowFlowMain{##Thefirstdeclaredflowistheinitialflowtobe#executed.ItgoestoFlowMain_InitializationFlow#onsutccess,andreturns1onfailure.#FlowItemFlowMain_1MyFlowable1{Result0{PropertyPassFail=″Pass″;IncrementCountersPassCount;#AuserfunctioncallMyFunctions.Print(“PassedMyFlowable1”,F(xiàn)unctions.GetDUTID());GoToFlowMain_2;}Result1{PropertyPassFail=″Fail″;IncremeutCountersFailCount;#AuserfunctioncallMyFunctions.Print(“FailedMyFlowable1”,F(xiàn)unctions.GetDUTID());SetBinSoftBins.“3GHzLeakage”;Return1;}}##GoestoFlowMain3_onsuccess#andreturns1onfailure.#FlowItemFlowMain_2DaralogStartFlow{Result0{PropertyPassFail=″Pass″;IncrementCountersPassCount;#AuserfunctioncallMyFunctions.Print(“PassedDatalogStartFlow”,F(xiàn)unctions.GetDUTID());GoToFlowMain_3;}Result1{PropertyPassFail=″Fail″;InerementCountersFailCount;MyFunctions.Print(“FailedDatalogStartFlow”,F(xiàn)unctions.GetDUTID());Return1;}}#ThisFlowItemcllsthepreviouslydefinedFlowTest1FlowItemFlowMain_3FlowTest1{Result0{PropertyPassFail=″Pass″;InerementCountersPassCount;#AuserfunctioncallMyFunctions.Print(“PassedFlowTest1”,F(xiàn)unctions.GetDUTID());GoToFlowMain_4;}Result1{PropertyPassFail=″Fail″;IncrementCountersFailCount;#AuserfunctioncallMyFunctions.Print(“FailedFlowTest1”,F(xiàn)unctions.GetDUTID());SetBinSoftBins.“3GHzCacheFail”;Return1;}}#ThisFlowItemcallsthepreyiouslydefinedFlowTest2FlowItemFlowMain_4FlowTest2{Result0{PropertyPassFail=″Pass″;InerementCountersPassCount;#AuserfunctioncallMyFunctions.Print(“PassedFlowTest2”,F(xiàn)unctions.GetDUTID());GoToFlowMain_5;}Result1{#FlowTest1passed,butFlowTest2failedPropertyPassFail=″Fail″;IuerementCountersFailCount;#AuserfunctioncallMyFunctions.Print(“FailedFlowTest2”,F(xiàn)unctions.GetDUTID());SetBinSoftBins.“3GHzSBFTFail”;Return1;}}FlowItemFlowMain_5DatalogStopFlow{Result0{#AllPassedlPropertyPassFail=″Pass″;IncrementCountersPassCount;#AuserfunctioncallMyFunctions.Print(“Passedall!”,F(xiàn)unctions.GetDUTID());SetBinSoftBins“3GHzAllPass”;Return0;}Result1{#FlowTest1andFlowTest2passed,#butDatalogStopFlowfailedPropertyPassFail=”Fail;IncrementCountersFailCount;#AuserfunctioncallMyFunctions.Print(“FailedDatalogStopFlow”,F(xiàn)unctions.GetDUTID());Return1;}}}[331]關(guān)于以上代碼,需要指出以下要點1.這里的PListDefs部分有一些PList名字還有一些PList變量。PList名字是可以在測試中直接使用的名字。PList變量是可以在測試中使用的變量,其值在運行時由定制Flowable中的代碼綁定到實際的PList。2.PListDefs部分是可選的。如果不存在,則其內(nèi)容可以由編譯器從各測試聲明中推斷。如果存在,則必須聲明測試所使用的所有PList參數(shù),當(dāng)然也可以聲明更多個。3.運行時API可用于向PList變量指定值。TestPlan類將具有函數(shù)StatusSetPListVariable(constTester::String&varName,constTester::String&fileQualifiedPListName);Flowable將能夠使用以上函數(shù)將PListVariable綁定到特定的PList。4.用戶函數(shù)可以在FlowItems中剛要轉(zhuǎn)移之前調(diào)用,其中轉(zhuǎn)移或者是將控制轉(zhuǎn)移到其它FlowItem,或者是返回。用于用戶函數(shù)調(diào)用的C++[332]除了在流中調(diào)用定制函數(shù),由編譯器生成的C++代碼已經(jīng)對前面給出的各種定制技術(shù)示出了。FlowItem中的用戶函數(shù)調(diào)用優(yōu)選地是由每個流的IUserCalls成員處理的。每個流優(yōu)選地具有導(dǎo)出單個虛擬成員函數(shù)的接口IUserCalls的成員,如下所示classIuserCalls{public:virtualvoidexec(constString&flowItemName,unsignedintresult)=0;}[333]當(dāng)遇到具有用戶函數(shù)調(diào)用的流時,流以實現(xiàn)以上接口的類的實例構(gòu)成。例如,在流例子中的FlowMain中將以以下類的實例構(gòu)成classFlowMain_UserCalls:publicIUserCalls{public:virtualvoidexec(constString&flowItemName,unsignedintresult){if(flowItemName==“FlowMain_1”){...}elseif(flowItemName==“FlowMain_2”){...}elseif(flowItemName==“FlowMain_3”){switch(result){case0:MyFunctions::Print(“PassedFlowTest1”,F(xiàn)unctions::GetDUTID());return;case1:MyFunctions::Print(“FailedFlowTest1”,F(xiàn)unctions::GetDUTID());return;default:return;}}elseif(flowItemName==“FlowMain_4”){...}elseif(flowItemName==“FlowMain_5”){...}}};FlowItem::execute()操作知道流項的名字。在返回指向下一流的指針之前,它將對所包含的流調(diào)用IuserCalls::exec(),傳遞其自己的流項名字和當(dāng)前結(jié)果的值。這將使以上代碼執(zhí)行,調(diào)用所需的用戶定義函數(shù)。C9.測試程序編譯[335]如上面所解釋的,測試計劃描述文件指定測試計劃中所使用的對象及其彼此的關(guān)系。在一種實施方式中,這個文件翻譯成將在站點控制器上執(zhí)行的形式為標(biāo)準(zhǔn)接口ITestPlan實現(xiàn)的C++代碼。這種代碼將包裝到可以加載到站點控制器上的Windows動態(tài)鏈接庫(DLL)中。生成的測試程序DLL具有站點控制器軟件可以用于生成并返回它所包含的TestPlan對象的標(biāo)準(zhǔn)已知輸入點。從測試計劃描述構(gòu)造[336]從測試計劃描述到ITestPlan實現(xiàn)的轉(zhuǎn)換處理是由測試程序編譯器400實現(xiàn)的。這個處理發(fā)生在兩個階段翻譯與編譯。在翻譯階段402,編譯器400處理測試計劃文件(及它導(dǎo)入的各種其它文件)及測試計劃中所使用的所有測試類型的pre-header。在這個階段,它創(chuàng)建測試計劃對象的C++代碼和所遇到的測試類型的C++頭,及所有其它支持的文件,例如MSVC++(微軟的VisualC++)工作區(qū)和項目文件、DLL“boilerplate”代碼等。編譯器400將文件和行偽指令插入到所生成的代碼中,以確保編譯時錯誤消息指回描述文件中適當(dāng)?shù)奈恢茫皇侵赶蛩傻拇a。在發(fā)生在編譯器創(chuàng)建必需文件之后的編譯階段,調(diào)用例如MSVC++編譯器的標(biāo)準(zhǔn)編譯器404來編譯文件并將它們鏈接到DLL中。編譯器取有效測試計劃文件(和所有相關(guān)的文件)作為輸入并根據(jù)需要生成TestPlan文件和由測試計劃文件中“Import”偽指令表示的所有其它文件。此外,它生成MSVC++“解決方案”來建立測試計劃DLL。例如,如果主文件(MyTestPlan.tpl)包括要結(jié)合定時信息的Timing1.tim,則除了別的以外,編譯器還將創(chuàng)建以下文件MyTestPlan.hMyTestPlan.cppTiming1.cppMyTestPlan.sln(MSVC++“解決方案”文件)MyTestPlan.vcproj(MSVC++“項目”文件)[340]在所有文件都創(chuàng)建(或更新)之后,編譯器調(diào)用MSVC++“解決方案”應(yīng)用,指定它所創(chuàng)建的“解決方案”并創(chuàng)建DLL。任何錯誤和/或警告都將顯示給用戶。在建立測試計劃后,如果用戶對Timingl.tim進行修改,則用戶將調(diào)用編譯器,向其傳遞MyTestPlan.tpl。編譯器將(通過時間戳信息)識別出主測試計劃未改變,因此MyTestPlan.h/.cpp將不再重新創(chuàng)建。但是,在處理主測試計劃文件的同時,將看到Timingl.tim改變了。因此,將重新創(chuàng)建Timingl.cpp文件,并調(diào)用MSVC++應(yīng)用重新建立DLL。這避免了重新編譯MyTestPlan.cpp,而只編譯Timingl.cpp并重新鏈接DLL。對于需要相當(dāng)大量的時間進行編譯的大測試計劃,這種方法對于縮減重新編譯和重新鏈接時間是非常有用的。D.運行測試程序[342]站點控制器軟件將測試程序DLL加載到其處理空間中并調(diào)用DLL中的“工廠”函數(shù)來創(chuàng)建測試計劃對象的實例。一旦測試計劃對象已經(jīng)創(chuàng)建,站點控制器軟件就可以執(zhí)行測試計劃或者以任何其它必要的方式與其交互。非交互式建立[343]對于Windows環(huán)境中的大部分C++軟件開發(fā)人員,建立應(yīng)用(或DLL,或庫,等等)意味著提供開發(fā)環(huán)境(微軟VisualC++、BorlandC++,或類似的其它環(huán)境)、編輯代碼及(常常是)按下按鈕來建立產(chǎn)品。本發(fā)明實施方式的測試環(huán)境將具有類似的動作集合。測試計劃開發(fā)人員將需要編輯代碼并建立他們的測試計劃。但是,測試器不需要測試計劃開發(fā)人員為了生產(chǎn)結(jié)果測試計劃DLL而提出C++開發(fā)環(huán)境。為了實現(xiàn)這個目的,本發(fā)明采用非交互式建立的概念。非交互式建立定義為以非交互模式使用MSVisualC++的建立。應(yīng)當(dāng)注意,這仍然允許其它工具交互式地用于管理這種建立。唯一的含意是VisualC++是非交互式使用的。假設(shè)的環(huán)境[346]關(guān)于用戶環(huán)境,進行特定的假設(shè)。這些假設(shè)是a)測試計劃開發(fā)人員將根據(jù)以上方法與規(guī)則開發(fā)他的測試計劃。b)測試計劃開發(fā)人員可能不具有對C++的專家級知識。c)測試計劃開發(fā)人員將能夠訪問將文件轉(zhuǎn)換成測試計劃DLL的命令行工具或GUI工具。不用按鈕建立應(yīng)用[347]利用MSVisualStudio非交互式地工作需要兩種方法中的一種。第一種(最簡單的一種)是使用命令行接口。第二種(更靈活的一種)是使用自動化接口。這部分描述這兩種方法。創(chuàng)建項目[348]為了非交互式地使用MSVisualStudio,應(yīng)當(dāng)以包含一個或多個有效項目的工作解決方案開始。不幸的是,這是一個不能從命令行或自動化方法實現(xiàn)的任務(wù)。任何一種方法都不能提供用于項目創(chuàng)建的機制。但是,用于VisualStudio的項目與解決方案可以從模板創(chuàng)建。因此,給定開始的項目名和模板,我們就可以為VisualStudio創(chuàng)建解決方案/項目。填充項目[349]由于命令行不支持,因此向產(chǎn)生的項目添加新文件使用VisualStudio自動化模型。我們提供兩種VisualStudio宏來向項目添加新的和現(xiàn)有文件。類似的代碼可以由使用ActiveScript引擎的外部腳本(例如VBScript、JScript、ActivePerl、ActivePython等)用于執(zhí)行相同的任務(wù)。因此,我們的代碼生成工具可以創(chuàng)建新的文件并利用自動化模型將它們添加到現(xiàn)有的VisualStudio項目中。在文件創(chuàng)建之后,它們可以由工具根據(jù)需要更新。建立項目[350]一旦我們在適當(dāng)?shù)奈恢糜辛私鉀Q方案和項目,就有了利用VisualStudio非交互式地建立測試計劃的幾種選項。最簡單的選項是從命令行調(diào)用它。這種命令行看起來象devenvsolutionFile/buildsolutionCfg[351]其中solutionFile是VisualStudio文件而solutionCfg是可用于解決方案中的項目的特定配置。另一解決方案是使用自動化的VisualStudio對象模型。這允許對建立與配置處理的更細粒度的控制。如上面所提到的,它包含從命令行建立項目的Perl腳本列表。這個程序讀取指定要建立的項目與配置的配置文件(及其它關(guān)于項目的信息)并利用自動化模型建立它們??催@個腳本中$msdev對象的使用,作為腳本中如何使用自動化對象的例子。調(diào)試器支持[352]為了讓Test類的開發(fā)人員驗證并調(diào)試他們的工作,他們需要訪問允許他們進入站點控制器并單步調(diào)試他們的代碼的調(diào)試器。由于編譯器生成的代碼是由MSVC++編譯的C++,因此我們使用MSVC++調(diào)試器來調(diào)試Test類的實現(xiàn)。應(yīng)當(dāng)注意,這個特征只對Test類開發(fā)人員或其它直接在C++中工作的人員有意義。其它機制將提供給希望調(diào)試或單步調(diào)試Test程序運行而不直接參考所生成的C++代碼的測試工程師。系統(tǒng)軟件環(huán)境[353]這部分描述用于測試器的通用軟件環(huán)境用戶測試計劃所需文件的位置,指定這種文件可選位置的機制及用于指定測試計劃和模塊控制軟件位置的方法。測試計劃所需的環(huán)境[354]系統(tǒng)標(biāo)準(zhǔn)位置及測試計劃所需的用于1.模式列表,2.模式,3.定時數(shù)據(jù),及4.測試類DLL[355]的搜索路徑的運行時配置可以由“environment”變量配置并由環(huán)境配置文件指定。這些是文本文件,具有如下的簡單語法Tester_PATOBJPATH=“patterns\data;D:\projects\SC23\patterns\data”[356]在文本文件中定義這種“environment”變量而不是通過本地OS支持的環(huán)境變量定義的優(yōu)點是實現(xiàn)不受OS支持環(huán)境變量所具有的共同約束的限制,例如最大字符串長度等。以下“environment”(設(shè)置)變量將用于以上列出的實體模式列表Tester_PATLIST_PATH.模式目標(biāo)文件Tester_PATOBJ_PATH.模式源文件Tester_PATSRC_PATH(這是可選的;請看).定時數(shù)據(jù)文件Tester_TIMING_PATH.測試類DLLTester_TEST_CLASS_LIBPATH.為了支持特定的情況,在維持有用缺省特性的同時,我們提供三級配置。這以遞增的優(yōu)先次序描述[358]首先,系統(tǒng)環(huán)境設(shè)置文件$Tester_INSTALLATION_ROOT\cfg\setups\Setup.env將指定“environment”變量的缺省值。如果沒有其它的配置機制可用,則將需要這個文件??偟膩碚f,它對運行在系統(tǒng)上的所有測試計劃可用。這個文件是由安裝與配置管理(ICM)系統(tǒng)在安裝過程中創(chuàng)建的,其中自安裝程序的輸入指定上面提到的三個變量缺省值。(應(yīng)當(dāng)注意,如在以下子部分中所描述的,除了用于以上三個變量的系統(tǒng)缺省值,這個文件還將包含用于特定的其它測試器“environment”變量的系統(tǒng)缺省值)。其次,環(huán)境設(shè)置文件可以由用戶作為對測試計劃的運行時參數(shù)指定。這個運行時配置中的變量將比缺省定義優(yōu)先。最后,測試計劃可以使用特定的塊來指定其執(zhí)行中要使用的環(huán)境變量。在測試計劃中定義的變量比系統(tǒng)文件或用戶定義文件中的那些變量優(yōu)先??偟膩碚f,所有必需的變量都應(yīng)當(dāng)通過上述一種機制定義。如果變量沒有定義,則會發(fā)生運行時錯誤。其它環(huán)境設(shè)置[362]除了用戶測試計劃所需的“environment”變量,以下兩個“environment”變量也是測試環(huán)境所需的1.Tester_TEST_PLAN_LIBPATH這指定系統(tǒng)控制器用于查找應(yīng)當(dāng)加載的測試計劃DLL的搜索路徑。應(yīng)當(dāng)注意,相同的搜索路徑也將用于查找用戶引腳描述和套接字文件。在安裝時指定給ICM的這個變量的缺省值由ICM存儲在文件$Tester_INSTALLATION_ROOT\cfg\setups\Setup.env中。2.Tester_MODULE_LIBPATH這指定系統(tǒng)將用于加載廠商提供的硬件模塊控制軟件DLL的搜索路徑。從配置管理數(shù)據(jù)庫(CMD)提取的這個信息也由ICM存儲在文件$Tester_INSTALLATION_ROOT\cfg\setups\Setup.env中。應(yīng)當(dāng)注意,盡管用戶可以覆蓋Setup.env文件中對Tester_TEST_PLAN_LIBPATH變量給出的值,但Setup.env文件中對Tester_TEST_PLAN_LIBPATH變量給出的值不應(yīng)當(dāng)由用戶改變,除非用戶想顯式改變用于廠商提供的硬件模塊控制軟件DLL的搜索路徑。搜索路徑說明語義[364]關(guān)于指定搜索路徑的“environment”變量,應(yīng)當(dāng)注意以下要點1.每個都應(yīng)當(dāng)是系統(tǒng)將要搜索的由分號(“;”)隔開的目錄名列表,以便找到特定類型的引用文件。2.在最初系統(tǒng)查找這種“environment”變量的值以后,由用戶對其值進行的任何改變(例如,通過編輯環(huán)境配置文件)都將只在用戶顯式“通知”系統(tǒng)需要這么做的時候由系統(tǒng)注冊。3.當(dāng)關(guān)于“當(dāng)前工作目錄”(CWD)的路徑可能導(dǎo)致不確定結(jié)果時,由于分布式環(huán)境中CWD的概念一例如其中測試器工作的環(huán)境一可能不是用戶直觀期望的概念,因此搜索路徑中的相對路徑名將解釋為相關(guān)環(huán)境變量(提供定義根的功能性)的特定設(shè)置。指定搜索路徑中所有相關(guān)路徑名都將被假設(shè)與之相關(guān)的根的這個相關(guān)環(huán)境變量是“Tester_INSTALLATION_ROOT”變量,該變量給出用戶系統(tǒng)上測試器安裝的頂級(即,“根”)目錄的位置。4.目錄條目不能包含集合[V*<>|;]中的字符,應(yīng)當(dāng)注意除了分號(“;”)例外,這個集合中所有其它字符在Windows文件名中都是非法的。因為分號(“;”)用于區(qū)分搜索路徑中的條目,所以它不應(yīng)當(dāng)用在搜索路徑條目中。應(yīng)當(dāng)注意,路徑名可以具有嵌入的空格,但緊挨著路徑名前后出現(xiàn)(即,在路徑名的第一個非空格字符之前和最后一個非空格字符之后)的所有空格都不看作是路徑名的一部分并將被忽略。5.搜索路徑目錄將以它們在定義中所遇到的次序搜索。文件的第一次出現(xiàn)將是被選擇的那個。E.測試模式[365]有效的管理、處理、和加載非常大的測試模式集合是本發(fā)明一個實施方式框架的重要體系結(jié)構(gòu)方面。層次模式列表的思想被看作是向終端用戶提供易處理概念及容易使用的系統(tǒng)的有效工具。通過測試向量使對DUT的刺激對測試系統(tǒng)可用。向量通??梢苑诸悶轫樞虻?或線性的)、掃描或算法模式生成器(APG)導(dǎo)出的。在本發(fā)明一個實施方式的系統(tǒng)中,測試向量根據(jù)在測試時應(yīng)用到DUT的模式組織。模式是由用戶測試程序中的Pattern對象表示的。在該系統(tǒng)中,模式組織為模式列表,由模式列表對象以程序方式表示。模式列表對象表示模式的有序列表或其它模式列表。排序隱含在列表組件的聲明次序中。應(yīng)當(dāng)注意,如果需要單個模式,則需要由它自己封裝在列表中。用戶測試程序中的模式列表對象與磁盤上的模式列表文件關(guān)聯(lián),該文件包含模式列表的實際定義。因此,模式列表的內(nèi)容是由相關(guān)磁盤文件的內(nèi)容動態(tài)確定的(關(guān)于這個,隨后將描述)。模式列表的定義提供了模式列表的顯式名稱并通過文件名關(guān)聯(lián)來識別模式的有序列表和/或其它模式列表。它還提供執(zhí)行選項的說明,由于選項可以應(yīng)用到模式列表和模式,因此這將在描述模式對象后具體描述。模式列表應(yīng)當(dāng)遵循以下規(guī)則version-infoglobal-pattern-list-definitionsversion-info:Versionversion-identifier;global-pattern-list-definitions:global-pattern-list-definitionglobal-pattern-list-defmitionsglobal-pattern-list-definitionglobal-pattern-list-definition:global-pattern-list-declaration{list-block}global-pattern-list-declaration:GlobaIPListpattern-list-nameoptionsoptlist-block:list-entrylist-blocklist-entrylist-entry:pattern-entry;pattern-list-entry;global-pattern-list-definition;loeal-pattern-list-definition;pattern-entry:Patpattern-nameoptionsoptpattern-list-entry:PListpattern-list-referenceoptionsoptpattern-list-reference:pattern-list-qualified-namefile-name‘:’pattern-list-qualified-namepattern-list-qualified-name:pattern-list-namepattern-list-qualified-name‘.’pattern-list-namelocai-pattern-list-definition:local-pattern-list-declaration{list-block}local-pattern-list-declaration:LocalPListpattern-list-nameoptionsoptoptions:optionoptionsoptionoption:option-definition:option-nameoption-parametersoptoption-parameters:option-parameteroption-parameters‘,’option-parameter[369]以下是以上所使用未定義非端子符的描述1.version-identifier選自集合的一個或多個字符的序列,其中第一個字符必須是數(shù)字。2.name選自集合[a-zA-Z_0-9]的一個或多個字符的序列,其中第一個字符必須選自集合[a-zA-Z_]。3.pattern-list-name選自集合[a-zA-Z_0-9]的一個或多個字符的序列,其中第一個字符必須選自集合[a-zA-Z_]。4.file-name有效Windows文件名(如果文件名中包含任何空格,則必須包含在雙引號中)。應(yīng)當(dāng)注意,這應(yīng)當(dāng)是簡單的文件名,即,它不應(yīng)當(dāng)有目錄成分。pattem-list-reference可以是內(nèi)部的,指向相同文件中的模式列表,或者外部的,指向其它文件。外部引用需要由file-name限定。5.option-name選自集合[a-zA-Z_0-9]的一個或多個字符的序列,其中第一個字符必須選自集合[a-zA-Z_]。6.option-parameter選自集合[a-zA-Z_0-9]的一個或多個字符的序列。模式列表文件支持注釋,這意味著可以由模式列表文件解析器忽略。注釋以“#”字符開始,并延伸到一行的結(jié)束。E1.模式列表的規(guī)則[371]用于模式列表的靜態(tài)或編譯時規(guī)則管理名字的聲明與分解。模式列表語言中的名字由global-pattern-list-definition和local-pattern-list-definition聲明。它們由pattern-list-reference引用。以下是管理這些聲明與引用的一些規(guī)則。1.global-pattern-list-definition和local-pattern-list-definition聲明模式列表的名字。pattern-list-reference引用所聲明模式列表的名字。全局模式列表的名字是全局已知的。局部模式列表的名字只在它們被聲明的列表塊中已知。它們可以無需限定地在該列表塊中直接引用。在更深的嵌套聲明中,局部模式列表將需要由限定的名字引用。2.局部模式列表名在所包含的模式列表范圍內(nèi)已知,而全局模式列表在系統(tǒng)范圍內(nèi)已知。例如GlobalPListG1{LocalPListL1{LocalPListL2{…}GlobalPListG2{…}PListL2;#OK.NameL2isknowninthisscopePListG2#OK.NameG2isglobal}PListL2;#Error.NameL2isnotknownhere.PListL1.L2;#OK.NameL1isknownhere.L2isknownby#qualification.PListG1.L1.L2;#OK.QualificationbyG1isnotneededbut#isallowed.PListG2;#OK.NameG2isglobal}3.全局模式列表可以是模式列表文件的最外面一級定義,或者在所包含的模式列表中嵌套定義。但嵌套僅僅是為了方便。它們在概念上定義為文件最外面一級的全局模式列表。嵌套的全局模式列表在語義上等于相同名字的最外面(非嵌套)全局模式列表。因此,例如GlobalPListG1{GlobalPListG2...}在語義上等同于GlobalPListG1{PListG2;#ReferencesG2}GlobalPListG2...4.所有全局模式列表都是唯一命名的。GlobalPListG1{#Notethatthisisasifdeclaredattheoutermostlevel#withareferencetoitrighthere.GlobalPListG2{…}}#Thisdeclarationwillbeanerrorinthisoranyotherfile,#asthenameG2isalreadytaken.GlobalPListG2#Error.GlobalnameG2istaken.{…}5.局部模式列表總是在還定義局部模式列表名字范圍的包含模式列表中嵌套定義。局部模式列表在其被包含的模式列表中唯一命名。局部模式列表在語義上不允許出現(xiàn)在模式列表文件的最外面一級。GlobalPListG1{LocalPListL1{}LocalPListL2{LocalPListL1#OK.NolocalnameL1isdeclareddirectly#intheenclosingscopedefinedbyL2.{}PListL1;#OK.ReferstoL1declaredinL2PListG1.L1;#OK.ReferstoL1declaredinG1.}#Error.RedeclaringnameL1whentheenclosingscope#definedbyG1alreadyhasanL1declaredinit.LocalPListL1;{}}6.每個模式列表文件都包含用于一個或多個全局模式列表的定義。這直接遵循語法。最外面一級是global-pattern-list-definition,而且必須至少有一個。7.pattern-name是對模式的引用,在Pat關(guān)鍵字之后。它引用其名字通過將后綴.pat連接到模式名而獲得的模式文件中的模式。該文件指示將與為模式定義的搜索路徑一起獲得的文件。8.pattern-list-reference是對PList關(guān)鍵字之后的模式列表的引用。該引用包括可選文件名,后面跟著只是由點隔開的名字列表的限定模式列表名。因此,例如,以下可以是pattern-list-referencePlistfoo.plist:G1.L1.L2.L3;其引用文件foo.plist中的全局模式列表G1中所嵌套的L1中所嵌套的L2中所嵌套的局部模式列表L3。以上名字中最左邊的名字段是G1。最左邊的名字段必須分解成全局模式列表或者可以從引用點看到的局部模式列表。pattern-list-reference的名字分解如下進行1.每個名字段都分解成在其前面的前綴上下文中聲明的名字。2.如果有文件限定,則最左邊的名字段分解成在所命名文件中聲明的全局模式列表。3.如果沒有文件限定,則最左邊的名字可以分解成所包含范圍內(nèi)的局部模式,而且如果失敗,則利用下一包含的范圍,等等,直到所包含的全局范圍。4.為了保持全局范圍的語義,就象它們在模式列表文件的最外面一級聲明的一樣,需要將范圍的搜索限定到最靠近的包含全局范圍。如果嵌套的全局范圍是在最外面一級(等效)文本聲明的,則名字分解搜索將在檢查其范圍后終止。5.如果引用未能由前面的步驟分解,則最左邊的名字段可以分解成該相同文件中的全局模式列表。6.如果引用未能由前面的步驟分解,則最左邊的名字段可以分解成通過將.plist后綴添加到最左邊名字段所獲得的文件中指定的全局模式列表。7.如果引用未能由前面的步驟分解,則引用是錯誤的。如前面所提到的,以上規(guī)則指示最左邊的名字段分解成可以從引用點看到的局部模式列表或者分解成全局模式列表。以下例子說明了這些思想中的一些。GlobalPlistG1{PListG3;#OK.Referstoapatternlistlaterinthisfile.PListG4;#OK.Referstoapatternlistinfile“G4.plist”#OK.ReferstoG1inthefile“my_plistsplist”PListmy_plists.plist:G1;#OK.Referstoapatternlistinfile“my_plists.plist”.The#qualifiednamereferstoalocalpatternlistnamedL2declared#inthescopeofalocalpatternlistnamedL1declaredinthe#scopeofaglobalpatternlistnamedG1.PListmy_plists.plist:G1.L1.L2;LocalPListL1{LocalPListL2{}}PListL1;#OK.ReferstoL1declaredinthe#enclosingscopeofG1}GlobalPlistG2{LoalPListL2{}GlobalpListG3{LocalpListL3{}PListL1;#Error.NoL1declaredinthisoranyenclosing#scope;#Error.ThenameL2isnotdeclaredinthisscope.Also#thoughL2isdeclaredintheenclosingscope,thisscope#isglobal,andsonofurtherenclosingscopeisexamined.##ContrastwithreferencetonameL2inLocalPListL3below.PListL2;pListG1.L1;#OK.ReferstoL1inG1.#Error.G3isnotreallynestedinsideG1.SinceG3#isgiobal,itisreallydeclaredatanoutermostlevel,#andsoG1.G3ismeaningless.PListG2.G3.L3;}LocalPListL3{#OK.ReferstoG2.L2.TheenclosingglobalscopeisG2#andthenameL2isdeclaredinG2.PListL2;}}[376]所有模式列表文件名與模式文件名都要求在利用它們的整個測試計劃中是唯一的。模式列表引用可以指在相同文件中在引用前或引用后定義的模式列表。遞歸與互相遞歸的模式列表定義是不允許的。盡管在模式列表文件語法中沒有什么可以防止用戶創(chuàng)建這種定義,但解析器在檢測到這種狀況時會標(biāo)記錯誤。應(yīng)當(dāng)注意,有一些成本與這種狀態(tài)的檢測關(guān)聯(lián)。如果用戶可以承擔(dān)保證輸入空間沒有互相遞歸定義的責(zé)任,則他/她將可以關(guān)掉該檢查。GtobalPListG1{LocalPListL2{LocalPListL3{#Error.L2runsL3whichrunsL2.#ThisisarecursivereferencetoL2PListL2;PListG2;}}}GlobatPListG2{#Error.G1.L2runsL3whichrunsG2whichrurisG1.L2.#ThisisamutuallyrecursivereferencetoG1.L2.PListG1.L2;}[379]模式與模式列表的語法描述允許對其指定選項。通常,選項是廠商特定的。該語法允許任何模式或模式列表具有多個指定的選項,每個選項具有多個參數(shù)。我們描述由大部分廠商識別的一些支持選項。模式樹的動態(tài)(即,執(zhí)行)語義是在定義模式執(zhí)行序列之后描述的。E2.模式[381]圖6說明了根據(jù)本發(fā)明實施方式的模式編譯器602和模式加載器604。模式的用戶定義內(nèi)容在純文本文件的模式源文件606中可以獲得。模式編譯器將負責(zé)將源文件編譯成適用加載到測試器硬件上的特定于模塊的格式;該后一種文件稱為模式目標(biāo)文件。以下是通用的屬性1.模式對象是不可以由用戶創(chuàng)建的;而用戶總是處理模式列表,模式列表是其它模式列表和/或模式的集合。模式列表對象創(chuàng)建、擁有并維護包含在其中的模式對象,同時如果必要則使它們可以由用戶訪問。2.模式是在測試計劃中唯一命名的,即,測試計劃中沒有兩個模式有相同的名字。模式的名字不同于包含它的文件名。模式文件名是用在模式列表文件中用于指示模式的名字,而模式的實際名字在模式文件中定義??偟膩碚f,在本發(fā)明的一個實施方式中,單個DUT(被測試的設(shè)備)可以連接到來自不同廠商的測試器模塊。這包括整個模式編譯-加載-執(zhí)行鏈。主要部分在這部分描述。E3.模式編譯[383]因此,模式編譯器602需要瞄準(zhǔn)特定的站點配置(關(guān)于所使用的特定于廠商的數(shù)字模塊)。對于剩余的這部分討論,作為例子,術(shù)語“模塊”將用于指數(shù)字模塊。為了允許將來自不同廠商的模塊608集成到系統(tǒng)中,以下過程是優(yōu)選的1.每個模塊廠商將負責(zé)以動態(tài)加載庫或獨立可執(zhí)行文件的形式,提供其自己的特定于模塊的模式編譯器610。該編譯器庫/可執(zhí)行文件至少將提供采用下述作為變量的非常公知的compile()函數(shù)a.(一個或多個)模式源文件路徑名的數(shù)組b.引腳描述文件名c.套接字文件名d.指定編譯對象的目的地的可選目錄路徑名e.允許指定任何特定于廠商的參數(shù)(可由其他廠商忽略)的字段名/數(shù)值對的可選數(shù)組2.模式源文件將提供兩種不同類型的部分a.將包含所有編譯器都可訪問(但不一定使用)的信息的“公共”部分,及b.一個或多個可選的特定于廠商的部分,每個部分由唯一的廠商代碼識別,用于可以由特定廠商的編譯器所使用的信息。3.廠商的編譯器將不直接創(chuàng)建模式目標(biāo)文件。相反,測試器將提供由目標(biāo)文件管理器(OFM)614管理的模式目標(biāo)“元文件”612,其中OFM614是模式編譯器的一部分。模式編譯器可以位于充當(dāng)系統(tǒng)控制器的計算機上,或者是離線的,例如在系統(tǒng)控制器連接到的網(wǎng)絡(luò)上。到目前為止以抽象術(shù)語指的“模式目標(biāo)文件”實際是這個目標(biāo)元文件。目標(biāo)元文件將與模式源文件的名字相同,源文件的擴展名由目標(biāo)文件擴展名代替。OFM將提供讀寫這個文件的應(yīng)用編程接口(API)。目標(biāo)元文件將具有用于存儲以下內(nèi)容的條款a.公共的頭信息,b.特定于模塊的頭信息,包括識別對應(yīng)的模塊和用于該模塊的模式數(shù)據(jù)的位置,c.特定于模塊的模式數(shù)據(jù),根據(jù)需要由模塊廠商組織并能夠由模塊廠商解釋。OFMAPI將允許模塊廠商的編譯器將特定于模塊的頭信息和數(shù)據(jù)寫到目標(biāo)元文件中。應(yīng)當(dāng)注意,即使在目標(biāo)站點中兩個或多個模塊完全相同的情況下,目標(biāo)元文件的這種布局也允許模式數(shù)據(jù)以每個模塊為基礎(chǔ)組織。應(yīng)當(dāng)注意,模式編譯器也可能需要其它的廠商支持的配置信息來方便特定于模塊的硬件加載信息的生成,其中該生成可以利用如直接存儲器存取(DMA)的有效數(shù)據(jù)通信。E4.用于模塊的模式加載[386]在一般過程后,每一模塊廠商將負責(zé)提供其自己的模式加載機制615。模塊608的模式對象元文件612將特定于模塊的數(shù)據(jù)存儲在不同的部分616中。廠商實現(xiàn)將使用OFMAPIs,用于訪問模式對象元文件的相關(guān)的特定于模塊的部分。測試器框架將負責(zé)依次調(diào)用每個模塊的加載方法,以將特定于模塊的數(shù)據(jù)從元文件的適當(dāng)部分加載到模塊中。有可能使每個編譯器廠家為模式指定完全不同的純文本格式,實際上這在大多數(shù)情況下是真正需要的。但是,總的來說,對應(yīng)基于循環(huán)的測試環(huán)境,在對每個向量需要跨模塊的相關(guān)并完全相同語義的情況下,用于模式文件的共享、通用的語法不僅是期望的,而且是必需的。這種共享的語法是對模式源文件中的“公共”部分指定的。實際上,對于大多數(shù)情況,設(shè)想“公共”部分是(除頭信息以外)在模式文件中需要的唯一部分,而且每個廠家的編譯器將只利用該部分工作。這部分給出了所有編譯器都應(yīng)當(dāng)能夠解釋的用于模式文件的規(guī)則。模式文件應(yīng)當(dāng)如下組織file_contents:version_infopallern_definitionsversion_info:Versionversion-identifier′;′pattern_definitions:pattern_definitionpattern_definitionspattern_definitionpattern_definition:main_header′{′main_section′}′main_header′{′main_sectionvendor_sections′}′subr_header′{′subr_section′}′subr_header′{′subr_section_vendor_sections′}′main_header:MainPatternidentifiermain_section:CommonSection′{′common_contentsmain_section_domains′}′common_contents:timing_referencetiming_map_referencetiming_reference:Timingfile-name′;′timing_map_reference:TimingMapfile-name′;′main_section_domains:main_section_domainsmain_section_domainmain_section_domainmain_section_domainDomaidomain_name′{′main_section_contents′}′domain_name:identifiermain_section_contents:main_section_contents_main_section_contentmain_section_contentmain_section_content:label_specmain_pattern_specmain_pattern_speclabel_spec:label′:′label:identifiermain_pattern_specmain_operationcapture_mask_flag′{′vectorsand_waveforms′}′main_operation/*empty*/common_operationjal_opjsr_opjsrc_opjsc_opexit_opcommon_operation:idxi_opidxin_opjec_opjech_opjff_opjffi_opjni_opldin_opnop_oppause_opsndc_opsndt_opstfi_opsti_opstps_opwait_op/**InstructionsspecifictotheMAINPatterns*/jsr_op:JSRidentifierjsr_op:JSRCidentifierjsc_op:JSCidentifierjal_op:JALidentifierexit_op:EXIT/**IntructionscommontobothMAINandSUBRPatterns*/idxi_op:IDXI24-bitnumberidxin_op:IDXInindex-registerjec_op:JECidentifierjech_op:JECHidentifieriff_op:JFFidentifierjffi_op:JFFIidentifierjni_op:JNIidentifierldin_op:LDINindex-registernop_op:NOPpause_op:PAUSEsndc_op:SNDC8-bitnumbersndt_op:SNDT8-bitnumberstji_op:STFI24-bitnumbersti_op:STI24-bitnumberstps_op:STPSwait_op:WAITcapture_mask_flag:/*empty*/capture_mask_flagCTVcapture_mask_flagMTVcapture_mask_flagMATCHvectors_and_waveforms:/*empty*/vectors_and_waveformsvectorvectors_and_waveformswaveformvector:vector_declaration′{′vector_data′}′vecior_declaration:VectorVvector_data:vector_datumvector_data_vector_datumvectordatum:pin_name′=′vector-value′:′pin_name′=′identifer′:′waveform:waveform_declaration′{′waveform_data′}′waveform_declaration:WaveformWwaveform_data:waveform_datumwaveform_datawaveform_datumwaveform_datum:waveform-table-pin-group-name′=′identifier′;′pin_name:identifiervendor_sections:vendor_sectionsvendor_section{}vendor_section{}vendor_section:VendorSection′{′vendor_section_contents′}′subr_header:SubrPatternsubr_section:CommonSection′{′common_contentssource_selection_tablesubr_section_domains′}′CommonSection′{′common_contentssubr_section_domains′}′subr_section_domaains:subr_section_domainssubr_section_domainsubr_section_domainsubr_section_domain:Domaindomain_name′{′subr_section_contents′}′source_selection_table:SourceSelectionTable′{′source_selector_definitions′}′source_selector_definitions:source_selector_definitionssource_selector_definsource_selector_definitionsource_selector_definition:SourceSelectorsource_selector_name′{′source_mappings′}′source_selector_name:identifiersource_mappings:source_mappingssource_mappingsource_mappingsource_mapping:pin_name′=′source′:′source:MAININVERT_MAINSUBRINVERT_SUBRsubr_section_contents:subr_section_contents_subr_section_contentsubr_section_contentsubr_section_content:label_specsubr_pattern_specsubr_pattern_specsubr_pattern_spec:subr_operationcapture_mask_flag′{′vectors_and_waveforms′}′subr_operation:/*empty*/common_operationrtn_opstss_op/**InstructionsspecifictotheSUBRPatterns*/rtn_op:RTNstss_op:STSS_identifier[388]以下是以上所使用的未定義非終止符的描述1.version-identifier選自集合的一個或多個字符的序列,其中第一個字符必須是數(shù)字。2.identifier選自集合[a-zA-Z_0-9]的一個或多個字符的序列,其中第一個字符必須選自集合[a-zA-Z_]。3.vendor-section-contents只對特定于廠家的編譯器有意義的任意文本。4.file-name有效的Windows文件名(如果在文件名中包含任何空格,則必須包含在雙引號中)。應(yīng)當(dāng)注意,這應(yīng)當(dāng)是簡單文件名,即,不應(yīng)當(dāng)具有目錄成分。5.waveform-table-pin-group-name選自集合[a-zA-Z_0-9]的一個或多個字符的序列,其中第一個字符必須選自集合[a-zA-Z_]。這個變量是在其它某個地方聲明的,并保留對引腳組公用的波形表的名字。6.24-bitnumber最大為16777215的有限十進制數(shù)。7.8-bitnumber最大為256的有限十進制數(shù)。8.index-register有效十進制數(shù)。在模塊的一種實施方式中,這可以是值[1-8]。9.vector這類似于STIL中的Vector語句。應(yīng)當(dāng)注意,這指的是信號名與信號組名,使得對于編譯器有必要能夠訪問引腳描述文件。10.waveform-time-reference選自集合[a-zA-Z_0-9]的一個或多個字符的序列,其中第一個字符必須選自集合[a-zA-Z_]。模式文件將支持注釋,注釋的意思是將被模式文件編譯器忽略。注釋以“#”字符開始,延伸到一行的結(jié)束。關(guān)于模式文件頭和“公共”部分中的結(jié)構(gòu),應(yīng)當(dāng)注意以下要點1.pattern-name項指定將與模式文件包含用于其的數(shù)據(jù)的模式對象關(guān)聯(lián)的名字。這在對應(yīng)的模式目標(biāo)元文件中轉(zhuǎn)移到頭。2.waveform-time-reference是用于在模式文件外部,在Timing文件中定義的特定waveform-and-timing定義的名字。模式文件中waveform-time-reference的說明將(用于waveform-and-timing的)特定名字綁定到所有后續(xù)的向量,直到遇到另一waveform-time-reference。3.用于子例程(例如,JSR與JSRC)調(diào)用的操作數(shù)是應(yīng)當(dāng)是在相同模式文件中先前遇到的pattern-speclabel或者外部定義的子例程模式中的pattern-speclabel。這種操作數(shù)最終為加載/處理而分解。用于子例程調(diào)用的操作數(shù)的標(biāo)簽需要在整個系統(tǒng)中唯一。應(yīng)當(dāng)注意,盡管waveform-time-reference名字可以是句法上正確的任何名字,但由于特定的硬件暗示waveform-time-reference名字可能需要限制到先前已知的、很好定義的集合(為了更多的可讀性,這可以由用戶可選地映射到用戶選擇的名字,映射在可選文件中給出)。還應(yīng)當(dāng)注意,模式與waveform-time-reference源文件應(yīng)當(dāng)提供用于連接到物理測試器通道的所有DUT通道的初始配置。如果后續(xù)數(shù)據(jù)對任何DUT通道忽略,則模式編譯器將“插入”模式數(shù)據(jù),保留來自初始級的輸出。模式文件例子[393]MAIN模式源文件的簡單例子將幫助說明該使用。##Filename;goodl.pat#Version1.0;#-------------------------------------#MainPatterndefinition:#-------------------------------------MainPatterngood1{CommonSection{MacroDefdefaultDataVal(XXXXXXXX)MacroDefnopInstr(NOP)MacroDeflabel1(Label1:)MacroDefjniInst(JNI)#-------------------------------------#TimingSpecifications#-------------------------------------Timing″productionTiming.tim″;TimingMap″prodtctionTimingOpenSTARMap.tmap″;#-------------------------------------#DefaultDomainCycles#-------------------------------------Domaindefault{#-------------------------------------#label:instruction{Vector/WaveformData}#-------------------------------------NOP{V{DATA=$defaultDataVal;CLK=1;}W{DATA=wfs1;CLK=wfs1;}}JALmyAPG{V{DATA=00000000;}}JSCmySCAN{V{DATA=10101010;}}JSRCmySubroutine{V{DATA=01010101;}}JSRmyAPG{V{DATA=00110011;}}STI100{}labZero:NOP{V{DATA=00000011;}}JNIlabZero{V{DATA=11111100;}}IDXI3000{V{DATA=10101010;}}IDXIn3{V{DATA=01010101;}}$labe11NOP{V{DATA=$defaultDataVal;}}IDXI2000{V{DATA=10101010;}}NOP{}EXIT{V{DATA=LLHHLLHH;}}}}}[394]以下說明用于說明SUBROUTINE模式源文件的另一例子。#-------------------------------------#SubroutinePattemmySubrPat1definition:#-------------------------------------SubrPatternmySubrPat1{CommonSection{#-------------------------------------#TimingSpecifications#-------------------------------------Timing″productionTiming.tim″;TimingMap″productionTimingOpenSTARMap.tmap″;#-------------------------------------#SourceSelectionSpecifications#-------------------------------------SourceSelectionTable{SourceSelectorSrcSeIDef{DATA=SUBR;CLK=SUBR;DATA=SUBR;}SourceSelectorSrcSelOne{DATA=MAIN;CLK=MAIN;}}#-------------------------------------#DefaultDomainCycles#-------------------------------------Domaindefault{#-------------------------------------#label:instruction{VectorandWaveformDatasetups}#-------------------------------------STI100{Vector{DATA=00000000;}}IDXI3000{Vector{DATA=00001111;}}IDXIn3{Vector{DATA=00110011;}}$label1NOP{Vector{DATA=LLHHLLHH;}}NOP{Vector{DATA=LLXXXXXX;}}NOP{Vector{DATA=LLHHXXXX;}}JNILabel1{Vector{DATA=LLHHLLHH;}}STSSSrcSelOne{Vector{DATA=LHLHLHLH;}}RTN{Vector{DATA=LLXXXXXX;}}}}[395]來自模式源文件的主頭和公共部分的概述信息存儲在目標(biāo)元文件的主頭中。概述包括用于快速提取一般所需的信息,用于幫助地址等的預(yù)加載分解或用于幫助數(shù)據(jù)登錄。由于公共部分的語義對于所有編譯器都是完全相同的,因此每個編譯器都就能夠提供相同的概述信息,而且寫元文件的第一編譯器將存儲這種信息。以下是將要存儲的信息1.模式源文件名。2.在源文件中所聲明的模式類型。3.來自源文件的版本信息。4.用在模式源文件的公共部分中的所有waveform-and-timing名字列表。5.引用模式源文件中公共部分的(相對)向量地址的所有子例程的映射。6.引用模式源文件中公共部分的(相對)向量地址的所有標(biāo)簽的映射。7.通用的簿記信息向量計數(shù)、指令計數(shù),等等。開放體系結(jié)構(gòu)的測試系統(tǒng)需要模式與模式列表文件都具有顯式和不同的擴展名。對于模式文件,這適用于純文本源與編譯后的目標(biāo)文件。這被看作是方便用戶快速識別目錄列表中可見的文件類型等并允許以擴展名為基礎(chǔ)進行關(guān)聯(lián)。模式列表文件解析器將期望具有以下擴展名的文件名純文本模式源文件.pat編譯后的模式目標(biāo)元文件.pobj模式列表文件.plst[397]用戶可以重寫這些缺省值,例如通過測試器環(huán)境變量或者設(shè)置選項。測試器將需要在至少一個環(huán)境配置文件中定義用于文件搜索路徑的以下“環(huán)境”變量Tester_PATLIST_PATH用于模式列表文件。Tester_PATSRC_PATH用于模式源文件(可選的)。Tester_PATOBJ_PATH用于模式目標(biāo)元文件。應(yīng)當(dāng)注意,如果可選的環(huán)境/設(shè)置變量Tester_PATSRC_PATH沒有定義,則將假定與Tester_PATOBJ_PATH相同??偟膩碚f,不定義Tester_PATSRC_PATH比用與Tester_PATOBJ_PATH相同的值來定義更有效。E6.軟件表示[400]模式對象不是由用戶創(chuàng)建的;相反,用戶總是處理模式列表對象,其中模式列表對象是其它模式列表和/或模式的集合。模式列表對象創(chuàng)建、擁有并維護包含在其中的模式對象,同時使用戶可以訪問它們。用戶測試程序中的模式列表對象與磁盤上包含模式列表實際定義的模式列表文件關(guān)聯(lián)。模式列表的定義提供模式列表的顯式名字并通過文件名關(guān)聯(lián)識別模式和/或其它模式列表的有序列表。這部分描述模式列表和列表的軟件表示,作為理解它們?nèi)绾卧跍y試器框架中操作的開頭。模式列表關(guān)聯(lián)[401]測試環(huán)境中的單個測試站點(及通過擴展還有其中的測試計劃)可以與多個頂級模式列表關(guān)聯(lián)。但是,在任何給定時間,對于測試計劃都只有一個執(zhí)行環(huán)境。由于高級模式列表為其(分層)引用的模式定義了執(zhí)行序列,因此活動執(zhí)行環(huán)境是對應(yīng)于當(dāng)前所選的頂級模式列表的環(huán)境。應(yīng)當(dāng)注意,這并不暗示一次只有包含在單個模式列表中的模式可以加載到硬件上;相反,為了使執(zhí)行序列可行而需要加載到硬件上的模式集合必須總是所有當(dāng)前加載模式的子集。模式樹[402]直觀上可以感到表示高級模式列表的一種方式是通過樹數(shù)據(jù)結(jié)構(gòu)的某種排序。圖7說明了本發(fā)明有序模式樹的一種實施方式,假定模式列表A是高級模式列表。模式樹信息內(nèi)容[403]以下信息將存儲在模式樹的每個節(jié)點上1.與該節(jié)點關(guān)聯(lián)的實體(模式列表或模式)的名字。2.定義源的類型。對于葉子(模式節(jié)點),這總是模式文件;對于中間(模式列表)節(jié)點,這可以是“頂級文件”(對于頂級模式列表定義)或者“嵌入在文件中”(對于嵌套的模式列表定義)。3.磁盤上節(jié)點關(guān)聯(lián)的文件的最后修改時間戳。以下附加信息將只存儲在中間節(jié)點(模式列表)上1.(如果有的話)關(guān)于由該節(jié)點表示的模式列表對象設(shè)置的執(zhí)行選項一即,其對象選項。2.(如果有的話)關(guān)于由該節(jié)點表示的模式列表定義內(nèi)的每個孩子引用的執(zhí)行選項一即,對于其每個孩子的引用選項。因此,在從根到中間節(jié)點的唯一路徑上遇到的節(jié)點集合和其中遇到它們的序列包含確定由該節(jié)點表示的組合、有效的執(zhí)行選項所必需的所有信息。模式的執(zhí)行選項是由其中間父親的有效執(zhí)行選項結(jié)合其中間父親可能有的用于其的引用選項確定的。在這里,應(yīng)當(dāng)注意盡管模式列表解析器是在創(chuàng)建模式樹的過程中,但由于它們的使用環(huán)境要到稍后才能分解,因此特定的執(zhí)行選項可能需要簡單地作為字符串的值的初始存儲。這種選項的例子是“掩碼”選項,它指定引腳掩碼信息模式列表不與套接字信息關(guān)聯(lián),因此引腳掩碼信息(引腳與組名)存儲為字符串,在加載之前分解。以下附加信息將只存儲在葉子(模式)節(jié)點中1.對由該模式調(diào)用的子例程的所有(可能是傳遞的)引用,作為執(zhí)行樹,既有外部的又有內(nèi)部的。當(dāng)然,所有模式節(jié)點都將附加地具有對目標(biāo)元文件公共頭中可用的所有模式文件概述信息的訪問并可以選擇對其高速緩沖。處理模式列表修改[409]對模式列表內(nèi)容進行的改變從概念上影響對該模式列表的所有引用。適當(dāng)?shù)貞?yīng)用到模式對象及模式列表對象的以下規(guī)則將用于管理這種改變1.對磁盤上模式列表文件的內(nèi)容所進行的改變將通過測試系統(tǒng)只在關(guān)于該模式列表(或關(guān)于引用其的任何其它模式列表)執(zhí)行的load()命令上傳播。換句話說,軟件中的模式列表層次將總是反映當(dāng)前加載到硬件上的模式列表。2.用戶將能夠設(shè)置使加載過程中所進行的同步模式列表與其磁盤文件源的測試失敗的模式;這將允許生產(chǎn)模式中更快/更安全的操作。模式樹導(dǎo)航與測試站點(及通過擴展還與該站點的測試計劃)關(guān)聯(lián)的頂級模式列表具有公有(全局)范圍。系統(tǒng)提供導(dǎo)航表示頂級模式列表的模式樹的API,使得用戶可以獲得對單獨節(jié)點和子樹的訪問。E7.模式列表動態(tài)特征[411]前面描述了模式列表的靜態(tài)規(guī)則?,F(xiàn)在給出模式列表動態(tài)(執(zhí)行)規(guī)則的描述。模式樹對于總的模式管理是基本的。例如,模式加載序列的起始點是對當(dāng)前與站點或測試計劃關(guān)聯(lián)的模式樹調(diào)用load()方法。但是,模式樹不能孤立地操作。完全初始化的模式樹將引用創(chuàng)建以下兩個框架對象[413]1.頂級模式列表定義模式的模式執(zhí)行序列。它描述這種執(zhí)行序列可以如何從對應(yīng)于該頂級模式列表的模式樹導(dǎo)出。例如,圖7所示對應(yīng)于模式樹A的模式執(zhí)行序列是{q,s,t,q,r,q,u,u,v}。模式執(zhí)行序列是從概念上反映通過模式樹描述的執(zhí)行序列的有序列表??蚣芙⒉⒕S護模式執(zhí)行序列中模式樹節(jié)點與對應(yīng)輸入之間的任何必要的導(dǎo)航鏈接。2.模式集合,它簡單地是模式樹中所有唯一模式(包括子例程)的列表。因此,該列表是將用于確定應(yīng)當(dāng)加載到硬件上的單獨模式列表。框架建立并維護模式集合中模式樹節(jié)點與對應(yīng)輸入之間的任何必要的導(dǎo)航鏈接。圖7模式樹的模式集合是(q,s,t,r,u,v)(假定模式列表A中沒有模式包含任何子例程調(diào)用)。應(yīng)當(dāng)注意,模式執(zhí)行序列和模式集合總是可以從模式樹導(dǎo)出;但是,只要是可行的,在初始構(gòu)造之后對它們進行告訴緩沖常常是有意義的。模式列表執(zhí)行選項[416]如上所示,(定義之前的)每個模式列表聲明或模式列表/模式引用輸入可以后面跟著多個執(zhí)行選項。模式列表執(zhí)行選項修改模式列表的運行時執(zhí)行。為了允許進一步的擴展,用于這些選項的名字(和可選值)將簡單地被模式編譯器的模式列表文件解析器看作字符串,適當(dāng)?shù)赜商囟ò姹窘忉?。測試器規(guī)定以下所述的一組選項及其解釋。但是,廠家可以擴展選項集合。為了允許選項語法的解析時確認,模式列表文件解析器可以讀取特定版本的信息文件。這種信息文件還可以用于執(zhí)行特定版本是否從根本上支持執(zhí)行選項的說明。對于支持一組執(zhí)行選項的版本,以下通用規(guī)則將管理它們的使用。為了理解這些規(guī)則,將模式列表/模式的層次集合可視化為有序的樹是有用的。1.關(guān)于模式列表定義設(shè)置的固有選項(即,在文件中的“l(fā)ocal-pattern-list-declaration,global-pattern-list-declaration”結(jié)果中)有效地指導(dǎo)用戶測試程序中關(guān)于對應(yīng)模式列表對象設(shè)置的選項設(shè)置。因此,它們適用于該模式列表對象的所有引用并稱為對象選項。2.關(guān)于對模式列表/模式的引用設(shè)置的引用選項(即,在文件中的“pattern-entry”和“pattern-list-entry”結(jié)果中)限制層次中對特定路徑選項的范圍-從樹的根到所考慮引用的(由模式列表/模式的聲明次序建立的)路徑。因此,這些是關(guān)于特定對象引用(而不是對對象本身)的選項,并稱為引用選項。3.用于層次集合中任何列表/模式的(由模式列表/模式的聲明次序建立的)有效選項設(shè)置是沿從樹的根到該列表/模式的路徑遇到的對象與引用選項的組合。特定的組合機制(例如,設(shè)置聯(lián)合、設(shè)置交集或任何其它沖突解決算法)是選項本身的屬性。應(yīng)當(dāng)注意,以上規(guī)則的結(jié)果一及沒有設(shè)置關(guān)于模式文件中模式定義的執(zhí)行選項的工具的事實一是沒有設(shè)置應(yīng)用到對模式的所有引用的選項的直接規(guī)則。用于實現(xiàn)這個目的的機制是使用單模式模式列表。測試器指定修改其burst特性并修改其執(zhí)行序列的模式列表執(zhí)行選項的特定集合。當(dāng)用于模式列表的執(zhí)行序列提交給硬件時,硬件產(chǎn)生burst。burst是直接由硬件執(zhí)行模式序列,而不需要軟件的任何介入。burst中斷是執(zhí)行序列中前一burst終止而新burst開始的位置。模式管理軟件的一個目標(biāo)是向硬件提供需要產(chǎn)生burst的執(zhí)行序列。缺省地,一個模式樹生成一個執(zhí)行序列,該序列如果提交給硬件,就將會導(dǎo)致單個burst。但是,這種特性可以提供使用關(guān)于模式列表的選項修改。因此,選項結(jié)果的使用會導(dǎo)致burst中斷。此外,用戶有時候?qū)⑿枰诿總€模式或每個burst之前或其后運行的序言或結(jié)尾模式。這修改將要提交給硬件的執(zhí)行序列。在創(chuàng)建或修改模式執(zhí)行序列對象的過程中,框架具有確定(如果需要的話還報告)模式burst中的中斷所需要的所有信息,該burst是由所指定執(zhí)行選項與由模式樹體現(xiàn)的特定執(zhí)行序列的組合而產(chǎn)生的。這么做時,可能需要調(diào)查系統(tǒng)中模塊的硬件能力。例如,一種硬件實現(xiàn)允許引腳掩碼的四種存儲配置,其中兩種(0和3)用于缺省掩碼(以支持MarksThisVector,MTV)和非掩碼操作。因此,允許用戶的兩種不同的全局引腳掩碼配置,而不需要中斷burst模式。應(yīng)當(dāng)注意,如果模塊廠家不支持硬件中的模式列表實現(xiàn),則廠家對模式執(zhí)行序列的處理將導(dǎo)致執(zhí)行序列中所有模式的單獨執(zhí)行。在站點兼容和站點異類系統(tǒng)中,站點的burst能力將受“最低公分母”的限制。測試器提供特定的缺省選項集合,以下描述其參數(shù)。每個選項都是通過聲明以下開始的它是是固有的(即,與Global或Local關(guān)鍵字的定義關(guān)聯(lián))還是引用的(即,與Pat或PList關(guān)鍵字的引用關(guān)聯(lián))。固有選項在定義點和每個引用應(yīng)用,而引用選項只在其關(guān)聯(lián)的引用時應(yīng)用。此外,如果選項假定為遞歸應(yīng)用到所有靜態(tài)(句法上)或動態(tài)(通過引用語義上)嵌套的模式或模式列表,則選項稱為是被孩子繼承的。以下是選項列表。每個兼容的廠家都將根據(jù)指定解釋這些選項。1.Mask<pin/pingroup>當(dāng)應(yīng)用到GlobalPList、LocalPList時是固有的,當(dāng)應(yīng)用到PList、Pat時是引用的。被孩子繼承。這個模式列表將總是具有由禁用的所指示引腳或引腳組引用的引腳比較電路。有時候,硬件限制可能導(dǎo)致burst中斷。2.BurstOff當(dāng)應(yīng)用到GlobalPList、LocalPList時是固有的,當(dāng)應(yīng)用到PList、Pat時是引用的。不被孩子繼承。這個模式列表將總是在非burst模式執(zhí)行。這個選項不被孩子繼承,但BurstOffDeep選項(下面)是由孩子繼承的。3.BurstOffDeep當(dāng)應(yīng)用到GlobalPList、LocalPList時是固有的,當(dāng)應(yīng)用到PList、Pat時是引用的。被孩子繼承。這個模式列表將總是在非burst模式執(zhí)行。這個選項被孩子繼承,但BurstOff選項(上面)是不由孩子繼承的。應(yīng)當(dāng)注意,BurstOffDeep選項不能被孩子關(guān)閉。4.PreBurst<pattem>當(dāng)應(yīng)用到GlobalPList、LocalPList時是固有的,只被不具有所指定burst選項的孩子節(jié)點繼承。所指示的模式放到這個模式列表的所有burst之前。PreBurst模式就在每次burst由于這個模式列表節(jié)點而開始之前發(fā)生。當(dāng)已經(jīng)在具有是相同模式的PreBurst選項的burst中時,這個選項不應(yīng)用。5.PostBurst<pattem>當(dāng)應(yīng)用到GlobalPList、LocalPList時是固有的,只被不具有所指定burst選項的孩子節(jié)點繼承。所指示的模式放到這個模式列表的所有burst之后。PostBurst模式就在每次burst由于這個模式列表節(jié)點而開始之后發(fā)生。當(dāng)已經(jīng)在具有是相同模式的PostBurst選項的burst中時,這個選項不應(yīng)用。6.PrePattem<pattern>當(dāng)應(yīng)用到GlobalPList、LocalPList時是固有的,不被孩子節(jié)點繼承。所指示的模式放到這個模式列表的所有模式之前。7.PostPattem<pattem>當(dāng)應(yīng)用到GlobalPList、LocalPList時是固有的,不被孩子節(jié)點繼承。所指示的模式放到這個模式列表的所有模式之后。8.Alpg<alpgobjectname>當(dāng)應(yīng)用到GlobalPList、LocalPList時是固有的,不被孩子節(jié)點繼承。所指定的ALPG對象存儲例如低速APG寄存器設(shè)置、讀取等待時間、中間數(shù)據(jù)寄存器、地址數(shù)據(jù)求逆、數(shù)據(jù)生成等的相關(guān)信息。9.StartPattem<pattem>當(dāng)應(yīng)用到GlobalPList、LocalPList時是固有的,不被孩子節(jié)點繼承。模式列表將在其執(zhí)行序列中StartPattem第一次出現(xiàn)時開始執(zhí)行。10.StopPattem<pattern>當(dāng)應(yīng)用到GlobalPList、LocalPList時是固有的,不被孩子節(jié)點繼承。模式列表將在其執(zhí)行序列中StopPattern第一次出現(xiàn)時開始停止執(zhí)行。11.StartAddr<vectoroffsetorlabel>當(dāng)應(yīng)用到GlobalPList、LocalPList時是固有的,不被孩子節(jié)點繼承。這必須與StartPattern選項同時出現(xiàn)。模式列表將在其執(zhí)行序列中StartPattern第一次出現(xiàn)時在StartAddr開始執(zhí)行。12.StopAddr<vectoroffsetorlabel>當(dāng)應(yīng)用到GlobalPList、LocalPList時是固有的,不被孩子節(jié)點繼承。這必須與StopPattern選項同時出現(xiàn)。模式列表將在其執(zhí)行序列中StopPatterm第一次出現(xiàn)時在StopAddr停止執(zhí)行。13.EnableCompare_StartPattern<pattern>當(dāng)應(yīng)用到GlobalPList、LocalPList時是固有的,不被孩子節(jié)點繼承。模式比較將在所指示模式第一次出現(xiàn)時開始。14.EnableCompare_StartAddr,EnableCompare_StartCycle當(dāng)應(yīng)用到GlobalPList、LocalPList時是固有的,不被孩子節(jié)點繼承。這必須與EnableCompare_StartPattern同時出現(xiàn)。指示模式中模式比較要開始的地址或循環(huán)。15.EnableCompare_StopPattern<pattern>當(dāng)應(yīng)用到GlobalPList、LocalPList時是固有的,不被孩子節(jié)點繼承。模式比較將在所指示模式第一次出現(xiàn)時完成。16.EnableCompare_StopAddr,EnableCompare_StopCycle當(dāng)應(yīng)用到GlobalPList、LocalPList時是固有的,不被孩子節(jié)點繼承。這必須與EnableCompare_StopPattern同時出現(xiàn)。指示模式中模式比較要完成的地址或循環(huán)。17.Skip當(dāng)應(yīng)用到PList、Pat時是引用的。不被孩子節(jié)點繼承。使得跳過由模式列表支配的模式或整個序列。這還使得跳過在這個模式列表子樹根的所有選項。就象這個模式子樹對于執(zhí)行目的來說不存在一樣。模式列表burst控制[426]如前面所描述的,當(dāng)用于模式列表的執(zhí)行序列提交給硬件時,硬件產(chǎn)生模式序列的burst,而不需要軟件的任何介入。burst中斷是執(zhí)行序列中前一burst終止而新burst開始的位置。如在以上選項列表中所描述的,PreBurst、PostBurst、BurstOff和BurstOffDeep選項控制burst中斷在哪里發(fā)生。PreBurst和PostBurst選項確定服從下述特定附加規(guī)則的burst中斷1.當(dāng)父親列表具有PreBurst和PostBurst選項且嵌套列表具有相同的對應(yīng)選項時,沒有burst中斷,且嵌套列表的PreBurst和PostBurst選項不應(yīng)用。只有單個burst應(yīng)用父親列表的PreBurst和PostBurst。2.注意,當(dāng)嵌套列表不具有burst選項時,等效于具有通過這些選項的描述與父親列表相同的PreBurst和PostBurst選項。因此,不具有burst選項的嵌套列表不會導(dǎo)致burst中斷。3.如果以上規(guī)則1不應(yīng)用且對從父親列表開始到嵌套列表開始的模式執(zhí)行序列有影響,則在嵌套列表的開始有burst中斷。在這種情況下,父親列表的PreBurst和PostBurst應(yīng)用到從父親列表開始的模式執(zhí)行序列的這種影響。嵌套列表的PreBurst和PostBurst應(yīng)用到嵌套列表。4.如果以上規(guī)則1不應(yīng)用且對從嵌套列表結(jié)束到父親列表結(jié)束的模式執(zhí)行序列有影響,則在嵌套列表的結(jié)束有burst中斷。在這種情況下,父親列表的PreBurst和PostBurst應(yīng)用到對從父親列表開始的模式執(zhí)行序列的這種影響。嵌套列表的PreBurst和PostBurst應(yīng)用到嵌套列表。5.如果規(guī)則1不應(yīng)用且對從除嵌套列表以外的父親列表開始的模式執(zhí)行序列沒有影響,則父親列表的PreBurst和PostBurst不應(yīng)用。只有單個burst應(yīng)用嵌套列表的PreBurst和PostBurst。以下是說明選項對執(zhí)行序列作用的一些例子。為了簡化,假定所有模式列表都在單個文件中指定。例子1BurstOff的使用[429]這個例子說明BurstOff和PreBurst。特別要強調(diào)的是BurstOff使模式單獨運行在一個模式長的burst中。因此PreBurst選項仍然應(yīng)用。輸入模式列表如下GlobalA[BurstOff][PreBurstpat_z]{Patq;PListB;Patr;Pats;GlobalC{Patt;PListD;};PListD;PListE;};GlobalB{Pata;Patb;};GlobalD[BurstOff]{Patc;Patd;};GlobalE{Pate;};根在A的樹可以在圖8中表示。以下是用于這個模式的執(zhí)行序列。字符|指示burst中斷。這個模式列表在10個burst中執(zhí)行,第一個具有模式z和q,最后一個具有模式ezq|ab|zr|zs|t|c|d|c|d|e[431]應(yīng)當(dāng)注意以下關(guān)于這個執(zhí)行序列的要點1.由于關(guān)于A的BurstOff選項沒有被B繼承,因此B中的模式a和b作為burst操作。2.由于關(guān)于A的PreBurst選項沒有被B繼承,因此B的burst中的a和b前面沒有加上z。3.前面加z只對由于作為a的直接孩子,即模式q、r和s,而執(zhí)行的模式發(fā)生。由于A具有BurstOff選項,因此這些模式是單獨執(zhí)行的,就象在只有一個模式長的burst中。BurstOff需要模式在一個模式長的burst中單獨運行。因此,PreBurst和PostBurst選項仍然應(yīng)用。4.模式列表D具有使其孩子c和d單獨執(zhí)行的固有burstoff選項。它們不從A繼承PreBurstz。例子2BurstOffDeep的使用[433]這個例子說明了BurstOffDeep選項。模式列表定義過程中的BurstOffDeep影響嵌套定義與引用列表。但是,PreBurst和PostBurst選項不被嵌套和引用列表繼承。該例子使用與例子1中相同的模式A、B、C、D、E,但選項是不同的5.關(guān)于A定義的選項[BurstOffDeep]、[PreBurstz]、[PostBursty]6.對任何其它節(jié)點都沒有其它選項。執(zhí)行序列如下。就象前面,|字符指示burst中斷。zqy|a|b|zry|zsy|t|c|d|c|d|e注意,以下關(guān)于這個執(zhí)行序列的要點1.PreBurst和PostBurst選項不被B、C、D、E繼承。2.BurstOffDeep被B、C、D和E繼承。例子3PreBurst和PostBurst繼承[436]現(xiàn)在假定考慮例子1的模式列表樹,其中選項是1.關(guān)于A定義的選項[PreBurstx]、[PostBursty]2.關(guān)于A定義的選項[PreBurstx]、[PostBurstz]3.對任何其它節(jié)點都沒有其它選項。執(zhí)行序列將是xqabrstcdcdey[438]“tcd”子序列不是“xtcdz”的原因如下1.第一個x是禁止的,因為它等于與有效的當(dāng)前burst關(guān)聯(lián)的pre-burst選項。2.最后一個z是禁止的,因為PostBurstz沒有繼承到D,而且沒有從C生成的z可以附加到其上面的模式。例子4Skip的使用[440]這個例子說明了關(guān)于嵌套定義和引用列表的Skip選項的作用。該例子使用與例子1中相同的模式A、B、C、D、E,但選項是不同的1.關(guān)于A定義的選項[Skip]、[PreBurstz]、[PostBursty]2.關(guān)于對r引用的選項[Skip]3.關(guān)于C定義的選項[Skip][441]執(zhí)行序列是如下沒有中斷的單個burstzqabscdey[442]注意以下關(guān)于這個執(zhí)行序列的要點1.用于r和C的節(jié)點被跳過。2.根本沒有burst中斷。例子5Mask的使用這個例子說明了Mask的作用及其對模式和模式列表定義與引用的作用。該例子使用與例子1中相同的模式A、B、C、D、E,但選項是不同的1.關(guān)于A定義的選項[maskpin1_pin2]、[PreBurstz]2.關(guān)于對B引用的選項[maskpin3]3.關(guān)于B定義的選項[maskpin4]4.關(guān)于對e引用的選項[maskpin5]5.對任何節(jié)點都沒有其它選項。名字“pin1_pin2”指定掩碼Pin1和Pin2的組。名字“pin3”、“pin4”和“pin5”分別指定掩碼Pin3、Pin4和Pin5。以下提供該執(zhí)行序列,|指示burst中斷。每個模式下的數(shù)字指示在該模式執(zhí)行過程中被掩碼的引腳。zqabzrzstcdcd|e111111111111112222222222222233544[446]注意以下關(guān)于這個執(zhí)行序列的要點1.廠家的硬件如果沒burst中斷的話只可以容納兩個掩碼塊。在e執(zhí)行之前,這兩個掩碼塊是引腳{1,2}和引腳{1,2,3,4}。當(dāng)模式e以引腳{1,2,5}的不同掩碼塊到達時,硬件需要burst中斷。例子6繼承選項與引用的使用[448]這個例子說明了當(dāng)定義被引用時,在定義處的繼承選項不應(yīng)用??紤]以下例子GlobalA{GlobalB[BurstOffDeep]{GlobalC{…};…};…PLIstC;};GlobalD{PListC;};[449]BurstOffDeep選項是由C在其定義的點繼承的。但是,它不是固有選項,因此在其兩個引用點不會應(yīng)用到C。例子7對于嵌套列表的PreBurst和PostBurst[451]考慮以下例子GlobalPListA[PreBurstx][PostBursty]{Patp1;LocalPListB[PreBurstx][PostBursty]{Patp2;}LocalPListC{Patp3;}LocalPListD[PreBurstx][PostBurstz]{Patp4;}LocalPListE[PreBurstw][PostBursty]{Patp5;}Pa1p6;}[452]該執(zhí)行序列是xp1p2p3y|xp4z|wp5y|xp6y1.因為嵌套列表的PreBurst和PostBurst選項指定為與父親的相同,所以模式p2在與p1相同的burst中。因為這些選項繼承為與父親的相同,所以模式p3也在相同的burst中。這些選項在剩余的嵌套列表中有至少一個不同的成員,從而造成burst中斷。定時[453]用戶主要通過利用模式文件定義測試設(shè)置來與系統(tǒng)交互。定時文件用于描述這些模式的定時。這個文件需要分解用于底層定義的其它系統(tǒng)文件(例如,Pin、SpecSelector)。此外,用在定時定義中分解各種變量的Spec-Selectors和Global定義封裝在合成的TestConditionGroup對象中。例如測試計劃文件的較高級文件又使用這個TestConditionGroup實例。測試計劃文件包含對TestConditionGroup對象的引用。模式源文件對TimingMap對象中的WaveformSelector進行引用。Timing對象本身引用Pin對象??蛇x地,Timing對象還可以引用由SpecSelector對象調(diào)制的變量。這些關(guān)系在圖9中說明。Pattern-List中的Pattern對象指定用于一組模式特征的WaveformSelector對象的名字。還要注意,TimingMap文件在模式中指定。如果這個映射未改變,則模式不需要編譯。[456]TestConditionGroupFile對象導(dǎo)入要使用的Timing對象和要使用的TimingMap對象。每個測試都使用從用于該實例的TestConditionGroup對象導(dǎo)出的TimingCondition實例。因此,支持相同波形表的集合的多個Timing對象可以存儲在測試器框架中并可以根據(jù)需要交換。類似地,多個測試計劃文件可以共享公共的TestConditionGroup對象。以下測試計劃描述文件的例子說明了Timing對象的使用。Importpatlistl.plist;Importtim1.tim;Importtim2.tim;Importtmap1.tmap;TestConditionGrouptim1_prod{SpccSet=prodTmgSpec(min,max,typ){period=10ns,15ns,12ns;[458]Timing對象以每個引腳為基礎(chǔ)定義了各種波形。用在Timing文件和TimingMap文件中的引腳需要在引腳定義文件中適當(dāng)?shù)囟x。Timing對象可以使用SpecificationSet對象來定義waveform對象中的值。盡管Timing對象可以包括用于各種屬性的硬編碼值,但情況通常是用戶利用變量指定各個值。這些變量又可以依賴SpecificationSet對象。以下說明這種使用的例子。[460]SpecSelector如下說明地定義。SpecificationSetprodTmgSpec(min,max,typ){t_le=10ns,14ns,12ns;t_e=30ns,34ns,32ns;}[461]通過改變spec而使用的timing的改變在以下例子中說明。F2.映射到測試器的定時組件測試器模塊的兩個組件直接涉及波形的生成及其關(guān)聯(lián)的定時。這兩個模塊是模式生成器(PG)和框架處理器(FP)。說明開放體系結(jié)構(gòu)測試系統(tǒng)體系結(jié)構(gòu)中框架處理器的波形格式化與定時生成的簡化框圖在圖10中說明。以下給出波形生成的簡單描述。模式生成器1002生成模塊中所有引腳公共的定時集合。該定時集合稱為全局定時集合(GTS)。有三種其中模式生成器可以設(shè)置的模式。這三種模式影響可以用于描述GTS的位數(shù)。此外,這些設(shè)置還影響用于選擇簇及CaptureThisVector(CTV)和MaskThisVector(MTV)位是否設(shè)置的位數(shù)。為了通知測試器捕捉這個向量的結(jié)果,用戶在模式文件中使用CTV標(biāo)志。類似地,用戶在模式中使用MTV標(biāo)志來通知測試器掩蔽當(dāng)前向量的結(jié)果。這在下面的表1中說明。模式生成器1002還負責(zé)波形特征(WFC)的生成。WFC以每個引腳為基礎(chǔ)生成。測試器模塊使用固定位數(shù)來描述WFC。表1[465]測試器模塊為每個引腳提供框架處理器1004。每個框架處理器都包含定時設(shè)置擾頻器(TSS)1006,在這個例子中該定時設(shè)置擾頻器具有高達1024的總深度。依賴于前面所述和在圖10中說明的模式生成器的模式,其中使用每個簇64輸入的16個簇,TSS1006可以分成多個簇1008。提供TSS,從而允許為每個引腳定義波形表的能力中更大的靈活性。在“FP”模式,TSS使用2比特輸出一個定時設(shè)置。因此,TSS將生成每個引腳總共四種不同的物理定時設(shè)置。這些定時設(shè)置稱為局部定時設(shè)置(LTS)。框架處理器1004組合LTS和WFC并創(chuàng)建到波形存儲器1012和定時存儲器1014的索引1010。在“FP”模式中,5位值分成由LTS生成的2位和由WFC生成的3位。因此,盡管可以使用最大4種物理定時設(shè)置,但物理波形存儲器和定時存儲器的深度是每引腳32深。波形存儲器保護形成波形的使能定時邊緣。用于使能邊緣的定時值是從定時存儲器獲得的。因此,框架處理器格式化波形。映射方法[467]該方法是以每引腳為基礎(chǔ)將WaveformTable塊映射到測試器中的LTS中。如果測試器硬件支持4個LTS,則用戶可以定義最大4個WaveformTable塊。每個WaveformTable塊可以具有最大n個用于測試器數(shù)字模塊的波形定義。Timing-Map文件提供開放體系結(jié)構(gòu)的測試系統(tǒng)中在Timing-Map塊中定義的邏輯WaveformSelector到模塊的WaveformTable的映射。在該情況下,測試器支持高達256個邏輯WaveformSelector。在開放體系結(jié)構(gòu)的測試系統(tǒng)中,這些邏輯WaveformSelector直接映射到GTS。模式編譯器依賴于Timing-Map和Timing塊,才能夠編譯模式文件。但是,如果Timing塊的WaveformTable中的波形特征未改變或者映射到Timing-Map塊中的WaveformSelector未改變,則不需要重新編譯模式。使用映射方法的例子[470]為了說明到測試器數(shù)字模塊的映射,進行以下假設(shè)框架處理器設(shè)置成FP模式;CTV和MTV位設(shè)置成使GTS位的總數(shù)是6,而定時簇選擇器位的總數(shù)是4。Timing塊中定義的每個WaveformTable都映射到Timing文件中不同的LTS。這是以每個引腳為基礎(chǔ)完成的。因此,WaveformTableseq1映射到LTS1。在“SIG”引腳的情況下,所有8個可能的波形輸入都用完了。但是,“CLK”引腳需要單個波形輸入,從而用完波形存儲器(WFT)和波形定時存儲器(WTM)中的單個行?!癝IG”引腳的前兩個物理波形的映射在圖11中說明。由于這個WaveformTable映射需要邊緣獨立配置的兩個波形特征,因此我們結(jié)束分配波形存儲器(WFT)1112和波形定時存儲器(WTM)1114中的兩個輸入。該模塊的一種實施方式具有總共6個定時邊緣,T1、T2、T3、T4、T5和T6。這些直接映射到在Timing塊的EdgeResource部分中的波形中定義的事件E1、E2、……。如果在Timing塊中定義了多于6個事件且與以上模塊一起使用,則將會導(dǎo)致錯誤。在圖11的例子中,第一個波形特征“0”使用TimingEdgeT1來編程“ForceDown”或“D”事件,該事件發(fā)生在循環(huán)開始10ns的時間。TimingEdgeT2也用于在30ns的時間生成“ForceDown”或“D”事件。最后,TimingEdgeT3用于在45ns的時間生成“ForceOff”或“Z”事件。第二個波形特征“1”使用TimingEdgeT1來編程“ForceUp”或“U”事件,該事件發(fā)生在循環(huán)開始10ns的時間。TimingEdgeT2也用于在30ns的時間生成“ForceDown”或“D”事件。最后,TimingEdgeT3用于在45ns的時間生成“ForceOff”或“Z”事件。以這種方式,WFC映射到框架處理器的WFM存儲器和WTM存儲器中。用于引腳“SIG”的LTS1的波形存儲器WFM的最終設(shè)置在以下表2中說明。表2[476]用于引腳“SIG”的LTSl的波形定時存儲器WTM的最終設(shè)置在以下表3中說明。表3[477]“CLK”引腳用完了單個波形,因此用于這個引腳的WFM和WFT是非常簡單的。用于“CLK”引腳的LTS1的波形存儲器WFM的最終設(shè)置在以下表4中說明。表4[479]LTS2的波形定時存儲器WTM的最終設(shè)置在以下表5中說明。表5TimingMap塊顯式地將WaveformSelector映射到Timing塊的Waveformtable。對于測試器系統(tǒng),這簡化為設(shè)置定時設(shè)置擾頻器(TSS)存儲器。TSS基本上包含從GTS到保留所述設(shè)置的LTS的映射。用于我們例子的引腳SIG的TSS設(shè)置看起來象以下的表6。表6[483]最后,在TSS和LTS設(shè)置映射分解后,模式編譯器可以使用這種信息來利用要使用的正確波形表(LTS)和正確波形特征來編程模式。因此,只考慮引腳“SIG”的我們的例子偽碼模式在圖11中說明。應(yīng)當(dāng)注意,這種編譯不依賴于Timing塊,而只依賴于Timing-Map塊。G.測試器操作[484]這部分描述測試器操作系統(tǒng)(TOS)的基本操作。在這部分中考慮的動作是系統(tǒng)初始化測試計劃加載模式加載運行測試計劃運行單獨的測試系統(tǒng)初始化[485]在一種實施方式中,為了初始化系統(tǒng),必須滿足特定的假設(shè)且必須滿足特定的條件。以下子部分列出這些假設(shè)和條件。前提[486]相關(guān)系統(tǒng)軟件組件的拷貝具有中心存儲器,其位置是系統(tǒng)控制器已知的。這可以是在系統(tǒng)控制器上,或者在具有網(wǎng)絡(luò)安裝目錄的其它系統(tǒng)上(或者通過其它機制對SYSC已知)一不管使用什么機制,在系統(tǒng)可以工作之前,所有軟件都必須對系統(tǒng)控制器可用。這種軟件包括廠家硬件控制(即,模塊軟件)DLL;標(biāo)準(zhǔn)的或用戶測試類DLL;及用戶測試計劃DLL。系統(tǒng)模塊配置文件在系統(tǒng)控制器上可用。回想這個文件使用戶可以指定測試器的物理配置,例如系統(tǒng)底盤中每個模塊的物理位置和類型,及模塊軟件DLL的名字。系統(tǒng)配置文件在系統(tǒng)控制器上可用?;叵脒@個文件包含系統(tǒng)中站點控制器的列表及站點控制器主機名到開關(guān)矩陣輸入端口地址的映射。站點控制器具有稱為站點配置管理器(SCM)運行的服務(wù)。這種服務(wù)負責(zé)通過稱為“硬件發(fā)現(xiàn)”的處理確定在每個槽中安裝了什么硬件。它還負責(zé)參與系統(tǒng)控制器的系統(tǒng)初始化處理。應(yīng)當(dāng)注意,在一種實施方式中,開關(guān)矩陣操作協(xié)議指示單個站點控制器上的SCM應(yīng)當(dāng)總是利用開關(guān)矩陣輸入端口連接地址1配置與模塊的開關(guān)矩陣連接?;叵脒@個“特定”站點標(biāo)記為SITEC-1。系統(tǒng)控制器負責(zé)向每個站點控制器的SCM提供其開關(guān)矩陣連接地址。每個站點控制器的SCM都能夠開始稱為測試計劃服務(wù)器(TPS)的處理。每個站點控制器上的測試計劃服務(wù)器從根本上負責(zé)包含并執(zhí)行用戶的測試計劃(或在單個站點控制器在多個DUT上運行測試的情況下是測試計劃)。初始化階段I系統(tǒng)確認[492]一旦以上假設(shè)和前提都已經(jīng)滿足,系統(tǒng)初始化首先進行如下的系統(tǒng)確認步驟1.系統(tǒng)控制器讀取系統(tǒng)與模塊配置文件,來初始化系統(tǒng)的特定于用戶的視圖。2.利用所指定的系統(tǒng)配置信息,系統(tǒng)控制器驗證所指定的站點控制器是否活動、可到達并已經(jīng)準(zhǔn)備好(即,有SCM在運行)。這個驗證步驟中的任何錯誤都將造成發(fā)生系統(tǒng)錯誤,并且初始化將異常中斷。3.然后,系統(tǒng)控制器通知在SITEC-1的SCM服務(wù)配置開關(guān)矩陣具有對所有硬件模塊的訪問,并請求它執(zhí)行硬件發(fā)現(xiàn)。4.在SITEC-1的SCM服務(wù)向所有可用的模塊槽(已知的硬件位置)輪詢{廠家,硬件}元組并生成{廠家,硬件}元組到槽的映射。結(jié)果是這種輪詢識別出完整系統(tǒng)中存在的{廠家,硬件,槽}綁定的整個集合。這種輪詢的結(jié)果發(fā)送到系統(tǒng)控制器。5.系統(tǒng)控制器驗證以上硬件發(fā)現(xiàn)步驟的結(jié)果匹配模塊配置文件中特定于用戶的配置。這個驗證步驟中的任何錯誤都將造成發(fā)生系統(tǒng)錯誤并且初始化將異常中斷。6.然后,系統(tǒng)控制器從已知位置的環(huán)境設(shè)置文件加載缺省環(huán)境(例如模塊DLL的搜索路徑、模式列表、模式、測試計劃DLL、測試類DLL等)。7.系統(tǒng)控制器確保所有識別出的模塊軟件DLL都存在。如果有在系統(tǒng)控制器上不可用的,則如果可能的話就從中心存儲器檢索;否則將發(fā)生系統(tǒng)錯誤并且初始化將異常中斷。初始化階段II站點配置(可選的)[493]站點配置,或站點分區(qū),涉及可用系統(tǒng)硬件模塊到不同站點的軟件級指定(即,為多個DUT提供服務(wù))。回想站點分區(qū)信息是在套接字文件中提供的。測試器系統(tǒng)允許站點(重新)分區(qū)既可用作為測試計劃加載的一部分(由于每個測試計劃都與特定的套接字關(guān)聯(lián))也可以作為獨立的用戶調(diào)用步驟執(zhí)行。在后一種情況下,用戶通過提供單獨用于分區(qū)系統(tǒng)的套接字文件啟動站點分區(qū)。在每個站點測試不同DUT類型的多DUT測試情況下,這在系統(tǒng)初始化過程中是特別有用的。但是,這個步驟在初始化階段是可選的,并且用戶可以選擇不執(zhí)行它,而是選擇允許測試計劃加載來適當(dāng)?shù)胤謪^(qū)系統(tǒng)。不管選擇來實現(xiàn)站點分區(qū)的方式是什么(通過獨立調(diào)用或者隱含地通過測試計劃加載),機制都是相同的。以下描述這種機制。1.給定套接字,系統(tǒng)控制器首先確定當(dāng)前現(xiàn)有的系統(tǒng)分區(qū)是否與套接字兼容,或者是否需要重新分區(qū)。初始化過程中的缺省分區(qū)是所有可用模塊都連接到SITEC-1的分區(qū)。以下剩余步驟只有在需要重新分區(qū)時才執(zhí)行。2.系統(tǒng)控制器向每個站點控制器的SCM發(fā)送配置信息,以利用在新套接字下已經(jīng)使能的DUT站點個數(shù)和標(biāo)識符重新配置。應(yīng)當(dāng)注意,這個是通用過程并處理由站點控制器控制的DUT站點個數(shù)為一的情況。新套接字信息也傳送到SCM。3.如果有的話,則每個SCM都停止運行的TPS并啟動新的TPS,利用新的套接字和在新套接字下已經(jīng)使能的DUT站點個數(shù)和標(biāo)識符初始化它。4.系統(tǒng)控制器確定哪個站點需要所需系統(tǒng)模塊的什么子集。在這么做的5.同時,它還為該站點準(zhǔn)備硬件槽信息。對于每個站點,凈結(jié)果是指定給該站點的槽對站點模塊DLL的一個列表。特定于站點的列表將標(biāo)記為站點模塊DLL槽列表(SITE-MDSL)。6.站點控制器向每個SCM提供合適的SITE-MDSL及必要的模塊DLL。每個SCM又使這種信息對新啟動的TPS可用。然后,系統(tǒng)控制器請求SITEC-1為合適的站點到槽連接(即為站點分區(qū)操作)配置開關(guān)矩陣。7.站點1至n上的TPS加載在其SITE-MDSL中指定的DLL。這些DLL中的每一個都具有名字為initialize()的函數(shù),該函數(shù)取槽編號的陣列。在這個時候如果有任何誤動作,將發(fā)生系統(tǒng)錯誤并且初始化將異常中斷。initialize()方法進行以下動作a.創(chuàng)建基于標(biāo)準(zhǔn)接口IXXXModule的具體類。例如,與數(shù)字模塊關(guān)聯(lián)的DLL將創(chuàng)建單個基于IPinModule的對象來為與其關(guān)聯(lián)的每個槽服務(wù)。b.創(chuàng)建基于接口IResource的具體類,對模塊中的每個“資源單元”創(chuàng)建一個。同樣,對于數(shù)字模塊,每個基于IPinModule的對象將為由該數(shù)字模塊專用的槽集合中的所有引腳創(chuàng)建基于ITesterPin的對象。8.然后,站點1至n上的TPS對每個加載模塊DLL調(diào)用getXXXModule()來檢索模塊內(nèi)容信息。9.對getXXXModule()的每次調(diào)用都返回作為IModule指針的<VendorHWType>Module類(例如,AdvantestPinModule)。每個這樣的IModule指針都被TPS高速緩沖,這使得這些對于框架/用戶代碼可用。應(yīng)當(dāng)注意,IModule、IResource等的集合是永久性的(至少對于TPS的生命周期)。10.一旦以上步驟都完成了,TPS就在其指定的(眾所周知的)端口上開始listen()。這向系統(tǒng)控制器發(fā)出TPS已經(jīng)“準(zhǔn)備好”開始正常(即,站點分區(qū))操作的信號。測試計劃加載[496]這部分描述用戶測試計劃DLL加載到站點控制器上的步驟(對于單個或多個DUT測試)。一旦系統(tǒng)初始化(及可選地還有啟動站點分區(qū))已經(jīng)完成,用戶測試計劃就可以加載。用戶測試計劃在站點控制器上的加載如下進行1.系統(tǒng)控制器首先將測試計劃DLL加載到其自己的處理空間中,查詢其關(guān)聯(lián)的套接字文件及其DUT類型標(biāo)識符。這種信息用于識別運行這個測試計劃的站點,由此識別這個測試計劃將加載到的站點控制器。2.然后,系統(tǒng)控制器使用與測試計劃關(guān)聯(lián)的套接字信息啟動如上概述的重新分區(qū)處理。3.系統(tǒng)控制器從測試計劃DLL提取由測試計劃所使用的測試類DLL,并且一旦系統(tǒng)控制器驗證TPS已經(jīng)準(zhǔn)備好開始正常(即,站點分區(qū))操作,就向適當(dāng)?shù)腡PS發(fā)送測試類DLL并最終發(fā)送測試計劃DLL本身。4.TPS調(diào)用LoadLibray()將其加載到其處理空間中。它對DLL調(diào)用眾所周知的函數(shù)來創(chuàng)建與其服務(wù)的站點(即,DUT)個數(shù)一樣多的TestPlan對象。5.TPS利用必要的測試器框架對象初始化TestPlan對象。在初始化過程中,TPS將由TestPlan對象所使用的測試類的適當(dāng)DLL加載到處理空間中并創(chuàng)建測試類實例。6.TPS設(shè)置系統(tǒng)控制器到TestPlan對象的通信通道。7.系統(tǒng)控制器與TPS通信并建立其用于TestPlan對象的代理服務(wù)器。這決定了用戶測試計劃在站點控制器上的成功加載。運行測試計劃[499]根據(jù)預(yù)定義流邏輯執(zhí)行測試計劃中所有測試的方法如下1.用戶的應(yīng)用程序?qū)unTestPlan消息發(fā)送到TPS。TPS向所連接的所有應(yīng)用程序發(fā)送ExecutingTestPlan消息。然后,TPS對測試計劃調(diào)用execute()。2.利用單個站點控制器測試多個DUT是利用該站點控制器上的多個線程執(zhí)行的,每個DUT一個線程。每個線程運行相同TestPlan對象的不同、獨立的實例。在這種情況下,由于模塊控制軟件DLL可能跨DUT共享,因此需要用于硬件通信的模塊命令取DUT標(biāo)識符參數(shù)。3.TestPlan對象對其集合中的每個測試迭代(可選地,告訴其流對象根據(jù)流邏輯處理每個測試),調(diào)用preExec()、execute()和postExec()。4.在每個測試執(zhí)行時,狀態(tài)消息發(fā)送回所連接的所有應(yīng)用程序。執(zhí)行單個測試[500]用戶可能希望在一個測試計劃中執(zhí)行單個測試而不是所有測試。對于單個測試的執(zhí)行,方法如下。1.用戶應(yīng)用程序向TPS發(fā)送RunTest消息;TPS向所連接的所有應(yīng)用程序發(fā)送ExecutingTest消息。然后,TPS對測試計劃調(diào)用executeTest(),指定要運行的測試。2.測試計劃對象通過對該測試對象調(diào)用preExec()、execute()和postExec()來執(zhí)行所指定的測試。3.當(dāng)測試執(zhí)行時,它將狀態(tài)消息發(fā)送回所連接的所有應(yīng)用程序。H.模塊控制軟件[501]本發(fā)明實施方式的開放體系結(jié)構(gòu)測試系統(tǒng)在測試系統(tǒng)框架級使用最小充分接口。測試系統(tǒng)框架設(shè)計成在遵循標(biāo)準(zhǔn)接口集的廠商模塊上操作。在模塊廠商將新的模塊部件集成到測試系統(tǒng)中時,新部件優(yōu)選按要求將預(yù)定的標(biāo)準(zhǔn)接口提供給測試系統(tǒng)。這允許以即插即用方式將廠商模塊無縫集成到系統(tǒng)中。圖13示例說明根據(jù)本發(fā)明實施方式的將廠商軟件模塊集成到開放體系結(jié)構(gòu)測試系統(tǒng)中的方法。廠商軟件模塊1302包括資源描述部件1304、驅(qū)動器部件1306、校準(zhǔn)/診斷部件1308、仿真部件1310、可選系統(tǒng)可加載模式編譯器部件1312,以及系統(tǒng)可加載的特定于模塊的部件1314。如框1307中所示,每一部件優(yōu)選包括1)至少一個可執(zhí)行部件(系統(tǒng)運行時使用),2)公用頭文件(即C++,“.h”文件),定義部件的API和所有相關(guān)文檔,以及3)用于該部件的系統(tǒng)部件配置記錄(CCRs)。CCRs允許測試系統(tǒng)的安裝和配置管理子系統(tǒng)管理和使用構(gòu)成部件的元件的所需版本。每一部件還可包括部件的文檔(DOCs),以及應(yīng)用實例(Examples)。開放體系結(jié)構(gòu)測試系統(tǒng)1320包括標(biāo)準(zhǔn)接口集1322,依次包括校準(zhǔn)/診斷框架1324、仿真框架1326和對象文件管理器(OFM)框架1328。測試系統(tǒng)的標(biāo)準(zhǔn)接口1322和各個框架均與廠商模塊軟件1302中的相應(yīng)類型的軟件部件通信。廠商部件的可執(zhí)行文件要求其在運行期間被加載和使用。具體的,要求包括1.以動態(tài)鏈接庫(DLL)形式提供。為模塊化和可維護性目的,上述部件的每一個處于單獨的DLL中。此外,a.模塊DLL優(yōu)選實現(xiàn)標(biāo)準(zhǔn)的系統(tǒng)模塊DLL接口,其是用于檢索固有模塊信息(諸如模塊類型、輸出資源等等)的基本接口。b.模塊DLL僅可輸出單一模塊類型。2.由廠商在CCR中描述DLL的版本。3.用戶將DLL的版本包括在系統(tǒng)概述(systemprofile)中,其是定義特定系統(tǒng)軟件配置所需的信息的總集合。這使得用于驅(qū)動器、仿真器、校準(zhǔn)、診斷和模式編譯器可執(zhí)行部件的DLL說明在系統(tǒng)模塊配置文件(MCF)和系統(tǒng)工具配置文件(UCF)中生成。這些文件在運行期間由系統(tǒng)使用以查找將加載的部件。一旦廠商和用戶(在情況3下的)已滿足上述要求,系統(tǒng)可準(zhǔn)備加載所指定的可執(zhí)行部件。到測試操作系統(tǒng)(TOS)的標(biāo)準(zhǔn)接口被定義為抽象的C++類。要求以DLLs的形式提供用于系統(tǒng)的特定于模塊的軟件,其可在運行時由系統(tǒng)軟件獨立和動態(tài)地加載。每一這種軟件模塊負責(zé)提供系統(tǒng)模塊接口命令的特定于廠商的實現(xiàn),所述系統(tǒng)模塊接口命令包括用于模塊軟件開發(fā)的應(yīng)用編程接口(API)。應(yīng)當(dāng)指出,支持標(biāo)準(zhǔn)接口并不意味著每一模塊軟件部件需要僅提供由模塊相符的系統(tǒng)標(biāo)準(zhǔn)接口所體現(xiàn)的功能性。相反,廠商根據(jù)實現(xiàn)他們的模塊的需要,可自由地將一個或多個復(fù)雜的功能性層添加到系統(tǒng)標(biāo)準(zhǔn)接口上。然而,系統(tǒng)框架不能訪問該附加的功能。用戶和廠商有責(zé)任解釋和利用超出由框架和TOS提供的預(yù)定能力的附加的功能。因此,測試系統(tǒng)的用戶可自由地使用由模塊廠商提供的特定特征和定制擴展。需要權(quán)衡的是使用定制擴展可向特定廠商模塊提供更多功能性,但定制擴展使特定廠商模塊和它們的相關(guān)測試程序更加不可與其他廠商的模塊一起使用。圖14示例說明根據(jù)本發(fā)明實施方式的模塊控制框架。模塊控制框架包括模塊接口(IModule)1402、資源接口(IResource)1404,以及資源組接口(IResourceGroup)1406。IModule1402可以可選地包括模式列表模塊接口(IPatternListModule)1408、域模塊接口(IDomainModule)1410和循環(huán)模塊接口(ICyclizedModule)1412。類似地,IResource1404可以可選地包括循環(huán)資源接口(ICyclizedResource)1414和循環(huán)資源組接口(ICyclizedResourceGroup)1416,其可被廠商選擇實現(xiàn)以提供由被選接口指示的特殊功能性。每一接口在下文詳細地論述。IModule接口[509]硬件模塊類型和其相應(yīng)的軟件對象之間的關(guān)系由IModule接口1402定義。換句話說,IModule接口實現(xiàn)表示特定硬件模塊類型的系統(tǒng)標(biāo)準(zhǔn)接口,以及包含連接到站點控制器的那個模塊類型的個體單元。IModule接口1402聲明獲得模塊信息、檢索資源和資源組的用戶級方法。用戶可將該接口應(yīng)用在廠商級上,以便利用由廠商模塊提供的特定于廠商的特征。在一個實施例中,IModule接口1402包括下述方法。·getResource()該方法按資源名檢索模塊資源?!etResources()該方法檢索特定類型的所有模塊例示化的資源。·getResourceGroups()該方法檢索特定類型的所有模塊例示化的資源組?!etResourceGroup()該方法按其名稱檢索現(xiàn)有的資源組。IResource接口[510]使用硬件資源(或簡稱資源)的說明來以可由用于所有模塊的系統(tǒng)框架支持的方式描述硬件模塊功能性。資源是可作為單一、獨立對象被控制的一個或多個功能硬件實體的邏輯集合。資源單元通常由模塊提供。資源單元的一個例子是由DM250MHz板提供的單一數(shù)字測試器引腳,其連接到系統(tǒng)模塊連接使能器(MCE)的單一輸出端口。硬件資源單元及其相應(yīng)的軟件對象間的關(guān)系是軟件對象實現(xiàn)表示特定資源類型的單一邏輯單元的資源接口。每一適應(yīng)的硬件模塊提供由測試系統(tǒng)使用的一種或多種資源。硬件模塊是包含廠商指定的模塊類型并連接到系統(tǒng)MCE的輸出端口的廠商提供的硬件實體。MCE提供所需的一種或多個資源的單元。注意,相同類型的模塊單元可在MCE上占用與所需端口連接一樣多的端口連接。模塊的類型在特定廠商的供給內(nèi)是唯一的。資源定義語言被用來聲明用于可用資源類型的資源名稱集,以及與每一特定資源類型有關(guān)的屬性和類型集。通過參數(shù)值的設(shè)定,廠商支持其硬件資源的配置。例如,使用資源名“Digital.dpin”來指代數(shù)字測試器引腳。這些資源具有諸如VIL(用于輸入低電壓)、VIH(用于輸入高電壓)、VOL(用于輸出低電壓)、VOH(用于輸出高電壓)等等的參數(shù)。因此,每一資源具有由系統(tǒng)或資源廠商定義的屬性,其可用在該資源的屬性集內(nèi)。系統(tǒng)資源定義文件包含系統(tǒng)資源定義語言中的資源聲明。系統(tǒng)指定可在標(biāo)準(zhǔn)系統(tǒng)文件中得到的某些標(biāo)準(zhǔn)的資源名。要求提供要求不同參數(shù)的說明的專門用途的廠商提供它門自己的資源定義文件,并將它們放在預(yù)定位置。系統(tǒng)將在資源定義文件中定義的參數(shù)處理為字串(string),以便原樣傳遞到特定于廠商的軟件。特定于廠商的模塊軟件負責(zé)將這些字串解釋為所需參數(shù),且如果必要,提供特定的APIs,通過這些APIs,測試程序能利用這些擴展。在目標(biāo)模型中,每一資源單元實現(xiàn)IResource接口。支持其特定的功能性,提供這種資源的模塊能實現(xiàn)暴露從IResource接口導(dǎo)出的接口的對象,其被用來與測試系統(tǒng)通信。IResource接口允許由廠商或用戶提供的測試類在不重新編譯測試器操作系統(tǒng)的情況下包含另外的功能性,從而在測試模塊及它們相應(yīng)的DUTs中,為用戶提供更多靈活性。特定資源的IModule接口能創(chuàng)建與在特定測試程序的套接字描述中指定的一樣多的IResource對象。由于每一資源單元存儲用于識別目的的類型、端口ID和通道ID,IResource對象表示通過參數(shù){類型,端口ID,通道ID},可在整個系統(tǒng)中唯一地識別特定資源類型的單一單元。該參數(shù)是在系統(tǒng)模塊配置文件(MCF)中定義的說明“端口ID.通道ID”。用于特定資源單元的“端口ID”和“通道ID”元素可從套接字對象(其提供從DUT引腳名到承載板連接的映射,以及通過在MCF的TestHeadConnections部分中的特定于資源類型的塊,將承載板連接映射到“端口ID.C通道ID說明)獲得。注意,在任何指定時間,對于DUT引腳集的任何組合,測試系統(tǒng)支持可為不止一個DUT引腳所用的共享資源。測試系統(tǒng)還支持將單一DUT引腳連接到多個資源單元,以及限制可將資源單元的不超過一個的單元(除電源外)連接到相同的DUT引腳。在一個實施例中,IResource接口1404包括下述方法·getAttributeCache()陔方法檢索與該資源相關(guān)的屬性高速緩存。·getName()該方法檢索該IResource的名稱?!etChannelID()該方法檢索用于該資源的HW通道ID?!etPortIDQ該方法檢索用于該資源的開關(guān)陣列端口ID?!etType()該方法檢索該資源的TPL類型(例如“Digital.dpin”等)?!etConnectedDUTPins()該方法檢索所連DUT引腳名集(對于共享資源是有用的)?!etModule()該方法檢索到創(chuàng)建該IResource的IModule的指針?!etAllAttributes()該方法檢索用于該資源的所有屬性的名稱/類型信息列表?!etAllAttributeValues()該方法檢索用于該資源的所有屬性的全部信息的列表?!etAttribIntVal()該方法檢索屬性的整數(shù)值(如果適當(dāng)?shù)脑??!etAttribUIntVal()該方法檢索屬性的無符號整數(shù)值(如果適當(dāng)?shù)脑?。·getAttribDblVal()該方法檢索屬性的雙精度型值(如果適當(dāng)?shù)脑?。IResourceGroup接口[518]IResourceGroup接口1406表示IResources集的集體行為。它是暴露給允許用戶指定IResources集合且隨后將該集合用作單一資源單元的Imodules的接口。而IResourceGroup包含用來創(chuàng)建IResourceGroup的IResources集,向作為一整體的該集合提供統(tǒng)一編程接口。例如,特定廠商可以具有硬件支持的機制來同時向IResources的所有成員廣播IResourceGroup上的屬性設(shè)置調(diào)用,而不單獨地針對每一成員調(diào)用屬性設(shè)定方法。在測試系統(tǒng)中,在用戶定義信號中的DUT引腳組時,由系統(tǒng)創(chuàng)建資源組。該隱含結(jié)構(gòu)是創(chuàng)建資源組的方式。IresourceGroup可僅是同類的,即包含相同類型的IResources(由測試程序語言(TPL)定義,諸如類型“Digital.dpin”或“PowerSupply.dps”,但不是兩者。從給定IResources集合創(chuàng)建IResourceGroup的創(chuàng)建者實施該要求。通過下述參數(shù)集,在系統(tǒng)中唯一地識別IresourceGroupDUT-pin-group-name,resource-type,vendor-ID,module-ID[521]注意要求IModule接口提供IResourceGroup接口,不管是否可得到硬件支持。在缺少真正硬件“資源組”的情況下,提供功能性的軟件等效。另外,IModule接口提供用于使用IResources的同類集合創(chuàng)建IResourceGroup的“虛擬構(gòu)造器”。這通過IModule接口的createResourceGroup()方法來實施。在一個實施例中,IResourceGroup接口包括下述方法·getName()該方法檢索該組的名稱?!etMembers()該方法檢索包括該組的IResources的集合?!etModule()該方法檢索到創(chuàng)建該組的IModule的指針?!etType()該方法檢索包括該組的IResources的TPL類型,例如“Digital.dpin”等?!etAttributeCache()該方法檢索用于該組的資源類型的屬性高速緩存。·getAllAttributes()該方法檢索用于該組的資源類型的所有屬性的名稱/類型信息的列表。IPattemListModule接口[523]IPattemListModule接口1408是IModule接口的專門化,并表示支持測試模式對象的操作的硬件模塊。包括下述方法·getNumberOfLoadedPatterns()該方法檢索加載模式的數(shù)量?!etPatternIDs()陔方法獲得加載模式ID數(shù)組?!etPatternListIDs()該方法獲得加載到模塊中的模式列表的數(shù)組。IDomainModule接口[524]IDomainModule接口1410是IPattemListModule接口1408的專門化,并且表示支持時域所需的功能性的硬件模塊(諸如以特定頻率計時的資源組)。它實現(xiàn)下述方法·getVendorDomain()該方法通過標(biāo)識符檢索廠商域?qū)ο??!etVendorDomain()該方法按名稱檢索廠商域?qū)ο??!etVendorDomains()該方法檢索由該模塊例示的所有廠商域?qū)ο蟮募稀!etVendorDomainsForPatterm()該方法檢索與給定模式有關(guān)的所有廠商域的集合。ICyclizedModule接口[525]ICyclizedModule接口1412提供用于循環(huán)模塊的接口。包括下述方法·getCyclizedAddressFailMemory()該方法獲得模塊地址故障存儲器對象指針?!etCyclizedFailMemory()該方法獲得模塊故障存儲器對象指針。·getCyclizedResource()該方法按其名稱檢索循環(huán)資源?!etCyclizedResourceGroup()該方法按其名稱檢索資源組。ICyclizedResource接口[526]ICyclizedResource接口1414將標(biāo)準(zhǔn)IResource資源擴展為具有專用于循環(huán)資源的功能性。循環(huán)資源包含具有定時屬性的元素,諸如與系統(tǒng)定時有關(guān)的部件、定時圖和循環(huán)數(shù)字模式數(shù)據(jù)。ICyclizedResource提供輸出ICyclizedAttributeCache的功能,允許系統(tǒng)框架與用于系統(tǒng)定時和定時圖屬性的TCM設(shè)定一起工作。另外,ICyclizedResource允許用戶在使用中檢索定時和定時圖屬性。在一個實施例中,ICyclizedResource接口1414包括下述方法·getCyclizedAttributeCache()該方法檢索允許將時間和時間圖屬性應(yīng)用于硬件的高速緩存對象?!etTimingData()該方法檢索當(dāng)前在資源單元上設(shè)置的定時數(shù)據(jù)?!etTimingMapData()該方法檢索當(dāng)前在資源上設(shè)置的定時圖相關(guān)屬性?!etTimingData()陔方法設(shè)置有關(guān)該循環(huán)數(shù)字資源的定時相關(guān)屬性。這設(shè)置單一波形的所有內(nèi)容,如在TPL定時語言所定義的?!etTimingMapData()該方法設(shè)置有關(guān)該循環(huán)數(shù)字資源的定時圖相關(guān)的屬性。ICyclizedResourceGroup接口[528]該ICyclizedResourceGroup接口1416提供專門的IResourceGroup接口,用于使IcyclizedResources形成組。它包括下述方法·getCyclizedAttributeCache()該方法檢索允許將定時和定時圖應(yīng)用于硬件的高速緩存對象·setTimingData()該方法設(shè)置有關(guān)該循環(huán)數(shù)字資源組的定時相關(guān)屬性。這設(shè)置單一波形的所有內(nèi)容,如以TPL時間語言中所定義的?!etTimingMapData()該方法設(shè)置有關(guān)該循環(huán)數(shù)字資源組的定時圖相關(guān)屬性。模塊初始化[529]通過需要它的站點控制器上的測試系統(tǒng),自動地加載廠商模塊的驅(qū)動器DLL。在該上下文中,術(shù)語模塊DLL是指模塊驅(qū)動器DLL。在一個實施例中,如下示出了模塊初始化流程,該流程在系統(tǒng)和站點控制器上的主服務(wù)處理啟動后出現(xiàn)。在離線模式下,在已經(jīng)啟動仿真框架可執(zhí)行文件(模擬測試器,或SimTester)后,模塊產(chǎn)生(bring-up)開始。1.系統(tǒng)控制器初始化本身,以及與站點控制器建立連接。2.系統(tǒng)控制器加載系統(tǒng)MCF。3.系統(tǒng)控制器啟動與系統(tǒng)模塊連接使能器的輸入端口1相連的主站點控制器(即站點控制器1)上的硬件發(fā)現(xiàn)過程。該硬件信息用來在系統(tǒng)控制器上創(chuàng)建系統(tǒng)硬件清單文件。4.系統(tǒng)控制器相對于通過硬件發(fā)現(xiàn)獲得的信息,驗證MCF。5.然后,系統(tǒng)控制器對所有模塊軟件進行如下驗證a.使用用于該DLLs的搜索路徑,找出在MCF中指定的模塊DLLs。b.加載每一模塊DLL(模塊DLL優(yōu)選實現(xiàn)該接口)。c.(使用由DLL輸出的標(biāo)準(zhǔn)方法)核實在用于那一模塊的MCF中聲明的資源可由該模塊創(chuàng)建。6.然后,系統(tǒng)控制器使用模塊配置信息填充所有站點控制器(除主控制器外)。該信息稍后用于模塊對象結(jié)構(gòu)。7.系統(tǒng)控制器準(zhǔn)備該系統(tǒng)的缺省劃分(這里,每一模塊連接到主站點控制器)。系統(tǒng)校準(zhǔn)改進該狀態(tài)。一旦已經(jīng)執(zhí)行缺省劃分,該系統(tǒng)作為一整體處于初始化狀態(tài)。模塊設(shè)置和訪問[531]在另一實施例中,以下示出導(dǎo)致成功的、無缺省系統(tǒng)劃分的事件的順序。由于在套接字文件中指定劃分信息,假定已經(jīng)讀取正確的套接字文件,且已經(jīng)創(chuàng)建基于該套接字文件的套接字對象。1.系統(tǒng)控制器指令主站點控制器根據(jù)在套接字中指定的劃分配置MCE。2.然后,每一站點控制器加載模塊DLLs以及構(gòu)造模塊對象,其每一個優(yōu)選實施標(biāo)準(zhǔn)接口IModule。該過程如下a.將模塊DLL從系統(tǒng)控制器傳送到站點控制器。b.將模塊DLL加載在站點控制器服務(wù)過程的過程空間中。c.在模塊DLL接口上創(chuàng)建IModule對象。廠商承擔(dān)創(chuàng)建特定于廠商的對象的責(zé)任。在該步驟中,廠商還執(zhí)行所需的任何內(nèi)部初始化步驟。3.每一站點控制器通過調(diào)用initialize()方法,初始化以上創(chuàng)建的IModule。用于該方法的參數(shù)用作套接字對象、在MCF中描述的任何特定于廠商的數(shù)據(jù),以及被測的DUTs的標(biāo)識符列表(在并行測試環(huán)境中)的指代。在該步驟中,IModule對象創(chuàng)建和初始化測試系統(tǒng)可用的IResource單元對象。站點控制器系統(tǒng)軟件維護適當(dāng)配置和初始化的IModule的集合,以及將其用于測試操作,諸如測試計劃加載、模式加載、測試計劃執(zhí)行、故障數(shù)據(jù)檢索等等。它還允許系統(tǒng)對象、用戶測試類以及廠商對象與所提供的IModule和IResource交互作用。在一個實施例中,下述步驟示例說明在運行時,用戶測試類訪問資源單元的方法(下文所指的客戶程序是用戶測試類)1.客戶程序,在其postExec()方法中,需要執(zhí)行在硬件上設(shè)置的引腳屬性的當(dāng)前值的數(shù)據(jù)記錄,用于DUT引腳組G0,包含引腳A0和A1。2.正在站點控制器上執(zhí)行的客戶程序從測試計劃檢索對應(yīng)于DUT引腳組G0的信號(其是封裝DUT引腳和所連硬件資源單元間的關(guān)系的框架提供的對象)。3.客戶程序使用方法Signal::getResources()來從用于G0的信號檢索IResourceGroup指針。4.客戶程序使用IResourceGroup::getMembers()方法來抽取其中的IResources(即連接到DUT引腳A0和A1的資源單元)。5.假定已經(jīng)使用循環(huán)模塊和資源,客戶程序使用C++dynamic_cast<>算子來將IResource指針轉(zhuǎn)換到ICyclizedResource指針。6.通過每一ICyclizedResource指針,客戶程序通過使用ICyclizedResource::getTimingData()方法檢索例如時間數(shù)據(jù)。7.客戶程序數(shù)據(jù)記錄上述檢索的定時屬性值。所公開的用于控制可互換部件的方法允許將新模塊類型透明地添加到測試系統(tǒng),而無需重新編譯測試操作系統(tǒng)。由此,所公開的方法支持開放體系結(jié)構(gòu)測試系統(tǒng)用于將完全可重新配置和可互換的廠商模塊部件與它們的相關(guān)硬件和軟件集成。因此,在廠商模塊被獨立指定、開發(fā)和確認后,該方法支持此類模塊的即插即用方式。這為終端用戶提供了靈活的、模塊化的、可重新配置和易于升級的開放體系測試系統(tǒng),該系統(tǒng)可重新利用廠商模塊用于測試并降低了測試集成電路的成本。相關(guān)領(lǐng)域的技術(shù)人員將意識到可以使用所公開的實施例的許多可能的改進和組合,同時仍然采用相同的基本基礎(chǔ)機制和方法學(xué)。為說明目的,已經(jīng)參考具體的實施例撰寫上述說明。然而,上文所示的論述不打算窮舉或?qū)⒈景l(fā)明限制到所公開的具體形式。根據(jù)上述教示,許多改進和變形是可能的。選擇和描述實施例以便說明本發(fā)明的原理及它們的實際應(yīng)用,以及允許本領(lǐng)域的技術(shù)人員更好地利用本發(fā)明和具有所期望的具體使用的多種改進的多種實施例。權(quán)利要求1.一種用于將測試模塊集成在模塊化測試系統(tǒng)中的方法,包括通過控制器控制至少一個測試模塊及其相應(yīng)的被測設(shè)備(DUT);通過模塊控制框架,在廠商提供的測試模塊和該模塊化測試系統(tǒng)間建立標(biāo)準(zhǔn)的模塊控制接口;安裝該廠商提供的測試模塊和相應(yīng)的廠商提供的控制軟件模塊,其中,該廠商提供的控制軟件模塊被組織成多個廠商提供的模塊控制部件;基于該模塊控制框架和多個廠商提供的模塊控制部件,配置該模塊化測試系統(tǒng);以及使用該模塊控制框架,根據(jù)多個廠商提供的模塊控制部件,訪問該廠商提供的測試模塊。2.如權(quán)利要求1所述的方法,其中,模塊控制框架包括模塊類,用于表示該廠商提供的測試模塊的硬件模塊類型;資源類,用于表示該廠商提供的測試模塊的特定資源類型的邏輯單元;以及資源組類,用于表示之間具有統(tǒng)一的接口的個體資源單元的組。3.如權(quán)利要求2所述的方法,其中,模塊控制框架進一步包括模式列表模塊類,用于支持模式和模式列表;域模塊類,用于檢索廠商域?qū)ο?;以及循環(huán)模塊類,用于檢索循環(huán)資源。4.如權(quán)利要求2所述的方法,其中,模塊控制框架進一步包括循環(huán)資源類,用于支持具有定時屬性的廠商提供的測試模塊;以及循環(huán)資源組類,用于表示個體循環(huán)資源單元組。5.如權(quán)利要求1所述的方法,其中,模塊控制框架進一步包括系統(tǒng)資源定義語言,用于支持廠商提供的硬件資源的定制配置;以及系統(tǒng)資源定義文件,用于存儲廠商提供的專門用途的資源。6.如權(quán)利要求5所述的方法,其中,系統(tǒng)資源定義語言用來定義用于相應(yīng)資源類型集的資源名稱集;以及用于相應(yīng)的資源類型集的參數(shù)名稱和類型集。7.如權(quán)利要求1所述的方法,其中,多個廠商提供的模塊控制部件包括資源描述部件;驅(qū)動器部件;診斷部件;校準(zhǔn)部件;以及仿真部件。8.如權(quán)利要求7所述的方法,其中,多個廠商提供的模塊控制部件進一步包括模式編譯器部件;以及特定于模塊的部件。9.如權(quán)利要求1所述的方法,其中,多個廠商提供的模塊控制部件是動態(tài)鏈接庫格式的可執(zhí)行部件。10.如權(quán)利要求1所述的方法,其中,多個廠商提供的模塊控制部件被提供于部件配置記錄中。11.如權(quán)利要求1所述的方法,其中,配置模塊化測試系統(tǒng)包括初始化系統(tǒng)控制器;在系統(tǒng)控制器和至少一個站點控制器之間建立連接;將系統(tǒng)模塊配置文件加載到系統(tǒng)控制器;發(fā)現(xiàn)連接到該模塊化測試系統(tǒng)的硬件設(shè)備;將所發(fā)現(xiàn)的硬件信息存儲在系統(tǒng)控制器上的硬件清單文件中;相對于該硬件清單文件,驗證該系統(tǒng)模塊配置文件;驗證該廠商提供的控制軟件模塊;用該系統(tǒng)模塊配置文件填充該至少一個站點控制器;以及劃分該模塊化測試系統(tǒng)。12.如權(quán)利要求11所述的方法,其中,驗證該廠商提供的控制軟件模塊包括定位在該系統(tǒng)模塊配置文件中指定的模塊動態(tài)鏈接庫;加載該模塊動態(tài)鏈接庫;以及核實可通過相應(yīng)的廠商提供的控制軟件模塊創(chuàng)建在該系統(tǒng)模塊配置文件中聲明的資源。13.如權(quán)利要求11所述的方法,其中,劃分該模塊化測試系統(tǒng)包括讀取套接字文件,其中,該套接字文件包括用戶指定的系統(tǒng)劃分信息;根據(jù)該套接字文件,配置系統(tǒng)模塊連接使能器;在每一站點控制器,加載相應(yīng)的模塊化動態(tài)鏈接庫;根據(jù)相應(yīng)的模塊動態(tài)鏈接庫,創(chuàng)建標(biāo)準(zhǔn)模塊控制接口;以及在每一站點控制器,初始化該標(biāo)準(zhǔn)模塊控制接口。14.一種模塊測試系統(tǒng),包括控制器,用于控制至少一個測試模塊及其相應(yīng)的被測設(shè)備(DUT);模塊控制框架,用于在廠商提供的測試模塊和該模塊化測試系統(tǒng)之間建立標(biāo)準(zhǔn)的模塊控制接口;用于安裝該廠商提供的測試模塊和相應(yīng)的廠商提供的控制軟件模塊的裝置,其中,該廠商提供的控制軟件模塊被組織成多個廠商提供的模塊控制部件;用于基于該模塊控制框架和多個廠商提供的模塊控制部件配置該模塊化測試系統(tǒng)的裝置;以及用于使用該模塊控制框架,根據(jù)多個廠商提供的模塊控制部件,訪問該廠商提供的測試模塊的裝置。15.如權(quán)利要求14所述的系統(tǒng),其中,模塊控制框架包括模塊類,用于表示該廠商提供的測試模塊的硬件模塊類型;資源類,用于表示該廠商提供的測試模塊的特定資源類型的邏輯單元;以及資源組類,用于表示之間具有統(tǒng)一的接口的個體資源單元的組。16.如權(quán)利要求15所述的系統(tǒng),其中,模塊控制框架進一步包括模式列表模塊類,用于支持模式和模式列表;域模塊類,用于檢索廠商域?qū)ο?;以及循環(huán)模塊類,用于檢索循環(huán)資源。17.如權(quán)利要求15所述的系統(tǒng),其中,模塊控制框架進一步包括循環(huán)資源類,用于支持具有定時屬性的廠商提供的測試模塊;以及循環(huán)資源組類,用于表示個體循環(huán)資源單元組。18.如權(quán)利要求14所述的系統(tǒng),其中,模塊控制框架進一步包括系統(tǒng)資源定義語言,用于支持廠商提供的硬件資源的定制配置;以及系統(tǒng)資源定義文件,用于存儲廠商提供的專門用途的資源。19.如權(quán)利要求18所述的系統(tǒng),其中,系統(tǒng)資源定義語言用來定義用于相應(yīng)資源類型集的資源名稱集;以及用于相應(yīng)的資源類型集的參數(shù)名稱和類型集。20.如權(quán)利要求14所述的系統(tǒng),其中,多個廠商提供的模塊控制部件包括資源描述部件;驅(qū)動器部件;診斷部件;校準(zhǔn)部件;以及仿真部件。21.如權(quán)利要求20所述的系統(tǒng),其中,多個廠商提供的模塊控制部件進一步包括模式編譯器部件;以及特定于模塊的部件。22.如權(quán)利要求14所述的系統(tǒng),其中,多個廠商提供的模塊控制部件是動態(tài)鏈接庫格式的可執(zhí)行部件。23.如權(quán)利要求14所述的系統(tǒng),其中,多個廠商提供的模塊控制部件被提供于部件配置記錄中。24.如權(quán)利要求14所述的系統(tǒng),其中,用于配置模塊化測試系統(tǒng)的裝置包括用于初始化系統(tǒng)控制器的裝置;用于在系統(tǒng)控制器和所述至少一個站點控制器之間建立連接的裝置;用于將系統(tǒng)模塊配置文件加載到系統(tǒng)控制器的裝置;用于發(fā)現(xiàn)連接到該模塊化測試系統(tǒng)的硬件設(shè)備的裝置;用于將所發(fā)現(xiàn)的硬件信息存儲在系統(tǒng)控制器上的硬件清單文件中的裝置;用于相對于該硬件清單文件,驗證該系統(tǒng)模塊配置文件的裝置;用于驗證該廠商提供的控制軟件模塊的裝置;用于用該系統(tǒng)模塊配置文件填充該至少一個站點控制器的裝置;以及用于劃分該模塊化測試系統(tǒng)的裝置。25.如權(quán)利要求24所述的系統(tǒng),其中,用于驗證該廠商提供的控制軟件模塊的裝置包括用于加載在該系統(tǒng)模塊配置文件中指定的模塊動態(tài)鏈接庫的裝置;用于加載該模塊動態(tài)鏈接庫的裝置;以及用于核實能通過相應(yīng)的廠商提供的控制軟件模塊,創(chuàng)建在該系統(tǒng)模塊配置文件中聲明的資源的裝置。26.如權(quán)利要求24所述的系統(tǒng),其中,用于劃分該模塊化測試系統(tǒng)的裝置包括用于讀取套接字文件的裝置,其中,該套接字文件包括用戶指定的系統(tǒng)劃分信息;用于根據(jù)該套接字文件,配置系統(tǒng)模塊連接使能器的裝置;用于在每一站點控制器,加載相應(yīng)的模塊化動態(tài)鏈接庫的裝置;用于根據(jù)相應(yīng)的模塊動態(tài)鏈接庫,創(chuàng)建標(biāo)準(zhǔn)模塊控制接口的裝置;以及用于在每一站點控制器,初始化該標(biāo)準(zhǔn)模塊控制接口的裝置。全文摘要公開用于將測試模塊集成在模塊化測試系統(tǒng)中的方法。該方法包括通過控制器控制至少一個測試模塊及其相應(yīng)的被測設(shè)備(DUT);通過模塊控制框架,在廠商提供的測試模塊和該模塊化測試系統(tǒng)之間建立標(biāo)準(zhǔn)的模塊控制接口;安裝該廠商提供的測試模塊和相應(yīng)的廠商提供的控制軟件模塊,其中,該廠商提供的控制軟件模塊被組織成多個廠商提供的模塊控制部件;基于該模塊控制框架和多個廠商提供的模塊控制部件配置該模塊化測試系統(tǒng);以及使用該模塊控制框架,根據(jù)多個廠商提供的模塊控制部件,訪問該廠商提供的測試模塊。文檔編號G01R31/319GK1997909SQ20058001643公開日2007年7月11日申請日期2005年5月23日優(yōu)先權(quán)日2004年5月22日發(fā)明者安康·普拉馬尼克,馬克·埃爾斯頓,足立敏明申請人:株式會社愛德萬測試