From Atoms to DevicesNanoelectronic modeling, lecture by lecture

ECE 606 Lecture 2.3

Atomic positions and bond orientations

In the lecture

  • solid-state materials: stable bonds, atoms at specific positions, bonds with specific orientations
  • other ordered and disordered phases: plastic crystals (specific positions, random orientations), liquid crystals (random positions, specific orientations) and liquids (neither)
  • the cross-section of a MOSFET: a crystalline Si substrate (the device), an amorphous SiO₂ dielectric only 1.6 nm thick, and a polycrystalline Si or metal gate
  • the function of each layer: highly conductive electron transport, nominally no transport, and holding charge
  • why the course starts from crystals (1D, then 2D, then 3D) and transfers the concepts to other materials later

In this notebook

builds the open-nemo Si crystal and compares its pair distribution and bond angles with a crystal of thermally displaced atoms and with a liquid-like random packing at the same density, then computes how many electrons tunnel through the "non-conducting" 1.6 nm SiO₂ gate dielectric of the lecture's MOSFET with open-nemo's transmission solver, checked against the analytic rectangular-barrier formula.

Run the notebookEvery number and figure on this page comes from it. Change it, rerun it, take it further.
Run it on your own machine

The notebook needs open-nemo (Python ≥ 3.10 and a C++20 compiler; BLAS/LAPACK).

git clone https://github.com/denphi/open-nemo.git && cd open-nemo
python3 -m venv .venv && source .venv/bin/activate
pip install -e ".[notebooks]"
jupyter lab From_Atoms_to_Devices/02_materials_and_quantum_mechanics/02_3_atomic_positions_and_bonds.ipynb
Code7 lines · cell 1
import numpy as np
import matplotlib.pyplot as plt
import opennemo as nemo
from opennemo.visualization import style

style.use(notebook=True)
from opennemo.core.units import HBAR2_2M0

1. Solid crystals and other arrangements#

The semiconductors of Lectures 3.1 and 3.2 are solid-state materials: their bonds are stable, the atoms do not move around freely, and each bond points in a specific direction. Klimeck sorts condensed matter by two properties, the position of its building blocks and their orientation:

specific orientation random orientation
specific position solid crystal plastic crystal
random position liquid crystal (as in displays) liquid

The course deals with the first box, which is where its name, solid-state devices, comes from.

Slide 4: solid, plastic and liquid crystals and liquids
Slide 4: four arrangements of elongated building blocks: position and orientation can each be specific or random.

The cell below makes the distinction quantitative for silicon. It compares three arrangements of 512 atoms at the density of Si:

  • the crystal: the diamond lattice of open-nemo, 4 × 4 × 4 cubic cells;
  • the vibrating crystal: the same lattice with every atom displaced at random by the thermal amplitude at room temperature, \(u_\text{rms} = 0.0077\) nm per Cartesian direction (from the measured Debye–Waller factor \(B = 0.463\) Ų, \(\langle u_x^2\rangle = B/8\pi^2\)); the atoms are displaced independently, which overestimates the spread of the bond lengths, since neighbouring atoms move partly together;
  • a liquid-like packing: atoms placed at random, one by one, with the only rule that no two come closer than 0.22 nm (random positions and no bond directions at all).

The pair distribution function \(g(r)\) counts the neighbours at distance \(r\) relative to a uniform gas of the same density \(\rho\): \(\rho\,g(r)\,4\pi r^2\,dr\) is the average number of atoms in a shell of thickness \(dr\) around an atom.

Code71 lines · cell 3
si = nemo.structures.materials.load("jancu1998_sp3d5s")["Si"]
lat = nemo.structures.lattice.from_material(si)
a = si.lattice_constant
N = 4
grid = np.stack(np.meshgrid(*(np.arange(N),) * 3, indexing="ij"), -1).reshape(-1, 3)
crystal = ((grid @ lat.conventional)[:, None, :] + lat.conventional_basis[None]).reshape(-1, 3)
box = N * a
rho = len(crystal) / box**3
rng = np.random.default_rng(3)
vibrating = crystal + rng.normal(0.0, 0.0077, crystal.shape)


def random_packing(n, size, d_min, rng):
    """Random sequential addition: uniform random positions, rejected if closer than d_min to an atom."""
    pts = np.empty((0, 3))
    while len(pts) < n:
        p = rng.uniform(0, size, 3)
        d = pts - p
        d -= size * np.round(d / size)
        if len(pts) == 0 or np.min(np.einsum("ij,ij->i", d, d)) > d_min**2:
            pts = np.vstack([pts, p])
    return pts


liquid = random_packing(len(crystal), box, 0.22, rng)


