Wearout Faults

Physics

As gates are utilized, they wear out. NBTI, HCI, TDDB are well-understood phenomena that explain how the gate behavior changes with wear out. Typically, these phenomena lead to a degradation in threshold voltage that shows up as degradation in gate delay. Our fault model for wear out hence maps age and utilization to the increase in delay.

Modeling

PERSim uses Synopsys HSPICE with the MOSRA plugin.

Implementation

The paths around a fault gate are simulated in HSPICE. This is account for wear out in gates that surround the fault site as well. Re-run the simulation with different age numbers (MOSRA models wear out). We use the change in delay (percentage) to augment the delay aware simulation.

Physics

When a partcle strikes, it transfers charge that momentarily distrubs a transistor's behavior. This causes a glitch - the duration of which is proportional to the charge accumulated.

Modeling

We pick a fault site and the cycle when the particle strikes at random. During that cycle, a particle may strike at any time with equal probability. We use a uniform distribution to characterize that. The intensity of the particle causes the glitch and thats modeled using a gaussian random variable with mean and standard deviation of 1/10th the clock period (typical guardband).

Implementation

We use python scripts to generate the random variables. At the code, the code looks like

for idx in range(noOfSamples) : 
    strikeTime.append(uniform(0, clockPeriod))
    delayChange.append(abs(gauss(clockPeriod/10, clockPeriod/10)))

Physics

Logic gates may encounter a catastropic breakdown and forever be stuck-at either a 0 or 1.

Modeling

As a permanent fault may occur in any gate and at any time (during the execution of a program), we randomly pick the gate and cycle at which it fails.

Implementation

Again we use python scripts to generate the fault sites and cycles. The fault injection firmware takes this information in the format int faultInjectLocArray[] = { 349499, 135744, ... }; // cycle after main() when error occurs first
int faultInjectGateArray[] = { 3, 71, 45, ... }; // Gate number where fault occurs