高榮榮,張 葉,鄭佳晶,付純鶴
(中國電子科技集團公司第四十五研究所,北京100176)
隨著芯片集成度和工藝復雜性的提高,對于半導體代工廠(FAB)來說,生產設備的性能直接影響到成本和利潤,因此生產設備性能提升一直是半導體代工廠最為關注的問題之一[1]。對于生產線上的設備而言,不僅要滿足復雜工藝的適應性問題,還需不斷提高設備的生產效率和穩(wěn)定性。這些因素對設備軟件的流程控制提出了更高的挑戰(zhàn)和要求。
半導體設備軟件的功能是指揮設備各個硬件協同工作,使其按照工藝要求穩(wěn)定運行。以半導體設備為例,為降低各模塊之間的耦合度,將軟件分為流程調度層和設備分控層。流程調度層主要負責業(yè)務流程的調度,即指揮各個分控層在正確的時間內執(zhí)行正確的動作;設備分控層主要是控制硬件執(zhí)行相應的動作。
流程控制時,常用多線程并行方式,充分利用計算機系統資源,從而加快系統工作效率[2]。
半導體工藝過程中,將使用同一工藝參數的晶圓處理定義為一批。將批處理晶圓的數量定義為批大小。流程調度分為批調度和批隊列調度。批隊列調度是以批為單位,調度批的啟動和結束;批調度是以晶圓為單位,調度各個環(huán)節(jié)的晶圓處理。晶圓處理過程包括加載晶圓、工藝處理、卸載晶圓/交換晶圓。晶圓的加載、交換、卸載動作異步執(zhí)行,在設備分控層實現,通過事件觸發(fā)的方式與批流程進行交互,批處理流程如圖1所示。
圖1 批處理流程圖
批隊列的啟停由界面觸發(fā),與隊列中批的個數無關,即隊列為空時,仍可啟動批隊列。批隊列啟動后,若隊列不為空,則隊列中的首批被啟動,批隊列調度流程如圖2所示。
圖2 批啟動流程圖
定義多個大小為2的批,并啟動批隊列,正常情況下,批隊列中的批按順序執(zhí)行,第一批的第一片晶圓被加載到工位,第二片晶圓及其它批的晶圓被交換到工位,每個晶圓在工位均需做工藝處理。出現的偶發(fā)異?,F象為,第一批的第一片晶圓正常執(zhí)行,第二片晶圓只被傳輸,未被工藝處理。查看異常日志,發(fā)現異常批的加載晶圓動作執(zhí)行了2次,交換晶圓動作執(zhí)行了1次,卸載晶圓執(zhí)行了1次。
在批生產過程中,晶圓傳輸的動作執(zhí)行結果通過事件WaferStateEvenet與批流程進行交互,事件WaferStateEvenet為自動觸發(fā)機制(AutoResetEvent)。事件的信號只允許單一狀態(tài)改變,獨占訪問,即使多線程設置為并行,每次也只能觸發(fā)1次待處理(WaitOne)信號。
異常流程中,批啟動的線程被啟動了2次,即一個批對象被線程1和線程2同時控制。根據日志分析,發(fā)現批的首片晶圓加載動作執(zhí)行了2次,則說明事件待處理信號(WaitOne)被執(zhí)行了2次,首片晶圓加載晶圓操作執(zhí)行完成后,事件被設置(Set),由于資源搶占的原因,只有線程1的待處理信號(WaitOne)被觸發(fā),線程2的待處理信號(WaitOne)繼續(xù)等待。
晶圓進入工藝處理階段,處理完成后,進入交換晶圓操作,線程1的待處理信號(WaitOne)被執(zhí)行。交換晶圓執(zhí)行完成后,首片晶圓被卸載,第二片晶圓被加載,事件被設置(Set),被線程2的待處理信號(WaitOne)搶占資源,線程2執(zhí)行首片晶圓加載完成后的邏輯,由于此時首片晶圓的狀態(tài)為已處理,則線程2執(zhí)行卸載晶圓操作,線程2的事件待處理信號(WaitOne)被執(zhí)行。
卸載晶圓操作將批處理的第二片晶圓從工件臺上卸載,執(zhí)行完成后,事件被設置(Set),被線程1的待處理信號(WaitOne)搶占到資源,進入交換晶圓結束的后續(xù)邏輯,線程1根據第二片(批的最后一片)晶圓狀態(tài)判斷該晶圓工藝結束且被卸載,進入批結束狀態(tài)(Complete),線程1結束,批對象被釋放。
通過以上分析,發(fā)現該批只有首片晶圓被處理,第二片晶圓被加載,但是未被工藝處理,批處理屬于異常結束。
啟動批處理線程的代碼如下所示:因是線程啟動,標志位IsCurrentLotStart被置為true后,被外部置為false,循環(huán)檢測時,發(fā)現批滿足啟動條件而未啟動,再次啟動批處理線程。
批處理線程由批隊列管理,批隊列的線程啟動代碼如下:
批隊列線程啟動成功分兩步,第一步是開辟ScanJobTask運行空間,第二步是啟動線程,兩步執(zhí)行完成后,ScanJobTask開始工作,即開始循環(huán)檢測批狀態(tài),并啟動批。C#代碼的Thread.Start內部執(zhí)行完線程啟動功能后,還需置線程狀態(tài),需要消耗時間。若置線程狀態(tài)的時間大于ScanJobTask開辟運行空間的時間,則ScanJobTask啟動批在先,隊列置concurrentQueue[0]狀態(tài)在后。即批處理線程啟動后,標志位狀態(tài)IsCurrentLotStart被隊列置為false,下一次循環(huán)時,根據標志位狀態(tài)判斷該批未啟動,對批處理進行了第二次啟動。
由于代碼執(zhí)行過程中的運行時間跟當前PC機的內存占用率有關,在特定的時間內,會出現線程啟動時,線程啟動時間開銷大于ScanJobTask開始循環(huán)的時間,所以批異常為偶發(fā)現象。
從批線程標志位著手,解決批線程重復啟動的根本原因。調整批隊列線程啟動順序,先置狀態(tài),后創(chuàng)建線程,可避免因時間差原因而導致批異常,代碼如下所示:
半導體設備軟件中,經常將復雜的流程進行解耦,用不同的線程執(zhí)行不同的控制流程。這種多線程并行的方式,減少了CPU周期的浪費,提高了應用程序的執(zhí)行效率,從軟件層面提高了設備的性能和產率。但是在使用多線程時,要考慮線程開銷問題,將線程狀態(tài)標志位前置,避免時間差問題引起時序錯亂,而導致程序運行異常。