Testing Resistivity of Silicon Wafers

In semiconductor manufacturing, consistent electrical properties of the wafers are crucial to ensure high-quality chips. One key metric is the resistivity of the silicon wafers, measured in ohm-cm. The resistivity directly affects the performance of the semiconductor devices, and deviations from the target range can lead to defects. To ensure the process remains stable, manufacturers continuously monitor the resistivity of the wafers.

Step 1: Establish in-control limits

We have a retrospective dataset that consists of 30 subgroups of resistivity measurements (in ohm-cm), each subgroup represents the average resistivity of five wafers processed under similar conditions.

#Retrospective Analysis 
etchretro<-read.csv("retrospective_resistivity.csv",
                    header=FALSE)
etchretro
##           V1        V2        V3        V4        V5
## 1  10.248357  9.930868 10.323844 10.761515  9.882923
## 2   9.882932 10.789606 10.383717  9.765263 10.271280
## 3   9.768291  9.767135 10.120981  9.043360  9.137541
## 4   9.718856  9.493584 10.157124  9.545988  9.293848
## 5  10.732824  9.887112 10.033764  9.287626  9.727809
## 6  12.055461 11.424503 12.187849 11.699681 11.854153
## 7   9.699147 10.926139  9.993251  9.471145 10.411272
## 8   9.389578 10.104432  9.020165  9.335907 10.098431
## 9  10.369233 10.085684  9.942176  9.849448  9.260739
## 10  9.640078  9.769681 10.528561 10.171809  9.118480
## 11 10.162042  9.807459  9.661539 10.305838 10.515500
## 12 10.465640  9.580391  9.845394 10.165632 10.487773
## 13  9.760413  9.907171  9.446833  9.401897 10.406263
## 14 10.678120  9.963995 10.501766 10.180818  9.677440
## 15 10.180698 10.769018  9.982087 10.782322  8.690127
## 16  8.410951  8.043524  7.850496  8.045880  7.006216
## 17  9.890164 10.178556 10.738947  9.740865  9.595753
## 18  9.749121 10.457701 10.164376  9.735120 10.256634
## 19 10.048539 10.484322  9.648973  9.836169  9.803946
## 20  9.268243 10.148060 10.130528 10.002557  9.882706
## 21  9.292315  9.789677  9.828643  9.598861  9.919357
## 22 10.202025 10.943093 10.087289 10.128775  9.962777
## 23  9.040614  9.986743 10.030115 11.231621  9.903820
## 24 10.150774  9.982644  9.415661 10.571411 10.375967
## 25 10.395516  9.545306 10.701397  9.299074 10.293429
## 26 11.095228  9.504732  9.716851 10.049826  9.748262
## 27  9.224668 10.034281  9.468848 10.236796  9.540288
## 28 10.774967  9.608373  9.838969 10.406759  9.384568
## 29 10.113730 10.653571  9.196258 10.092317 10.129941
## 30 10.390911  9.381525  9.339772 10.260971 10.148492

Step 1a.

Identify any out-of-control points and iteratively refine the dataset to establish stable, in-control process limits.

qcc(data=etchretro,
    type="xbar",
    sizes=5)

## List of 11
##  $ call      : language qcc(data = etchretro, type = "xbar", sizes = 5)
##  $ type      : chr "xbar"
##  $ data.name : chr "etchretro"
##  $ data      : num [1:30, 1:5] 10.25 9.88 9.77 9.72 10.73 ...
##   ..- attr(*, "dimnames")=List of 2
##  $ statistics: Named num [1:30] 10.23 10.22 9.57 9.64 9.93 ...
##   ..- attr(*, "names")= chr [1:30] "1" "2" "3" "4" ...
##  $ sizes     : num [1:30] 5 5 5 5 5 5 5 5 5 5 ...
##  $ center    : num 9.96
##  $ std.dev   : num 0.499
##  $ nsigmas   : num 3
##  $ limits    : num [1, 1:2] 9.29 10.63
##   ..- attr(*, "dimnames")=List of 2
##  $ violations:List of 2
##  - attr(*, "class")= chr "qcc"
qcc(data=etchretro,
    type="R",
    sizes=5)