def distances(pos):
    """All pair distance vectors (minimum image in the periodic box) and their lengths."""
    d = pos[None, :, :] - pos[:, None, :]
    d -= box * np.round(d / box)
    r = np.linalg.norm(d, axis=-1)
    np.fill_diagonal(r, np.inf)
    return d, r


ARR = {"crystal": crystal, "vibrating crystal (300 K)": vibrating, "liquid-like packing": liquid}
edges = np.linspace(0.15, 0.75, 121)
mid, dr = 0.5 * (edges[1:] + edges[:-1]), edges[1] - edges[0]
print(f"{len(crystal)} atoms in a {box:.3f} nm box, density {rho:.2f} nm⁻³ (= {rho * 1e21:.3e} cm⁻³)")
print("open-nemo neighbour shells of Si (nm):", np.round(lat.neighbor_shells, 4))
fig, axes = plt.subplots(1, 2, figsize=(11, 4))
for (name, pos), c in zip(ARR.items(), style.sweep(3)):
    d, r = distances(pos)
    hist = np.histogram(r[np.isfinite(r)], bins=edges)[0] / len(pos)
    axes[0].plot(mid, hist / (rho * 4 * np.pi * mid**2 * dr), color=c, label=name)
    nn = np.argsort(r, axis=1)[:, :4]  # the four closest atoms of every atom
    v = np.take_along_axis(d, nn[:, :, None], axis=1)
    v /= np.linalg.norm(v, axis=-1, keepdims=True)
    iu, ju = np.triu_indices(4, 1)
    cosines = np.einsum("aik,ajk->aij", v, v)[:, iu, ju]
    angles = np.degrees(np.arccos(np.clip(cosines.ravel(), -1, 1)))
    axes[1].hist(
        angles, bins=np.linspace(40, 180, 71), density=True, histtype="step", lw=1.5, color=c, label=name
    )
    r4 = np.take_along_axis(r, nn, axis=1)
    print(
        f"{name:26s}: 4 nearest at {r4.mean():.4f} ± {r4.std():.4f} nm; "
        f"bond angle {angles.mean():6.2f}° ± {angles.std():5.2f}°"
    )
for s in lat.neighbor_shells:
    axes[0].axvline(s, color=style.CONTEXT, ls=":", lw=0.8)
axes[0].set(xlabel="distance r (nm)", ylabel="g(r)", title="pair distribution (dotted: open-nemo shells)")
axes[1].axvline(np.degrees(np.arccos(-1 / 3)), color=style.CONTEXT, ls=":", lw=0.8)
axes[1].set(
    xlabel="angle between two bonds of an atom (degrees)",
    ylabel="probability density (1/degree)",
    title="bond orientation (dotted: 109.47°)",
)
axes[1].legend(frameon=False, fontsize=8)
fig.tight_layout();
512 atoms in a 2.172 nm box, density 49.97 nm⁻³ (= 4.997e+22 cm⁻³)
open-nemo neighbour shells of Si (nm): [0.2351 0.384  0.4502 0.543 ]
crystal                   : 4 nearest at 0.2351 ± 0.0000 nm; bond angle 109.47° ±  0.00°
vibrating crystal (300 K) : 4 nearest at 0.2356 ± 0.0107 nm; bond angle 109.36° ±  4.05°
liquid-like packing       : 4 nearest at 0.2555 ± 0.0240 nm; bond angle 100.55° ± 31.83°
Figure computed by the notebook with open-nemo

The crystal has its atoms only at the distances of the open-nemo neighbour shells: 4 neighbours at 0.2351 nm, 12 at 0.3840 nm, 12 at 0.4502 nm, 6 at 0.5430 nm, and every pair of bonds at the tetrahedral angle of 109.47°. In \(g(r)\) this is a series of sharp lines (drawn as histogram bins). The thermal vibration broadens the lines without moving them: the nearest neighbours sit at 0.2356 ± 0.0107 nm and the bond angles scatter by 4.1° around the tetrahedral angle, but the long-range order is intact, and so are the positions and orientations that define a solid crystal. The liquid-like packing has the same density but no order beyond the closest-approach distance: \(g(r)\) jumps up at 0.22 nm and settles to 1 within about 0.1 nm, and the bond angles spread from about 45° to 175°. Its four nearest atoms are at 0.2555 ± 0.0240 nm, and the "angle between bonds" has no preferred value; there are no bonds to speak of. (Real amorphous Si, like the SiO₂ of the next section, keeps the first neighbour shell and the local tetrahedra and loses the order only beyond them.)

2. Atomic arrangements in a MOSFET#

The lecture's cross-section of an (older) Si MOSFET contains three of these arrangements stacked on top of one another.

