自動(dòng)實(shí)現(xiàn)半導(dǎo)體器件系統(tǒng)強(qiáng)化測(cè)試的方法
檢驗(yàn)芯片的各項(xiàng)功能需要編寫(xiě)診斷軟件,目的是確保器件的各項(xiàng)功能按要求工作,但是無(wú)論各項(xiàng)測(cè)試有多么詳盡,它都無(wú)法找出大部分系統(tǒng)層次的問(wèn)題。因此,要利用系統(tǒng)級(jí)強(qiáng)化測(cè)試(stress testing)來(lái)使多種功能以高強(qiáng)度和隨機(jī)的方式共同執(zhí)行,從而迫使這些設(shè)計(jì)問(wèn)題浮出表面。本文將探討用于檢驗(yàn)半導(dǎo)體器件設(shè)計(jì)的系統(tǒng)強(qiáng)化測(cè)試方法。
強(qiáng)化測(cè)試
強(qiáng)化測(cè)試是指將產(chǎn)品置于比實(shí)際正常應(yīng)用苛刻得多的條件下使用,其目的是通過(guò)各種方式對(duì)設(shè)備進(jìn)行考驗(yàn),迅速發(fā)現(xiàn)其設(shè)計(jì)缺陷。例如,對(duì)于一件機(jī)械產(chǎn)品,可能讓它面對(duì)惡劣的環(huán)境條件,如高壓、高溫和震動(dòng)。如果該產(chǎn)品能在這樣的條件下成功經(jīng)受一個(gè)月的考驗(yàn),那么在正常使用條件下,它應(yīng)該能工作長(zhǎng)得多的時(shí)間。
同樣的概念也適用于芯片的設(shè)計(jì)。此時(shí),強(qiáng)化測(cè)試的表現(xiàn)形式是執(zhí)行診斷軟件,其目的是使大量的芯片功能同時(shí)、連續(xù)、隨機(jī)、密集地工作,其程度遠(yuǎn)遠(yuǎn)超過(guò)芯片正常使用時(shí)的狀況。這些測(cè)試通常連續(xù)運(yùn)行,大多數(shù)時(shí)候無(wú)人照管,夜間和周末也不停止。通過(guò)這些測(cè)試,可以在產(chǎn)品發(fā)貨之前迫使隱藏的系統(tǒng)問(wèn)題盡快地暴露出來(lái)。
為什么強(qiáng)化測(cè)試對(duì)半導(dǎo)體設(shè)計(jì)如此重要呢?為了解釋這一問(wèn)題,假設(shè)一個(gè)半導(dǎo)體器件常常為了不同用途而應(yīng)用在各種電子系統(tǒng)之中,因此,這些電子產(chǎn)品將被幾千甚至幾百萬(wàn)用戶(hù)使用,每個(gè)用戶(hù)使用產(chǎn)品的方式各不相同。在如此大量的使用中,當(dāng)芯片上的功能和事件出現(xiàn)某種在器件測(cè)試過(guò)程中從未遇到過(guò)的順序或組合時(shí),可能就會(huì)發(fā)生問(wèn)題。這些問(wèn)題通常表現(xiàn)為:不時(shí)被鎖住、數(shù)據(jù)出錯(cuò)或其它難以復(fù)現(xiàn)的異常現(xiàn)象。如果這些問(wèn)題出現(xiàn)太多(或者在執(zhí)行重要任務(wù)的產(chǎn)品中僅僅偶然出現(xiàn)),用戶(hù)將會(huì)認(rèn)為這些產(chǎn)品是不可靠甚至不穩(wěn)定的。
強(qiáng)化測(cè)試概念的引出
最初嘗試創(chuàng)建系統(tǒng)強(qiáng)化測(cè)試時(shí),方法是研究和編寫(xiě)直接激活盡可能多的芯片功能并使它同時(shí)執(zhí)行軟件,使用定時(shí)器中斷并讓它執(zhí)行隨機(jī)測(cè)試,同時(shí)主程序不停地復(fù)制數(shù)據(jù),并隨機(jī)地不時(shí)啟動(dòng)其它芯片操作。當(dāng)想出向芯片內(nèi)引入更多無(wú)序和隨機(jī)事件的招數(shù)時(shí),便將它添加到軟件中去。很快就可以發(fā)現(xiàn),雖然陸續(xù)發(fā)現(xiàn)了許多問(wèn)題,但它大多發(fā)生在自己編寫(xiě)的軟件上。
由于不時(shí)使用同一塊存儲(chǔ)區(qū)域或外設(shè)資源,測(cè)試軟件中的測(cè)試功能相互干擾。例如,當(dāng)一個(gè)測(cè)試正在使用某一通用I/O時(shí),另一個(gè)隨機(jī)啟動(dòng)的測(cè)試卻更改了它的狀態(tài)。由此不時(shí)導(dǎo)致的故障耗用了大量的調(diào)試時(shí)間。
第二次,嘗試開(kāi)發(fā)組織得非常好的強(qiáng)化測(cè)試軟件。它安排隨機(jī)選擇的測(cè)試功能輪流運(yùn)行,在許多地方將中斷鎖住,以防止軟件沖突和保證其它安全措施。這種謹(jǐn)慎的編程使得測(cè)試非常穩(wěn)定,但與直接測(cè)試相比,同樣不能有效地發(fā)現(xiàn)芯片的問(wèn)題,因?yàn)樗前凑找环N很大程度上可預(yù)期的順序方式來(lái)執(zhí)行測(cè)試。畢竟測(cè)試的目的是為了測(cè)試半導(dǎo)體器件的設(shè)計(jì),而不是為了獲得穩(wěn)定的測(cè)試軟件。
在理論上希望避免這兩種極端情況。測(cè)試的根本目的是為了暴露芯片中系統(tǒng)級(jí)的相互作用問(wèn)題,為了達(dá)到這個(gè)目的,就必須將操作搞亂,使得許多不同事件以隨機(jī)方式發(fā)生。其中的訣竅是,以一種有組織的方式來(lái)保持測(cè)試的無(wú)序特點(diǎn),從而獲得可靠的測(cè)試軟件,并可進(jìn)行擴(kuò)展,還可以盡可能地幫助調(diào)試。要達(dá)到這些目的,需要仔細(xì)進(jìn)行考慮和規(guī)劃。這就是構(gòu)建一個(gè)強(qiáng)化測(cè)試框架的思路。
測(cè)試框架
本文介紹一個(gè)軟件框架(framework)的設(shè)計(jì),讀者可以使用這個(gè)框架來(lái)為半導(dǎo)體器件構(gòu)建一個(gè)可擴(kuò)展的強(qiáng)化測(cè)試。雖然本文沒(méi)有提供完整的框架,但這些內(nèi)容應(yīng)當(dāng)能夠激發(fā)讀者的靈感來(lái)幫助構(gòu)建自己的強(qiáng)化測(cè)試框架。
軟件框架通過(guò)提供一個(gè)公共操作引擎和環(huán)境來(lái)簡(jiǎn)化特定類(lèi)型的應(yīng)用開(kāi)發(fā)工作,具體的應(yīng)用經(jīng)由一個(gè)定義好的接口來(lái)與框架連接。強(qiáng)化測(cè)試框架也采用了同樣的思路,它提供一個(gè)軟件引擎來(lái)處理強(qiáng)化測(cè)試的基本操作和公共功能。
強(qiáng)化測(cè)試框架本身不測(cè)試任何芯片功能,但它允許嵌入測(cè)試事件模塊。測(cè)試事件模塊是實(shí)現(xiàn)一項(xiàng)具體的半導(dǎo)體器件測(cè)試或事件的函數(shù),通常要使用一組隨機(jī)產(chǎn)生的測(cè)試參數(shù)。執(zhí)行強(qiáng)化測(cè)試時(shí),框架引擎將隨機(jī)選擇并以不同方式來(lái)啟動(dòng)這些測(cè)試事件模塊。
這個(gè)框架還為測(cè)試事件模塊提供了基本服務(wù)供其使用,包括保留系統(tǒng)資源的功能、選擇隨機(jī)測(cè)試參數(shù)的功能和數(shù)據(jù)記錄功能。大部分預(yù)先規(guī)劃和設(shè)計(jì)都位于框架本身內(nèi)部,因?yàn)榭蚣芴幚韽?qiáng)化測(cè)試復(fù)雜和“混亂無(wú)序”的一面。然后,根據(jù)需要增加單個(gè)測(cè)試事件模塊,擴(kuò)展強(qiáng)化測(cè)試。由于框架負(fù)責(zé)處理公共的強(qiáng)化測(cè)試軟件部分,測(cè)試事件模塊的開(kāi)發(fā)人員可以專(zhuān)注于為目標(biāo)芯片功能編寫(xiě)優(yōu)秀的測(cè)試程序。圖1為強(qiáng)化測(cè)試框架各個(gè)組成部分的高層次示意圖。
隨機(jī)測(cè)試池是強(qiáng)化測(cè)試的核心部分,實(shí)際的半導(dǎo)體器件測(cè)試就位于其中。它是為了對(duì)芯片的某項(xiàng)具體功能啟動(dòng)事件和(或)執(zhí)行測(cè)試而編寫(xiě)的測(cè)試事件模塊的集合。開(kāi)發(fā)新的測(cè)試事件模塊時(shí),可將它添加到隨機(jī)測(cè)試池中,以便在下一次運(yùn)行強(qiáng)化測(cè)試時(shí)將其包含在內(nèi)。本文后面還將更詳細(xì)地介紹測(cè)試事件模塊,因?yàn)檫@是為芯片開(kāi)發(fā)并由框架啟動(dòng)和支持的實(shí)際半導(dǎo)體器件測(cè)試。
執(zhí)行過(guò)程中,強(qiáng)化測(cè)試引擎隨機(jī)地從池中選擇和運(yùn)行測(cè)試事件模塊。為了使測(cè)試變得更加雜亂無(wú)序(從而對(duì)器件設(shè)計(jì)施加更大的強(qiáng)化測(cè)試),框架采用異步時(shí)隙來(lái)按照任意時(shí)間間隔隨機(jī)選擇和啟動(dòng)測(cè)試。
“時(shí)隙”使用一個(gè)硬件定時(shí)器來(lái)實(shí)現(xiàn),器件或測(cè)試板卡上的多個(gè)定時(shí)器可以擁有各自的時(shí)隙。框架為每個(gè)時(shí)隙定時(shí)器選擇隨機(jī)的時(shí)間間隔,當(dāng)時(shí)隙截止時(shí),引擎中斷當(dāng)前的測(cè)試模塊,定時(shí)器的中斷處理程序?qū)⑦x擇另一個(gè)模塊來(lái)執(zhí)行,同時(shí)引擎為下一個(gè)時(shí)隙操作選擇另一個(gè)隨機(jī)的時(shí)間間隔。這樣,測(cè)試將以一種交織的風(fēng)格執(zhí)行,引發(fā)各種各樣的執(zhí)行方式,同時(shí)還實(shí)現(xiàn)了執(zhí)行的并行性,這一點(diǎn)將在后面看到。
選擇和啟動(dòng)一項(xiàng)測(cè)試的框架代碼很簡(jiǎn)單,因?yàn)闇y(cè)試事件模塊只不過(guò)是一個(gè)C語(yǔ)言函數(shù)而已。列表1是啟動(dòng)程序的一段代碼。一般而言,框架保持有一組C函數(shù),這些函數(shù)即為測(cè)試模塊,讀者可以選擇任意一個(gè)索引來(lái)查看函數(shù)并加以執(zhí)行。
(列表1)
測(cè)試模塊
如前所述,測(cè)試事件模塊是一個(gè)函數(shù),它針對(duì)半導(dǎo)體器件的某個(gè)具體特性執(zhí)行一個(gè)動(dòng)作或一次檢驗(yàn)。雖然框架將測(cè)試模塊作為一個(gè)C函數(shù)來(lái)激活,但如果需要,模塊也可以調(diào)用匯編級(jí)代碼。框架的編寫(xiě)方式使得設(shè)計(jì)人員可以開(kāi)發(fā)新的模塊并添加到測(cè)試池中,供強(qiáng)化測(cè)試期間框架隨機(jī)選擇。后面框架實(shí)例中的測(cè)試模塊是void C函數(shù),它不需要任何參數(shù)。在框架支持功能的幫助下,模塊本身可以啟動(dòng)測(cè)試并調(diào)用相應(yīng)的功能來(lái)記錄結(jié)果。
測(cè)試事件模塊共有三種類(lèi)型:
1. 純事件
2. 檢驗(yàn)測(cè)試
3. 延遲檢驗(yàn)測(cè)試
正如其名稱(chēng)所表明的那樣,純事件模塊啟動(dòng)一個(gè)系統(tǒng)事件后不做任何檢驗(yàn)工作,包括以某種方式改變系統(tǒng)或啟動(dòng)某項(xiàng)后臺(tái)功能。那么,啟動(dòng)一個(gè)事件而不執(zhí)行任何檢驗(yàn)有什么意義呢?為了解釋這個(gè)問(wèn)題,來(lái)考察一個(gè)測(cè)試事件模塊,它僅僅切換處理器高速緩存的當(dāng)前設(shè)置。每次框架隨機(jī)選擇這個(gè)模塊時(shí),高速緩存就從1切換到0或從0切換到1。這增加了一個(gè)變化因素,因?yàn)閷?duì)于運(yùn)行時(shí)需要用到這個(gè)高速緩存的測(cè)試模塊而言,它的值有時(shí)為1有時(shí)為0。
第二種測(cè)試事件模塊是檢驗(yàn)測(cè)試,它執(zhí)行一個(gè)動(dòng)作,并在測(cè)試模塊函數(shù)退出之前對(duì)這個(gè)動(dòng)作進(jìn)行檢驗(yàn)。例如,這種測(cè)試可以用任意數(shù)據(jù)來(lái)填充隨機(jī)選擇的存儲(chǔ)器區(qū)域,然后采用任意CPU讀寫(xiě)寬度來(lái)將這個(gè)區(qū)域復(fù)制到一個(gè)隨機(jī)的目的存儲(chǔ)器區(qū)域,再檢驗(yàn)其結(jié)果。
第三種測(cè)試模塊是延遲檢驗(yàn)測(cè)試,這是功能最強(qiáng)的測(cè)試,雖然通常只能用于可以對(duì)總線(xiàn)進(jìn)行控制的芯片功能(換句話(huà)說(shuō),運(yùn)行在CPU的后臺(tái))。這種測(cè)試模塊將啟動(dòng)一個(gè)測(cè)試然后退出,使得在原測(cè)試?yán)^續(xù)運(yùn)行時(shí),其它測(cè)試模塊可以執(zhí)行。在大多數(shù)情況下,測(cè)試的完成用一個(gè)中斷來(lái)表示。當(dāng)中斷發(fā)生時(shí),中斷處理程序?qū)z驗(yàn)測(cè)試的結(jié)果。
延遲檢驗(yàn)測(cè)試的例子如DMA (直接存儲(chǔ)器訪(fǎng)問(wèn))傳輸??梢跃帉?xiě)一個(gè)測(cè)試模塊來(lái)選擇隨機(jī)的源、目的存儲(chǔ)器區(qū)域和DMA通道。這個(gè)測(cè)試模塊可以用任意數(shù)值來(lái)填充源存儲(chǔ)器,并配置一個(gè)用來(lái)檢驗(yàn)測(cè)試結(jié)果的DMA結(jié)束中斷處理程序。這個(gè)中斷處理程序即為“延遲檢驗(yàn)測(cè)試”,它可訪(fǎng)問(wèn)包含有被啟動(dòng)測(cè)試的詳細(xì)信息的數(shù)據(jù)結(jié)構(gòu),在被調(diào)用時(shí),它還將檢驗(yàn)測(cè)試的結(jié)果。
測(cè)試框架實(shí)例
為了展示這些測(cè)試的強(qiáng)大功能,來(lái)考察一個(gè)簡(jiǎn)單的測(cè)試框架實(shí)例,它包含以下四個(gè)測(cè)試模塊。
1) 簡(jiǎn)單的基于CPU的存儲(chǔ)器復(fù)制(TE_CPU_COPY):
將隨機(jī)數(shù)據(jù)樣式填充到一個(gè)任意大小的隨機(jī)源地址存儲(chǔ)器塊中,然后使用一種隨機(jī)混合的讀寫(xiě)寬度來(lái)將數(shù)據(jù)樣式復(fù)制到任意選擇的目的地址。復(fù)制完成后,檢驗(yàn)?zāi)康膮^(qū)域中的數(shù)據(jù)是否包含了先前選擇的數(shù)據(jù)樣式。
2) DMA存儲(chǔ)器---存儲(chǔ)器復(fù)制(TE_DMA_M2M):
將任意數(shù)據(jù)樣式填充到隨機(jī)源地址的任意大小的存儲(chǔ)器塊中,然后任意選擇一個(gè)存儲(chǔ)器---存儲(chǔ)器DMA通道,編程為將源地址的數(shù)據(jù)樣式復(fù)制到隨機(jī)選擇的目的地址。當(dāng)DMA結(jié)束中斷發(fā)生時(shí),檢查兩個(gè)存儲(chǔ)器區(qū)域是否匹配。
3) DMA---外設(shè)(TE_DMA_M2P):
將任意數(shù)據(jù)樣式填充到隨機(jī)源地址的任意大小的存儲(chǔ)器塊中,然后任意選擇一個(gè)存儲(chǔ)器---存儲(chǔ)器DMA通道,編程為將數(shù)據(jù)樣式復(fù)制到特定外設(shè)的任意端口號(hào)中。當(dāng)DMA結(jié)束中斷發(fā)生時(shí),檢查外設(shè)的FIFO中是否包含了正確的數(shù)據(jù)(或者被發(fā)送到外設(shè))。
4) 高速緩存切換(TE_CACHE):
將高速緩存從1切換到0或從0切換到1并退出。這個(gè)測(cè)試模塊是一個(gè)純事件測(cè)試模塊,運(yùn)行時(shí)不執(zhí)行檢驗(yàn)操作。
假設(shè)框架有三個(gè)時(shí)隙定時(shí)器用來(lái)啟動(dòng)測(cè)試事件模塊,那么啟動(dòng)它的main( )例程位于時(shí)隙0,具體運(yùn)行時(shí)可能與列表2所示類(lèi)似。
(列表2)
運(yùn)行開(kāi)始時(shí)執(zhí)行存儲(chǔ)器復(fù)制測(cè)試。執(zhí)行過(guò)程中,時(shí)隙2定時(shí)器在復(fù)制中途定時(shí)截止。此時(shí),高速緩存測(cè)試事件模塊被啟動(dòng),它切換高速緩存的狀態(tài)并退出。復(fù)制測(cè)試在高速緩存處于新設(shè)置的狀況下繼續(xù)執(zhí)行。在測(cè)試完成之前,時(shí)隙1定時(shí)器又截止,此時(shí)一個(gè)DMA存儲(chǔ)器---端口測(cè)試模塊被啟動(dòng),它設(shè)置任意的DMA通道并退出?,F(xiàn)在,DMA已在后臺(tái)執(zhí)行,而原來(lái)的復(fù)制測(cè)試又重新運(yùn)行。隨后又發(fā)生一個(gè)時(shí)隙3定時(shí)器中斷,使用DMA通道5啟動(dòng)存儲(chǔ)器---存儲(chǔ)器傳輸并退出。這種安排還可以繼續(xù)下去,但已經(jīng)可以看到,通過(guò)這個(gè)測(cè)試,可以讓所有的DMA通道同時(shí)運(yùn)行,高速緩存隨機(jī)切換,而且CPU在測(cè)試過(guò)程中隨機(jī)訪(fǎng)問(wèn)不同的存儲(chǔ)器區(qū)域。
測(cè)試參數(shù)
測(cè)試事件模塊將使用一個(gè)或多個(gè)隨機(jī)選擇的測(cè)試參數(shù)來(lái)執(zhí)行測(cè)試操作。常見(jiàn)的測(cè)試參數(shù)如:源和目的存儲(chǔ)器地址、塊大小、數(shù)據(jù)樣式、讀寫(xiě)寬度(如8、16或32位)、DMA通道和UART端口。
雖然隨機(jī)地選擇測(cè)試事件函數(shù)看起來(lái)比較簡(jiǎn)單,但究竟應(yīng)當(dāng)如何選擇隨機(jī)測(cè)試參數(shù)值,同時(shí)確保這些值對(duì)系統(tǒng)有效,而且不與其它測(cè)試發(fā)生交疊從而導(dǎo)致干擾呢?例如,如果某個(gè)測(cè)試選擇一個(gè)隨機(jī)的存儲(chǔ)器地址和大小,需要知道(1)存儲(chǔ)器確實(shí)存在;(2)其它測(cè)試沒(méi)有選擇與這片存儲(chǔ)器交疊的存儲(chǔ)器區(qū)域(因?yàn)橐粋€(gè)測(cè)試有可能改寫(xiě)另一個(gè)測(cè)試的存儲(chǔ)器并導(dǎo)致故障)。另一個(gè)資源競(jìng)爭(zhēng)的例子是,兩個(gè)測(cè)試都隨機(jī)地選中同一個(gè)DMA通道來(lái)進(jìn)行數(shù)據(jù)傳輸。
框架提供的支持功能使測(cè)試模塊可以安全地選擇任意測(cè)試參數(shù)。為了幫助理解這一點(diǎn),這里舉一個(gè)最常用的測(cè)試參數(shù)的例子:隨機(jī)選擇的系統(tǒng)存儲(chǔ)器塊。隨機(jī)選擇的存儲(chǔ)器塊有一個(gè)起始地址值和一個(gè)大小值,它都是隨機(jī)數(shù)值。這個(gè)存儲(chǔ)器塊可以位于CPU地址空間的任何位置,包括在SRAM、PCMCIA或Flash存儲(chǔ)器中。
在列表3所示的例子中,memPool數(shù)組中填入了存儲(chǔ)器段的起始地址和大小,它位于系統(tǒng)的地址空間中,可供測(cè)試進(jìn)行隨機(jī)選擇。每個(gè)條目都有一個(gè)保留標(biāo)志(inUse項(xiàng))。為了選擇一個(gè)隨機(jī)存儲(chǔ)器塊,函數(shù)首先選擇一個(gè)隨機(jī)的指向存儲(chǔ)器段數(shù)組的索引。然后在這個(gè)段中選擇一個(gè)隨機(jī)的起始地址和大小。最大塊的大小值是存儲(chǔ)器段的結(jié)束地址減去所選的起始地址。一旦隨機(jī)塊的起始地址和大小選定了,整個(gè)存儲(chǔ)器段就通過(guò)設(shè)置保留標(biāo)志被標(biāo)記為保留。
列表3:隨機(jī)存儲(chǔ)器塊選擇
============================
typedef struct
{
uint32_t start_addr;
uint32_t size;
bool inUse;
} memSeg;
memSeg memPool[] =
{
/* start addr size inUse */
{ 0x10000000,0x00040000, 0},
{ 0x10040000,0x00040000, 0},
{ 0x10080000,0x00040000, 0},
{ 0x100c0000,0x00040000, 0},
{ 0x30000000,0x00040000, 0},
{ 0x30040000,0x00040000, 0},
{ 0x30080000,0x00040000, 0},
{ 0x300c0000,0x00040000, 0},
{ 0x30100000,0x00008000, 0},
{ 0x40004000,0x00004000, 0},
{ 0x40008000,0x00004000, 0},
{ 0x4000c000,0x00004000, 0},
{ 0xa0000000,0x00002000, 0},
{ 0xb0000000,0x00008000, 0},
{ 0xb0008000,0x00008000, 0},
{ 0xb0010000,0x00004000, 0}
};
int SelectAndReserveBlock(unsigned int *addr, unsigned int *size)
{
int retries=0; /* limit the number of times we try to get a segment */
int seg;
while(retries MAX_RETRY_COUNT)
{
/* Select a random memory segment (index into memPool array) */
seg = GetRandomNumber(sizeof(memPool)/sizeof(memSeg));
if (memPool[seg].inUse)
{
retries++;
continue;
}
/* reserve the segment */
memPool[seg].inUse = 1;
/* select random block in segment, and don't let it run past the end
of the segment. */
*addr = memPool[seg].start_addr + GetRandomNumber(memPool[seg].size);
max_size = memPool[seg].size - (*addr - memPool[seg].start_addr);
if (max_size > MAX_BLOCK_SIZE)
max_size = MAX_BLOCK_SIZE;
*size = GetRandomNumber(max_size);
break;
}
/* return the segment number so it can be used to free it later,
or return -1 if we gave up looking for a free segment */
return (retries >= MAX_RETRY_COUNT) ? -1 : seg;
}
void FreeMemorySegment(int seg)
{
memPool[seg].inUse = 0;
}
===============================================
這種方法的一個(gè)缺點(diǎn)是,使用存儲(chǔ)器段中的某個(gè)隨機(jī)存儲(chǔ)器塊時(shí),按照存儲(chǔ)器段數(shù)組中的定義方式,整個(gè)存儲(chǔ)器段都將被保留。如果所有存儲(chǔ)器段都被保留了,還有存儲(chǔ)器可用嗎?解決的辦法是將存儲(chǔ)器分為更小的段??赡芟M圆煌姆绞絹?lái)分割存儲(chǔ)器段,以便消除跨越數(shù)據(jù)寬度和類(lèi)型各不相同的多個(gè)存儲(chǔ)器器件來(lái)選擇存儲(chǔ)器塊的可能性。注意這些方案都比較簡(jiǎn)單,也可以加強(qiáng)它的功能,關(guān)鍵只是直接控制指示哪些存儲(chǔ)器區(qū)域可以使用。
管理其它資源的選擇和保留可能更加簡(jiǎn)單。例如,保留標(biāo)志數(shù)組可用來(lái)管理DMA通道,數(shù)組的索引代表通道。設(shè)計(jì)人員可以編寫(xiě)一個(gè)ReserveDmaChannel()函數(shù),它返回一個(gè)隨機(jī)DMA通道號(hào),這個(gè)通道號(hào)處于芯片上的DMA通道數(shù)目范圍之內(nèi),并且其保留標(biāo)志未被設(shè)置。然后,函數(shù)將設(shè)置保留標(biāo)志來(lái)保留這個(gè)通道。測(cè)試完成時(shí),可以調(diào)用FreeDmaChannel()來(lái)清除該標(biāo)志。
調(diào)試技巧
調(diào)試和分離與系統(tǒng)相互作用有關(guān)的問(wèn)題可能比較困難,在這個(gè)過(guò)程中可以通過(guò)設(shè)計(jì)強(qiáng)化測(cè)試框架來(lái)提供幫助。根據(jù)運(yùn)行是在芯片生產(chǎn)前的仿真環(huán)境下進(jìn)行,還是在一個(gè)安裝有實(shí)際芯片的板卡上進(jìn)行,所遇到的問(wèn)題將會(huì)有差異。
在仿真環(huán)境下運(yùn)行時(shí),速度是最大的問(wèn)題,仿真CPU的運(yùn)行速度要比實(shí)際器件慢得多。仿真環(huán)境的優(yōu)勢(shì)在于仿真工具可以輸出芯片設(shè)計(jì)內(nèi)部信號(hào)的詳細(xì)記錄,這將簡(jiǎn)化調(diào)試工作,但它也有一個(gè)很大的缺點(diǎn),即問(wèn)題復(fù)現(xiàn)困難。如果為了暴露問(wèn)題要花費(fèi)太長(zhǎng)的時(shí)間來(lái)運(yùn)行強(qiáng)化測(cè)試,這將是難以接受的。
解決的辦法是將強(qiáng)化測(cè)試作為許多較短(例如30分鐘)的測(cè)試來(lái)運(yùn)行,這可以通過(guò)用一組測(cè)試事件模塊來(lái)創(chuàng)建不同的測(cè)試來(lái)實(shí)現(xiàn)。此外,還應(yīng)該給每個(gè)測(cè)試分配一個(gè)專(zhuān)門(mén)的隨機(jī)數(shù)種子(seed),以便使用這個(gè)種子的其它測(cè)試每次運(yùn)行時(shí),都能重新產(chǎn)生準(zhǔn)確的測(cè)試事件和測(cè)試參數(shù)序列。
好的運(yùn)行腳本可以隨機(jī)產(chǎn)生種子值,然后創(chuàng)建一個(gè)測(cè)試并加以運(yùn)行。種子值應(yīng)當(dāng)與運(yùn)行結(jié)果一起記錄下來(lái)。為了復(fù)現(xiàn)一個(gè)故障,可以用這個(gè)種子重新創(chuàng)建測(cè)試(因?yàn)榭赡懿幌MA羲械目蛇\(yùn)行測(cè)試程序,其數(shù)量可能達(dá)到幾千個(gè)),然后在短時(shí)間內(nèi)復(fù)現(xiàn)這個(gè)問(wèn)題。
在實(shí)際的芯片上可以運(yùn)行更多強(qiáng)化測(cè)試,因?yàn)槠鋱?zhí)行速度要快得多。但在理論上,它可能還是要花費(fèi)同樣長(zhǎng)的時(shí)間,因?yàn)楸容^常見(jiàn)的問(wèn)題應(yīng)該在芯片生產(chǎn)前的強(qiáng)化測(cè)試中就已經(jīng)暴露出來(lái)了。在這里,問(wèn)題的復(fù)現(xiàn)同樣是一個(gè)很大的困難,讀者可以嘗試在芯片生產(chǎn)前的測(cè)試中應(yīng)用所介紹的技術(shù),但它可能不會(huì)同樣有效,因?yàn)閷?shí)際系統(tǒng)可能不如在仿真環(huán)境下那樣確定。換句話(huà)說(shuō),兩個(gè)采用同一隨機(jī)測(cè)試種子運(yùn)行的測(cè)試可能不會(huì)每次都獲得精確相同的運(yùn)行序列。另外,此時(shí)也無(wú)法記錄內(nèi)部信號(hào)的行為,因此應(yīng)該依靠一些技術(shù),如將檢測(cè)點(diǎn)的信息記錄到存儲(chǔ)器或高速端口、插入各種邏輯分析儀觸發(fā)事件,以及采用其它技術(shù)來(lái)幫助深入跟蹤問(wèn)題的詳細(xì)情況。
在實(shí)際芯片上調(diào)試系統(tǒng)問(wèn)題時(shí),沒(méi)有什么通用的方法。設(shè)計(jì)人員應(yīng)當(dāng)周密考慮,并象即將遇到難以捉摸的故障一樣來(lái)進(jìn)行計(jì)劃,編寫(xiě)程序代碼,為分析問(wèn)題提供盡可能多的線(xiàn)索。
此外,測(cè)試框架還應(yīng)該包含這樣一種能力,它創(chuàng)建的測(cè)試運(yùn)行程序能將某些測(cè)試模塊排除在外,從而使強(qiáng)化測(cè)試無(wú)需在已知的問(wèn)題上停止下來(lái)而得以繼續(xù)運(yùn)行。另一方面,將其余功能排除在外也將使設(shè)計(jì)人員能夠?qū)δ承┨囟ǖ男酒δ苓M(jìn)行重點(diǎn)測(cè)試。
框架需要組織良好的軟件代碼來(lái)生成種子、創(chuàng)建測(cè)試、運(yùn)行、存儲(chǔ)測(cè)試記錄和后續(xù)處理,并向設(shè)計(jì)人員報(bào)告所遇到的問(wèn)題。這個(gè)過(guò)程應(yīng)當(dāng)是完全自動(dòng)化的,這樣就可長(zhǎng)時(shí)間運(yùn)行測(cè)試而無(wú)需人員維護(hù)。
記錄測(cè)試過(guò)程
強(qiáng)化測(cè)試框架最少應(yīng)該記錄哪個(gè)測(cè)試模塊在運(yùn)行,以及發(fā)生的所有故障。完善的記錄將包括更多的信息,如選擇的隨機(jī)參數(shù),各個(gè)測(cè)試事件是何時(shí)啟動(dòng)、退出和檢驗(yàn) (針對(duì)延遲檢驗(yàn)函數(shù))的。這樣,設(shè)計(jì)人員就可以了解各個(gè)測(cè)試是如何相互聯(lián)系地運(yùn)行的。后續(xù)處理軟件可以生成一些有用的報(bào)告,以顯示測(cè)試的覆蓋范圍。
開(kāi)發(fā)記錄功能時(shí),應(yīng)使強(qiáng)化測(cè)試軟件盡可能簡(jiǎn)單方便地記錄事件。在仿真環(huán)境下,可編寫(xiě)HDL代碼來(lái)提供一個(gè)記錄外設(shè),這樣設(shè)計(jì)人員只需寫(xiě)下一個(gè)數(shù)值記號(hào), HDL就將產(chǎn)生完整的記錄信息。在實(shí)際芯片上,可以將字節(jié)記號(hào)和數(shù)值發(fā)送到存儲(chǔ)器板卡或輸出到調(diào)試端口。關(guān)鍵之處是要避免記錄操作本身過(guò)多占用寶貴的測(cè)試運(yùn)行時(shí)間,并導(dǎo)致過(guò)度干擾。通過(guò)后續(xù)處理軟件,可以使記錄更清楚、更美觀。
本文小結(jié)
由于框架將涉及對(duì)中斷處理程序所讀寫(xiě)的共享數(shù)據(jù)結(jié)構(gòu)的使用,因此訪(fǎng)問(wèn)這些數(shù)據(jù)結(jié)構(gòu)時(shí),應(yīng)在軟件代碼中對(duì)重要的存儲(chǔ)器段進(jìn)行保護(hù)。例如,如果一個(gè)測(cè)試事件剛剛讀取了一個(gè)存儲(chǔ)器段的inUse標(biāo)志并發(fā)現(xiàn)它未被使用,但在它將該存儲(chǔ)器段設(shè)置為保留之前,又發(fā)生了一個(gè)時(shí)隙中斷,中斷啟動(dòng)的測(cè)試模塊結(jié)束時(shí),可能將同一存儲(chǔ)器段設(shè)置為保留,因?yàn)榇藭r(shí)該存儲(chǔ)器段仍表現(xiàn)為未被使用。在這種類(lèi)似的重要全局?jǐn)?shù)據(jù)訪(fǎng)問(wèn)期間,應(yīng)該將時(shí)隙定時(shí)器中斷予以禁止。
設(shè)計(jì)一個(gè)強(qiáng)化測(cè)試框架時(shí),有許多擴(kuò)展可能性。如可以調(diào)節(jié)測(cè)試事件模塊的概率權(quán)重,或調(diào)整測(cè)試參數(shù)以便對(duì)強(qiáng)化測(cè)試進(jìn)行精密調(diào)節(jié)。舉個(gè)例子,高速緩存切換事件可能是100個(gè)測(cè)試事件模塊之一,但測(cè)試時(shí)可能希望它運(yùn)行比1%多得多的時(shí)間,此時(shí)便可通過(guò)調(diào)整測(cè)試參數(shù)來(lái)實(shí)現(xiàn)。規(guī)劃、設(shè)計(jì)和實(shí)現(xiàn)性能優(yōu)良可靠的半導(dǎo)體器件強(qiáng)化測(cè)試框架是一項(xiàng)重大投入,雖然需要花費(fèi)大量的時(shí)間,但它可以幫助提高產(chǎn)品的質(zhì)量。
作者: Steve Babin
IBM公司負(fù)責(zé)開(kāi)發(fā)靈巧電話(huà)軟件的深入計(jì)算事業(yè)部擔(dān)任顧問(wèn)職務(wù)。在嵌入式系統(tǒng)領(lǐng)域擁有16年以上的工作經(jīng)驗(yàn),Steve
Babin持有路易斯安那州立大學(xué)的電子工程學(xué)士學(xué)位。
Email: [email protected]
評(píng)論