## List of 11
##  $ call      : language qcc(data = etchretro, type = "R", sizes = 5)
##  $ type      : chr "R"
##  $ data.name : chr "etchretro"
##  $ data      : num [1:30, 1:5] 10.25 9.88 9.77 9.72 10.73 ...
##   ..- attr(*, "dimnames")=List of 2
##  $ statistics: Named num [1:30] 0.879 1.024 1.078 0.863 1.445 ...
##   ..- attr(*, "names")= chr [1:30] "1" "2" "3" "4" ...
##  $ sizes     : num [1:30] 5 5 5 5 5 5 5 5 5 5 ...
##  $ center    : num 1.16
##  $ std.dev   : num 0.499
##  $ nsigmas   : num 3
##  $ limits    : num [1, 1:2] 0 2.45
##   ..- attr(*, "dimnames")=List of 2
##  $ violations:List of 2
##  - attr(*, "class")= chr "qcc"

From the X-bar chart, groups 6 and 16 are out of control. So we will remove groups 6 and 16 - in that order.

The R charts revealed no problematic groups. So removing samples should not hurt the current control limits.

etchretro<-etchretro[-6,] #remove out-of-control subgroup 6
qcc(data=etchretro,
    type="xbar",
    sizes=5)

## List of 11
##  $ call      : language qcc(data = etchretro, type = "xbar", sizes = 5)
##  $ type      : chr "xbar"
##  $ data.name : chr "etchretro"
##  $ data      : num [1:29, 1:5] 10.25 9.88 9.77 9.72 10.73 ...
##   ..- attr(*, "dimnames")=List of 2
##  $ statistics: Named num [1:29] 10.23 10.22 9.57 9.64 9.93 ...
##   ..- attr(*, "names")= chr [1:29] "1" "2" "3" "4" ...
##  $ sizes     : num [1:29] 5 5 5 5 5 5 5 5 5 5 ...
##  $ center    : num 9.89
##  $ std.dev   : num 0.505
##  $ nsigmas   : num 3
##  $ limits    : num [1, 1:2] 9.22 10.57
##   ..- attr(*, "dimnames")=List of 2
##  $ violations:List of 2
##  - attr(*, "class")= chr "qcc"
qcc(data=etchretro,
    type="R",
    sizes=5)

## List of 11
##  $ call      : language qcc(data = etchretro, type = "R", sizes = 5)
##  $ type      : chr "R"
##  $ data.name : chr "etchretro"
##  $ data      : num [1:29, 1:5] 10.25 9.88 9.77 9.72 10.73 ...
##   ..- attr(*, "dimnames")=List of 2
##  $ statistics: Named num [1:29] 0.879 1.024 1.078 0.863 1.445 ...
##   ..- attr(*, "names")= chr [1:29] "1" "2" "3" "4" ...
##  $ sizes     : num [1:29] 5 5 5 5 5 5 5 5 5 5 ...
##  $ center    : num 1.17
##  $ std.dev   : num 0.505
##  $ nsigmas   : num 3
##  $ limits    : num [1, 1:2] 0 2.48
##   ..- attr(*, "dimnames")=List of 2
##  $ violations:List of 2
##  - attr(*, "class")= chr "qcc"
etchretro<-etchretro[-15,] #remove out-of-control subgroup 16 (now at 15)
qcc(data=etchretro,
    type="xbar",
    sizes=5)

## List of 11
##  $ call      : language qcc(data = etchretro, type = "xbar", sizes = 5)
##  $ type      : chr "xbar"
##  $ data.name : chr "etchretro"
##  $ data      : num [1:28, 1:5] 10.25 9.88 9.77 9.72 10.73 ...
##   ..- attr(*, "dimnames")=List of 2
##  $ statistics: Named num [1:28] 10.23 10.22 9.57 9.64 9.93 ...
##   ..- attr(*, "names")= chr [1:28] "1" "2" "3" "4" ...
##  $ sizes     : num [1:28] 5 5 5 5 5 5 5 5 5 5 ...
##  $ center    : num 9.97
##  $ std.dev   : num 0.501
##  $ nsigmas   : num 3
##  $ limits    : num [1, 1:2] 9.29 10.64
##   ..- attr(*, "dimnames")=List of 2
##  $ violations:List of 2
##  - attr(*, "class")= chr "qcc"
qcc(data=etchretro,
    type="R",
    sizes=5)