Slide 7: functional layers of a MOSFET
Slide 7: a transmission-electron micrograph of a MOSFET (left) and the function of its layers: crystalline Si substrate (the device), amorphous SiO₂ dielectric, polycrystalline Si or metal gate.
  • The substrate at the bottom is crystalline Si, one of the purest and most perfectly arranged materials made. It is where the transport happens, and its conductivity can be modulated: it is the device.
  • The gate at the top is polycrystalline Si or a metal. Small crystallites are not aligned with one another over long distances. The gate is conductive and holds charge, but its conductivity cannot easily be modulated.
  • Between them sits an amorphous oxide, SiO₂, only 16 Å = 1.6 nm thick. It is the dielectric that separates gate and device and should carry no current. Klimeck puts "NO" transport in quotes, because some transport through it does happen.

That last point can be computed now. An electron in the Si conduction band meets the SiO₂ layer as a potential barrier of height \(V_0 = 3.1\) eV (the conduction-band offset), thickness \(d\), with effective masses \(m_1 = 0.26\) in Si (open-nemo's ema_basic value) and \(m_2 = 0.3\) in the oxide. Quantum mechanically the electron can tunnel through. For a rectangular barrier, with \(\psi\) and \(\psi'/m\) continuous at both interfaces, the transmission is

\[T(E) = \left[1 + \tfrac14\left(\eta + \eta^{-1}\right)^2 \sinh^2(\kappa d)\right]^{-1}, \qquad \eta = \frac{\kappa/m_2}{k/m_1},\]

with \(k = \sqrt{m_1 E/(\hbar^2/2m_0)}\) and \(\kappa = \sqrt{m_2 (V_0 - E)/(\hbar^2/2m_0)}\), and \(\hbar^2/2m_0 = 0.0381\) eV nm². Lectures 6.1 and 6.2 derive this formula; here it serves as the check for open-nemo, which builds the Si/SiO₂/Si stack as a discretized effective-mass device and computes \(T(E)\) with its Green's-function transport solver.

Code52 lines · cell 5
EMA = nemo.structures.materials.load("ema_basic")
si_em, ox = EMA["Si"], EMA["SiO2"]
V0 = ox.conduction_band_edge - si_em.conduction_band_edge
print(f"Si: m = {si_em.mass}, SiO2: m = {ox.mass}, barrier V0 = {V0} eV")


def t_open_nemo(d, energies, dx=0.02):
    dev = nemo.Heterostructure1D(
        [nemo.Layer(si_em, 5.0), nemo.Layer(ox, d), nemo.Layer(si_em, 5.0)], spacing=dx
    )
    return nemo.Transport(dev.hamiltonian).transmission(energies)


def t_barrier(d, e, m1=si_em.mass, m2=ox.mass, v0=V0):
    k, kappa = np.sqrt(m1 * e / HBAR2_2M0), np.sqrt(m2 * (v0 - e) / HBAR2_2M0)
    eta = (kappa / m2) / (k / m1)
    return 1.0 / (1.0 + 0.25 * (eta + 1 / eta) ** 2 * np.sinh(kappa * d) ** 2)


E = np.linspace(0.01, 1.0, 100)
T16 = t_open_nemo(1.6, E)
rel = np.max(abs(T16 / t_barrier(1.6, E) - 1))
print(
    f"d = 1.6 nm: T(0.1 eV) = {np.interp(0.1, E, T16):.3e}, T(1.0 eV) = {T16[-1]:.3e}; "
    f"largest relative difference to the formula {100 * rel:.1f} %"
)

thick = np.linspace(0.8, 3.0, 23)
T_d = np.array([t_open_nemo(d, np.array([0.1]))[0] for d in thick])
kappa = np.sqrt(ox.mass * (V0 - 0.1) / HBAR2_2M0)
print(
    f"κ at E = 0.1 eV: {kappa:.2f} nm⁻¹, so T drops by e^(2κ·0.1 nm) = {np.exp(0.2 * kappa):.2f} per 0.1 "
    "nm of oxide"
)
for d in (1.0, 1.6, 2.0, 3.0):
    print(f"  d = {d:.1f} nm: T(0.1 eV) = {np.interp(d, thick, T_d):.2e}")

