1. 课程导入与全景认知
半导体设备软件与普通工业控制软件最大的差别,在于它同时被三股力量约束:物理过程的不可见性、晶圆与设备的昂贵性、客户与产线的严苛节拍。一片300 mm晶圆在先进制程中可能价值数千至上万美元,一台刻蚀或薄膜设备停机一小时造成的损失往往以万元计。因此,设备软件不能等到真机上"跑起来再看",而必须在软件层面先建立可复现、可观测、可回归的验证体系。这正是本课程要解决的工程问题。
1.1 半导体设备软件的特殊性
设备软件通常运行在设备前端控制层,向上对接工厂主机(Host)的SECS/GEM或EDA接口,向下驱动运动控制卡、RF电源、质量流量控制器(MFC)、真空规、机械手与阀门。它的特殊性体现在四个方面。
第一,强实时与强时序。以EFEM机械手取放片为例,从LoadPort开门、映射晶圆、机械手伸入、真空吸附确认到缩回,动作链上每一步都有毫秒级超时窗口。若软件在"吸附确认"信号到来前就下发缩回指令,晶圆可能掉落。这类缺陷在纯逻辑测试中很难暴露,必须结合时序仿真。
第二,状态机密集。一台设备同时存在多个并行状态机:LoadPort的"有片/无片/映射中/异常"、TM的"空闲/取片中/放片中/回原点"、PM的"待机/工艺中/清洗中/故障"。状态组合爆炸,人工穷举不现实。
第三,硬件依赖与接口异构。同一套上层逻辑要适配不同厂商的机械手、阀门和传感器,接口协议可能是EtherCAT、Modbus TCP、串口或私有SDK。软件必须通过抽象层隔离硬件差异。
第四,可追溯性要求。产线要求每一片晶圆在哪个腔室、什么配方、什么时间、由哪条指令触发,都能回溯。日志与事件流不是可选项,而是软件架构的一部分。
1.2 仿真、自动测试与验证的工程边界
三者常被混用,但在工程上边界清晰。
仿真(Simulation)解决"没有硬件也能跑"的问题。它用软件模型替代真实设备:用状态机模拟机械手动作,用延时函数模拟阀门开闭,用可配置的传感器模型模拟真空、温度、位置信号。仿真的核心价值是让控制逻辑在无硬件条件下可执行,并支持注入异常,例如"晶圆映射失败""真空未建立""通信超时"。
自动测试(Automated Testing)解决"每次改动都能快速回归"的问题。它把测试用例、测试数据、执行引擎和断言组织起来,自动运行并给出通过/失败结论。自动测试关注的是覆盖率和可重复性:一条取放片流程可以被参数化成几十个用例,覆盖不同片位、不同超时、不同异常分支。
验证(Verification)解决"软件是否满足需求与规格"的问题。它比测试更强调证据链:需求条目、设计实现、测试用例、执行结果之间要能双向追溯。验证活动包括需求评审、接口一致性检查、时序验证、故障注入验证和现场验收支持。
三者的协同关系可以概括为:仿真提供可运行的虚拟设备,自动测试提供可重复的执行与判定,验证提供可追溯的结论与证据。没有仿真,自动测试会被硬件排队卡住;没有自动测试,验证只能靠人工抽查;没有验证目标,仿真和测试容易变成"为了跑而跑"。
1.3 典型设备软件架构与课程项目载体
本课程以一个简化的晶圆传输与工艺设备软件为项目载体,架构自上而下分为四层。
设备层包含LoadPort、EFEM、TM、PM四类对象。LoadPort负责晶圆盒开门、映射和片位检测;EFEM负责大气环境下的机械手传输与对准;TM是真空传输腔,负责在EFEM与PM之间搬运晶圆;PM是工艺腔,执行刻蚀、沉积或清洗配方。四者通过统一的Equipment接口暴露状态与动作。
控制层实现状态机与动作序列。例如取放片流程可抽象为:LoadPort.Map() → EFEM.Pick() → TM.Pick() → PM.Place() → PM.Process() → TM.Pick() → EFEM.Place() → LoadPort.Store()。每一步都有前置条件、超时和异常分支。
仿真层为每个设备对象提供可替换的虚拟实现。例如VirtualRobot用定时器模拟动作耗时,VirtualValve用布尔状态模拟开闭,VirtualSensor支持注入"真空未建立"故障。
测试与验证层包含测试用例库、执行引擎和追溯矩阵。测试用例以YAML或Python数据驱动方式描述,执行引擎按用例加载仿真配置、运行流程、采集事件日志并断言结果。
1.4 一个可观察的示例:取放片流程的仿真与判定
假设我们为EFEM机械手配置如下示例参数(均为教学假设值):取片动作耗时1.2 s,真空吸附确认超时300 ms,放片动作耗时1.0 s,映射超时2.0 s。仿真运行时,事件日志会按时间戳输出:
[00:00.000] LoadPort.Open() -> OK
[00:00.850] LoadPort.Map() -> 25 slots, slot 3 present
[00:01.000] EFEM.Pick(slot=3) -> start
[00:02.200] EFEM.Pick(slot=3) -> vacuum confirmed
[00:02.250] EFEM.Pick(slot=3) -> retract
[00:03.450] EFEM.Pick(slot=3) -> done
[00:03.500] TM.Pick() -> start
[00:04.700] TM.Pick() -> vacuum confirmed
[00:04.750] TM.Pick() -> retract
[00:05.950] TM.Pick() -> done
[00:06.000] PM.Place() -> start
[00:07.000] PM.Place() -> done
[00:07.100] PM.Process(recipe=RCP_A) -> start
[00:37.100] PM.Process(recipe=RCP_A) -> done
判定依据有三条:时序正确性——每个动作的耗时是否在允许窗口内;状态一致性——动作前后设备状态是否合法迁移;异常可恢复性——注入"真空未建立"后,软件是否在超时内报警并回到安全状态。若三条全部满足,该用例通过;否则记录失败点并关联到需求条目。
1.5 本课程的学习路径
后续章节将沿着"建模—仿真—自动测试—验证—现场支持"的主线展开。你会先学会把设备对象抽象成可仿真的状态机,再学会用数据驱动方式组织测试用例,最后学会用追溯矩阵和证据链支撑验证结论。每一章都会围绕项目载体中的真实对象、接口和参数展开,而不是停留在概念层面。
在开始之前,请先建立一个基本认知:设备软件的质量不是靠"多跑几遍"保证的,而是靠可复现的仿真环境、可重复的自动测试和可追溯的验证证据共同保证的。这三者缺一不可,也正是本课程要训练的核心工程能力。