## List of 11
##  $ call      : language qcc(data = etchretro, type = "R", sizes = 5)
##  $ type      : chr "R"
##  $ data.name : chr "etchretro"
##  $ data      : num [1:28, 1:5] 10.25 9.88 9.77 9.72 10.73 ...
##   ..- attr(*, "dimnames")=List of 2
##  $ statistics: Named num [1:28] 0.879 1.024 1.078 0.863 1.445 ...
##   ..- attr(*, "names")= chr [1:28] "1" "2" "3" "4" ...
##  $ sizes     : num [1:28] 5 5 5 5 5 5 5 5 5 5 ...
##  $ center    : num 1.17
##  $ std.dev   : num 0.501
##  $ nsigmas   : num 3
##  $ limits    : num [1, 1:2] 0 2.47
##   ..- attr(*, "dimnames")=List of 2
##  $ violations:List of 2
##  - attr(*, "class")= chr "qcc"

Step1b: Report final in-control limits

In-control mean = 9.966048, UCL=10.63852, LCL=9.293574.

In-control R = 1.165868, UCL= 2.465193, LCL=0.

Importantly: In-control StdDev = 0.501233.

To arrive to these parameters, we had to remove two groups from the original retro samples - group 6 and 16. We do this to get the final correct limits.

Step 2: Online Process Monitoring

Our online data is similarly a collection of 5 samples in 10 batches/instances/groups.

etchonline<-read.csv("online_resistivity.csv",
                    header=FALSE)
etchonline
##           V1        V2        V3        V4        V5
## 1  10.125246 10.173224  9.659988 10.116127 10.146536
## 2   9.642824 10.932887 10.236916  9.404348 10.328277
## 3   9.512659 10.393542 10.579298  9.589659 10.481688
## 4  10.206390 10.411030 10.948396  9.877306  9.623132
## 5   9.555243  9.592095  9.961449 10.170576 10.138345
## 6  10.413592 10.006501 10.726767  9.867672 11.360085
## 7  10.312834  9.571421  9.464554 10.241236  9.888269
## 8  10.357000 10.236619  9.963586  9.576603  9.242576
## 9   9.776743 10.428199 10.107047  9.377131 10.086590
## 10 10.192659  9.558071 10.076863 10.029104  9.428515

Using the final, in-control limits derived from our retrospective analysis, we want to see if the process is shifting out of control.

qcc(data=etchonline,
    type="xbar",
    sizes=5,
    center=9.966048,
    #std.dev=0.501233
    )

## List of 11
##  $ call      : language qcc(data = etchonline, type = "xbar", sizes = 5, center = 9.966048)
##  $ type      : chr "xbar"
##  $ data.name : chr "etchonline"
##  $ data      : num [1:10, 1:5] 10.13 9.64 9.51 10.21 9.56 ...
##   ..- attr(*, "dimnames")=List of 2
##  $ statistics: Named num [1:10] 10.04 10.11 10.11 10.21 9.88 ...
##   ..- attr(*, "names")= chr [1:10] "1" "2" "3" "4" ...
##  $ sizes     : num [1:10] 5 5 5 5 5 5 5 5 5 5
##  $ center    : num 9.97
##  $ std.dev   : num 0.444
##  $ nsigmas   : num 3
##  $ limits    : num [1, 1:2] 9.37 10.56
##   ..- attr(*, "dimnames")=List of 2
##  $ violations:List of 2
##  - attr(*, "class")= chr "qcc"
qcc(data=etchonline,
    type="R",
    sizes=5,
    #center=1.165868,
    #std.dev=0.501233
    )

## List of 11
##  $ call      : language qcc(data = etchonline, type = "R", sizes = 5)
##  $ type      : chr "R"
##  $ data.name : chr "etchonline"
##  $ data      : num [1:10, 1:5] 10.13 9.64 9.51 10.21 9.56 ...
##   ..- attr(*, "dimnames")=List of 2
##  $ statistics: Named num [1:10] 0.513 1.529 1.067 1.325 0.615 ...
##   ..- attr(*, "names")= chr [1:10] "1" "2" "3" "4" ...
##  $ sizes     : num [1:10] 5 5 5 5 5 5 5 5 5 5
##  $ center    : num 1.03
##  $ std.dev   : num 0.444
##  $ nsigmas   : num 3
##  $ limits    : num [1, 1:2] 0 2.18
##   ..- attr(*, "dimnames")=List of 2
##  $ violations:List of 2
##  - attr(*, "class")= chr "qcc"

Conclusion

Given that all the online data falls within the control limits, we have reason to believe that the process is fully in control. Additionally, there are no points with violating runs. This is true for both the Xbar and R measurements.

Further work

If any new data happens to fall outside the established control limits, we have a few potential actions we could take to identify and correct the issue.

  1. See if the instruments (machines) need re-calibration.
  2. See if the quality of the materials (e.g. the gas, or wafers themselves) is changed.