fig, (a1, a2) = plt.subplots(1, 2, figsize=(11, 4))
a1.semilogy(E, T16, color=style.OPEN_NEMO, label="open-nemo")
a1.semilogy(E[::6], t_barrier(1.6, E[::6]), "o", mfc="none", color=style.REFERENCE, label="analytic barrier")
a1.set(
    xlabel="electron energy above the Si conduction band E (eV)",
    ylabel="transmission T",
    title="tunnelling through 1.6 nm of SiO₂",
)
a1.legend(frameon=False, fontsize=8)
a2.semilogy(thick, T_d, "o-", color=style.OPEN_NEMO, ms=4, label="open-nemo, E = 0.1 eV")
a2.semilogy(thick, t_barrier(thick, 0.1), "--", color=style.REFERENCE, label="analytic barrier")
a2.axvline(1.6, color=style.CONTEXT, ls=":", label="the lecture's oxide, 1.6 nm")
a2.set(xlabel="oxide thickness d (nm)", ylabel="transmission T", title="the oxide is a tunnel barrier")
a2.legend(frameon=False, fontsize=8)
fig.tight_layout();
Si: m = 0.26, SiO2: m = 0.3, barrier V0 = 3.1 eV
d = 1.6 nm: T(0.1 eV) = 1.013e-07, T(1.0 eV) = 8.209e-06; largest relative difference to the formula 0.9 %
κ at E = 0.1 eV: 4.86 nm⁻¹, so T drops by e^(2κ·0.1 nm) = 2.64 per 0.1 nm of oxide
  d = 1.0 nm: T(0.1 eV) = 3.45e-05
  d = 1.6 nm: T(0.1 eV) = 1.01e-07
  d = 2.0 nm: T(0.1 eV) = 2.08e-09
  d = 3.0 nm: T(0.1 eV) = 1.25e-13
Figure computed by the notebook with open-nemo

open-nemo and the analytic formula agree to within 0.9 % over the whole energy range (the residual is the 0.02 nm discretization). Through 1.6 nm of SiO₂ an electron 0.1 eV above the Si conduction band gets through with probability \(1.0\times10^{-7}\), and one at 1 eV with \(8.2\times10^{-6}\). That looks negligible, but the electrons of the channel strike the oxide extremely often, so even this probability gives a measurable gate current. And the probability grows by a factor of 2.6 for every 0.1 nm (one atomic layer is about 0.3 nm) the oxide is made thinner: from \(2.08\times10^{-9}\) at 2 nm to \(3.45\times10^{-5}\) at 1 nm. This tunnelling is why gate oxides could not be thinned below about 1.2 nm and were replaced by high-κ dielectrics, which can be made thicker for the same capacitance. Gate leakage is computed in detail in the ultra-thin-body notebooks listed below.

3. Why start with crystals#

Modern solid-state devices use all of these forms of matter: crystals for the channel, amorphous oxides for the dielectric and polycrystalline or metallic gates. The course nevertheless starts with the perfect crystal, because its periodicity makes the electronic states computable and gives them their names (bands, effective masses, gaps). It proceeds from one dimension to two and three, and then transfers the concepts to the other materials. Section 1 showed what survives in the less ordered cases: the vibrating crystal keeps the positions and orientations of the bonds on average, which is why band structures still describe Si at room temperature.

Summary#

  • Solid crystals have atoms at specific positions with bonds of specific orientation; plastic crystals, liquid crystals and liquids give up one or both.
  • In the Si crystal every atom has 4 neighbours at 0.2351 nm with bond angles of 109.47°, then 12 at 0.3840 nm and 12 at 0.4502 nm. Thermal vibration at 300 K broadens these shells (bond angles ± 4.1°) but keeps them; a liquid-like random packing of the same density has no order beyond its closest-approach distance.
  • A MOSFET stacks a crystalline Si device, an amorphous SiO₂ dielectric (1.6 nm in the lecture's example) and a polycrystalline Si or metal gate.
  • The dielectric is a 3.1 eV tunnel barrier. open-nemo gives \(T = 1.0\times10^{-7}\) at 0.1 eV through 1.6 nm, in agreement with the analytic barrier formula, and \(T\) grows by a factor of 2.6 per 0.1 nm of thinning.

Exercises#

  1. Increase the thermal amplitude in section 1 until the nearest-neighbour and second-neighbour peaks of \(g(r)\) merge. Compare that amplitude with the Lindemann criterion for melting (about 10 % of the bond length).
  2. Repeat the tunnelling calculation with the longitudinal mass of the Si Δ valleys, si_em.extra["mass_longitudinal"] = 0.916, which is the mass of the two valleys whose heavy axis is perpendicular to a (001) interface. How much does \(T\) at 1.6 nm change?
  3. A high-κ oxide such as HfO₂ (\(\varepsilon_r \approx 22\), barrier ≈ 1.5 eV, mass ≈ 0.2) replaces 1.6 nm of SiO₂ with a layer of the same capacitance, \(d = 1.6\ \text{nm}\times 22/3.9\). Build it as an EffectiveMassMaterial and compare the transmissions.

Further reading#