线程耗时对程序时序的影响分析
2022-10-08高荣荣郑佳晶付纯鹤
高荣荣,张 叶,郑佳晶,付纯鹤
(中国电子科技集团公司第四十五研究所,北京100176)
随着芯片集成度和工艺复杂性的提高,对于半导体代工厂(FAB)来说,生产设备的性能直接影响到成本和利润,因此生产设备性能提升一直是半导体代工厂最为关注的问题之一[1]。对于生产线上的设备而言,不仅要满足复杂工艺的适应性问题,还需不断提高设备的生产效率和稳定性。这些因素对设备软件的流程控制提出了更高的挑战和要求。
1 软件方案设计
1.1 软件介绍
半导体设备软件的功能是指挥设备各个硬件协同工作,使其按照工艺要求稳定运行。以半导体设备为例,为降低各模块之间的耦合度,将软件分为流程调度层和设备分控层。流程调度层主要负责业务流程的调度,即指挥各个分控层在正确的时间内执行正确的动作;设备分控层主要是控制硬件执行相应的动作。
流程控制时,常用多线程并行方式,充分利用计算机系统资源,从而加快系统工作效率[2]。
1.2 流程调度层软件设计
半导体工艺过程中,将使用同一工艺参数的晶圆处理定义为一批。将批处理晶圆的数量定义为批大小。流程调度分为批调度和批队列调度。批队列调度是以批为单位,调度批的启动和结束;批调度是以晶圆为单位,调度各个环节的晶圆处理。晶圆处理过程包括加载晶圆、工艺处理、卸载晶圆/交换晶圆。晶圆的加载、交换、卸载动作异步执行,在设备分控层实现,通过事件触发的方式与批流程进行交互,批处理流程如图1所示。
图1 批处理流程图
批队列的启停由界面触发,与队列中批的个数无关,即队列为空时,仍可启动批队列。批队列启动后,若队列不为空,则队列中的首批被启动,批队列调度流程如图2所示。
图2 批启动流程图
2 异常现象及分析
2.1 异常场景
定义多个大小为2的批,并启动批队列,正常情况下,批队列中的批按顺序执行,第一批的第一片晶圆被加载到工位,第二片晶圆及其它批的晶圆被交换到工位,每个晶圆在工位均需做工艺处理。出现的偶发异常现象为,第一批的第一片晶圆正常执行,第二片晶圆只被传输,未被工艺处理。查看异常日志,发现异常批的加载晶圆动作执行了2次,交换晶圆动作执行了1次,卸载晶圆执行了1次。
2.2 异常分析
在批生产过程中,晶圆传输的动作执行结果通过事件WaferStateEvenet与批流程进行交互,事件WaferStateEvenet为自动触发机制(AutoResetEvent)。事件的信号只允许单一状态改变,独占访问,即使多线程设置为并行,每次也只能触发1次待处理(WaitOne)信号。
异常流程中,批启动的线程被启动了2次,即一个批对象被线程1和线程2同时控制。根据日志分析,发现批的首片晶圆加载动作执行了2次,则说明事件待处理信号(WaitOne)被执行了2次,首片晶圆加载晶圆操作执行完成后,事件被设置(Set),由于资源抢占的原因,只有线程1的待处理信号(WaitOne)被触发,线程2的待处理信号(WaitOne)继续等待。
晶圆进入工艺处理阶段,处理完成后,进入交换晶圆操作,线程1的待处理信号(WaitOne)被执行。交换晶圆执行完成后,首片晶圆被卸载,第二片晶圆被加载,事件被设置(Set),被线程2的待处理信号(WaitOne)抢占资源,线程2执行首片晶圆加载完成后的逻辑,由于此时首片晶圆的状态为已处理,则线程2执行卸载晶圆操作,线程2的事件待处理信号(WaitOne)被执行。
卸载晶圆操作将批处理的第二片晶圆从工件台上卸载,执行完成后,事件被设置(Set),被线程1的待处理信号(WaitOne)抢占到资源,进入交换晶圆结束的后续逻辑,线程1根据第二片(批的最后一片)晶圆状态判断该晶圆工艺结束且被卸载,进入批结束状态(Complete),线程1结束,批对象被释放。
通过以上分析,发现该批只有首片晶圆被处理,第二片晶圆被加载,但是未被工艺处理,批处理属于异常结束。
2.3 因果验证
启动批处理线程的代码如下所示:因是线程启动,标志位IsCurrentLotStart被置为true后,被外部置为false,循环检测时,发现批满足启动条件而未启动,再次启动批处理线程。
批处理线程由批队列管理,批队列的线程启动代码如下:
批队列线程启动成功分两步,第一步是开辟ScanJobTask运行空间,第二步是启动线程,两步执行完成后,ScanJobTask开始工作,即开始循环检测批状态,并启动批。C#代码的Thread.Start内部执行完线程启动功能后,还需置线程状态,需要消耗时间。若置线程状态的时间大于ScanJobTask开辟运行空间的时间,则ScanJobTask启动批在先,队列置concurrentQueue[0]状态在后。即批处理线程启动后,标志位状态IsCurrentLotStart被队列置为false,下一次循环时,根据标志位状态判断该批未启动,对批处理进行了第二次启动。
由于代码执行过程中的运行时间跟当前PC机的内存占用率有关,在特定的时间内,会出现线程启动时,线程启动时间开销大于ScanJobTask开始循环的时间,所以批异常为偶发现象。
2.4 解除异常
从批线程标志位着手,解决批线程重复启动的根本原因。调整批队列线程启动顺序,先置状态,后创建线程,可避免因时间差原因而导致批异常,代码如下所示:
3 结束语
半导体设备软件中,经常将复杂的流程进行解耦,用不同的线程执行不同的控制流程。这种多线程并行的方式,减少了CPU周期的浪费,提高了应用程序的执行效率,从软件层面提高了设备的性能和产率。但是在使用多线程时,要考虑线程开销问题,将线程状态标志位前置,避免时间差问题引起时序错乱,而导致程序运行异常。