CMOSインバータとは?伝達特性・ノイズマージン・消費電力の導出と実装

スマートフォンを机に置いたまま放置しても、バッテリーは何日も持ちます。そのチップの中には数十億個のトランジスタが載っているのに、です。ところが同じスマートフォンでゲームを走らせると、1時間もしないうちに電池が半分になり、本体はほんのり熱を持ちます。「止まっているときはほとんど電気を食わないのに、動かした瞬間から食う」— この極端な非対称性は、現代のディジタル回路がすべて CMOS(Complementary MOS) という方式で作られていることの直接の帰結です。

そして CMOS 回路のすべての振る舞いは、たった2個のトランジスタからなる CMOSインバータ(NOTゲート)に凝縮されています。インバータの伝達特性がわかれば、なぜ待機電流がほぼゼロなのか、なぜ論理レベルがノイズに強いのか、なぜ動作周波数を上げると発熱するのか、なぜ電源電圧を下げると省電力になるのに遅くなるのか — これらがすべて数式として説明できます。

CMOSインバータの回路構成と、入力Low・入力Highそれぞれで一方のトランジスタだけが導通する相補動作の模式図

左が回路構成です。PMOSとNMOSを縦に積み、2つのゲートを入力に、2つのドレインを出力につなぐ、それだけの回路です。中央と右のパネルが本記事の主役で、入力がLowのときはPMOSだけ、HighのときはNMOSだけが導通し、赤い電流経路が電源からグラウンドまで一本につながることが決してないという点に注目してください。導通経路が存在しないのだから定常電流はゼロ、というのが待機電力がほぼ消える理由です。以降の節では、この定性的な絵を電流の式に置き換えて定量化していきます。

この理解が効いてくる場面を挙げておきます。

  • 低消費電力LSI設計: 動的電力 $P = \alpha C_L V_{DD}^2 f$ の各因子をどう削るか(電圧スケーリング、クロックゲーティング、負荷容量削減)という判断は、すべてインバータの電力式から出発します
  • SRAMのセル安定性: SRAMセルは背中合わせに接続した2つのインバータです。データ保持の余裕(スタティックノイズマージン)は、インバータの伝達特性の形そのもので決まります
  • 宇宙機・車載の耐環境設計: 放射線や電源リプルによるグリッチをどこまで無視できるかは、ノイズマージン $NM_L$, $NM_H$ の実数値で判定します
  • 高速インタフェースの波形整形: 入力の立ち上がりが鈍いと貫通電流が増えて発熱する — この定量評価にはスルーレート依存の貫通電荷モデルが必要です

本記事の内容

  • CMOSインバータの構成と「相補的スイッチ」という直感
  • MOSFETの平方則モデル(遮断・線形・飽和)とPMOSの符号の扱い
  • $I_{DN}(V_{in},V_{out}) = I_{DP}(V_{in},V_{out})$ を5つの領域に場合分けして解く伝達特性(VTC)の導出
  • 反転点 $V_M$ の閉形式と、W/L比による設計
  • 遷移領域の利得 $A_v$ の導出(チャネル長変調を含む)
  • $dV_{out}/dV_{in} = -1$ による $V_{IL}$, $V_{IH}$ とノイズマージンの定義
  • 消費電力の3成分分解 $P = \alpha C_L V_{DD}^2 f + P_{short} + I_{leak}V_{DD}$
  • 貫通電流のVeendrickモデルと入力スルーレート依存性
  • 伝搬遅延 $t_{pHL}$ の積分による導出と閉形式
  • 電源電圧スケーリングにおける遅延とエネルギーのトレードオフ、エネルギー遅延積の最適点
  • Python実装: VTC群・利得曲線・貫通電流・遅延・EDPの可視化

前提知識

この記事を読む前に、以下の記事を読んでおくと理解が深まります。

特に、MOSFETの平方則モデル(遮断・線形・飽和の3領域)としきい値電圧 $V_{TH}$ の意味は本記事の出発点になるので、あいまいなら先に確認しておくと読みやすくなります。

CMOSインバータとは — なぜ待機時に電流が流れないのか

2つの蛇口が絶対に同時には開かない

台所のシンクに、上から水を注ぐ蛇口(給水)と、下に水を抜く栓(排水)があるとします。もし両方を開けっぱなしにすると、水位はどこかで釣り合って止まりますが、その間ずっと水は流れ続け、水道代がかかります。逆に「給水を開けるときは排水を必ず閉じる、排水を開けるときは給水を必ず閉じる」というルールで運用すれば、水位を上げ下げする瞬間以外、水はまったく流れません。

CMOSインバータはまさにこれをやっています。電源 $V_{DD}$ から出力ノードへ電荷を注ぐ役が PMOS、出力ノードからグラウンドへ電荷を抜く役が NMOS です。そして両者のゲートは同じ入力 $V_{in}$ につながっているのに、入力がHighのときはNMOSだけがオン、入力がLowのときはPMOSだけがオンという具合に、必ず一方だけが導通します。だから入力が静止していれば $V_{DD}$ からグラウンドへの導通経路が存在せず、定常電流はほぼ流れません。これが「待機時に電気を食わない」ことの正体です。

なぜ相補的に動くのかというと、NMOSとPMOSではしきい値のかかり方が逆だからです。NMOSはゲート電圧がソース(=グラウンド)より $V_{THN}$ だけ高くなるとオンします。PMOSはゲート電圧がソース(=$V_{DD}$)より $|V_{THP}|$ だけ低くなるとオンします。この「高くなったらオン」と「低くなったらオン」の組み合わせが、1本の入力線で相補動作を実現します。

回路構成と真理値表

回路は極めてシンプルです。PMOSのソースを $V_{DD}$、NMOSのソースをグラウンドにつなぎ、2つのドレインを共通ノード(出力 $V_{out}$)でつなぎ、2つのゲートを共通ノード(入力 $V_{in}$)でつなぐ。これだけです。

$V_{in}$ NMOS PMOS 導通経路 $V_{out}$
$0$ (L) OFF ON $V_{DD}\to$ 出力 $V_{DD}$ (H)
$V_{DD}$ (H) ON OFF 出力 $\to$ GND $0$ (L)

入力Lで出力H、入力Hで出力L。まさに論理否定(NOT)です。表からもうひとつ大事なことが読み取れます。出力Hのときは出力ノードが $V_{DD}$ に「べったり」つながり、出力Lのときはグラウンドに「べったり」つながるという点です。オンしたMOSFETは線形領域で数百 $\Omega$ 程度の抵抗として振る舞い、そこに定常電流は流れないので、電圧降下はほぼゼロになります。したがって出力の High レベルは厳密に $V_{OH} = V_{DD}$、Low レベルは厳密に $V_{OL} = 0$ です。この「フルスイングする」という性質は、後で見るノイズマージンの大きさに直結します。

抵抗負荷型インバータと比べると何が嬉しいか

CMOS以前のnMOSロジックでは、PMOSの代わりに抵抗(あるいは常時オンの負荷トランジスタ)を使っていました。この構成でも入力Hで出力Lにはなりますが、出力Lのとき $V_{DD}$ → 抵抗 → オンしたNMOS → GND という経路が生き続けるため、静的に電流が流れっぱなしになります。しかも出力Lのレベルは抵抗とNMOSのオン抵抗の分圧で決まるので、$V_{OL} = 0$ にはならず、素子寸法の比(レシオ)で論理レベルが決まる「レシオ型」回路になってしまいます。

CMOSはこれを一気に解決します。静的電流ゼロ、フルスイング、そして論理レベルが素子寸法比に依存しない「レシオレス」設計。数十億トランジスタを1チップに載せられるようになったのは、この3つの性質のおかげです。

抵抗負荷型インバータとCMOSインバータの、出力Low時の静的電流と出力Lowレベルの比較

左は出力Lowを保っているときに流れ続ける静的電流です(負荷抵抗を $20$ k$\Omega$ と仮定)。抵抗負荷型が $82.3\ \mu$A も流し続けるのに対し、CMOSは $1.66$ pA — 実に約5000万分の1です。対数軸でないと同じ図に描けないほどの差があります。右は伝達特性の比較で、抵抗負荷型の出力Lowが $0.153$ V で止まってしまうのに対し、CMOSは $0.000$ V まで完全に落ちています。この $0.153$ V という残留電圧は負荷抵抗とNMOSのオン抵抗の分圧で決まる値で、素子寸法を変えれば動いてしまいます。CMOSにはそれがない、というのが「レシオレス」の意味です。

なお、CMOSインバータの構造は一般のCMOS論理ゲートにそのまま拡張されます。上側にPMOSからなるプルアップ網(PUN)、下側にNMOSからなるプルダウン網(PDN)を置き、両者を互いに双対(直列と並列を入れ替えた形)にすれば、任意の反転論理関数が作れます。NANDならPDNが直列2段でPUNが並列2段、NORならその逆です。つまりインバータを理解することは、CMOS論理ゲート全般を理解することにほかなりません。

ここまでで「なぜ静的電流が流れないか」は定性的に納得できました。しかし、入力がLowからHighへ移り変わる途中では、NMOSもPMOSも中途半端にオンする瞬間が必ず存在します。そのとき出力電圧はどう動き、電流はどれだけ流れるのか。これを定量的に答えるには、まずMOSFETの電流式を用意する必要があります。

MOSFETの電流モデル

平方則モデル(長チャネル近似)

MOSFETのドレイン電流を、教科書的な平方則(square-law)モデルで書きます。ゲート酸化膜容量を $C_{ox}$、チャネル移動度を $\mu$、チャネル幅と長さを $W$, $L$ として、利得係数(transconductance parameter)を次のように定義します。

$$ k_n = \mu_n C_{ox}\left(\frac{W}{L}\right)_n, \qquad k_p = \mu_p C_{ox}\left(\frac{W}{L}\right)_p $$

$k$ は「そのトランジスタがどれだけ電流を流せるか」を表す唯一のスケール量です。設計者が触れるのは $W/L$ だけで、$\mu C_{ox}$ はプロセスで決まります。

NMOSのソースはグラウンドなので、$V_{GS} = V_{in}$、$V_{DS} = V_{out}$ です。オーバードライブ電圧を $V_{ov,n} = V_{in} – V_{THN}$ と書くと、3つの領域は次のようになります。

$$ I_{DN} = \begin{cases} 0 & (V_{ov,n} < 0) \quad \text{遮断} \\[4pt] k_n\left(V_{ov,n}V_{out} - \dfrac{V_{out}^2}{2}\right) & (0 \le V_{out} < V_{ov,n}) \quad \text{線形} \\[8pt] \dfrac{k_n}{2}V_{ov,n}^2\left(1 + \lambda_n V_{out}\right) & (V_{out} \ge V_{ov,n}) \quad \text{飽和} \end{cases} $$

NMOSの出力特性における線形領域と飽和領域、および飽和電流がオーバードライブ電圧の2乗に比例することを示すグラフ

左はこの式をそのまま描いた出力特性です。赤い破線 $V_{DS}=V_{GS}-V_{THN}$ を境に、左側では電流が $V_{DS}$ にほぼ比例して立ち上がり(抵抗的)、右側ではほぼ水平になります(電流源的)。$V_{GS}$ を $0.3$ V 刻みで上げているのに曲線の間隔がどんどん広がるのは、電流がオーバードライブの2乗で効くからです。右のグラフはそれを直接確かめたもので、$\sqrt{I_D}$(オレンジ・右軸)が $V_{THN}=0.4$ V より上でみごとに直線になっています。この直線が横軸を切る点がしきい値電圧そのもので、実測でしきい値を求めるときの標準的な手法にもなっています。

線形領域と飽和領域の境界 $V_{out} = V_{ov,n}$ は「ドレイン端でチャネルがピンチオフする点」です。$\lambda_n$ は チャネル長変調係数 で、飽和領域でも $V_{DS}$ を上げるとわずかに電流が増える効果を表します。理想的には $\lambda = 0$ ですが、これをゼロにすると後で見る「遷移領域の利得が無限大」という非物理的な結論が出てしまうので、少なくとも遷移領域の議論では残しておく必要があります。

PMOSの符号を絶対値で扱う

PMOSは電圧も電流も符号が逆向きになるため、そのまま書くとマイナスだらけで見通しが悪くなります。そこですべて大きさ(絶対値)で書き直すのが実務的な流儀です。

PMOSのソースは $V_{DD}$ なので、ソース基準のゲート電圧の大きさは $|V_{GSp}| = V_{DD} – V_{in}$、ソース・ドレイン間電圧の大きさは $|V_{DSp}| = V_{DD} – V_{out}$ です。しきい値の大きさを $|V_{THP}|$ とすると、オーバードライブは $V_{ov,p} = V_{DD} – V_{in} – |V_{THP}|$ となります。ここで $I_{DP}$ を「$V_{DD}$ から出力ノードへ流れ込む電流の大きさ」と定義すると、

$$ I_{DP} = \begin{cases} 0 & (V_{ov,p} < 0) \\[4pt] k_p\left(V_{ov,p}(V_{DD}-V_{out}) - \dfrac{(V_{DD}-V_{out})^2}{2}\right) & (0 \le V_{DD}-V_{out} < V_{ov,p}) \\[8pt] \dfrac{k_p}{2}V_{ov,p}^2\left(1 + \lambda_p (V_{DD}-V_{out})\right) & (V_{DD}-V_{out} \ge V_{ov,p}) \end{cases} $$

NMOSの式と見比べてください。$V_{in} \to V_{DD}-V_{in}$、$V_{out} \to V_{DD}-V_{out}$、$V_{THN} \to |V_{THP}|$、$k_n \to k_p$ と置き換えただけで、まったく同じ形になっています。この対応は偶然ではなく、CMOSインバータが持つ「$V_{DD}$ を挟んだ上下の対称性」の表れです。以降の導出でも、NMOS側の結果を得たら、この置き換えでPMOS側の結果が自動的に手に入ります。

遮断領域は本当にゼロか — サブスレッショルド電流

平方則モデルは $V_{GS} < V_{TH}$ で電流を厳密にゼロとしますが、実際のMOSFETはゼロにはなりません。しきい値以下でもチャネルには拡散による電流が流れ、これを サブスレッショルド電流 と呼びます。

$$ I_{sub} = I_0 \exp\!\left(\frac{V_{GS}-V_{TH}}{n\phi_t}\right)\left(1 – e^{-V_{DS}/\phi_t}\right) $$

ここで $\phi_t = kT/q \approx 26$ mV(室温の熱電圧)、$n$ はサブスレッショルド係数(典型的に $1.2 \sim 1.5$)です。電流が10倍変わるのに必要なゲート電圧を サブスレッショルドスイング $S$ と呼び、

$$ S = n\phi_t \ln 10 \approx 60n \ \text{[mV/dec]} $$

しきい値以下でも電流が指数関数的にしか減らないことと、サブスレッショルドスイングの物理限界60mV/decを示すグラフ

左は $V_{TH}$ を $0.4$ / $0.3$ / $0.2$ V と変えたときのしきい値以下の電流を対数軸で描いたものです。3本とも同じ傾きの直線になっており、この傾きの逆数がスイング $S=78$ mV/dec です。注目すべきは $V_{GS}=0$ での値(丸印)で、$V_{TH}$ を $0.4$ V から $0.2$ V へ下げるだけで待機リークが $371$ 倍に跳ね上がります。右のグラフは、そのスイングが $n=1$ でも $60$ mV/dec より小さくはできないことを示しています。ピンク色に塗られた領域は室温のMOSFETには原理的に到達できない禁制域で、低電圧化がどこかで頭打ちになる根本原因がここにあります。

$n = 1.3$ なら $S \approx 78$ mV/dec です。つまり、しきい値から $0.4$ V 下げると電流は $10^{-0.4/0.078} \approx 10^{-5.1}$ 倍にしかなりません。これが待機時のリーク電力の主因です。微細プロセスで $V_{TH}$ を下げるとリークが指数関数的に増えるのは、この式が「指数」だからです。なお $S$ の下限は $\phi_t \ln 10 = 60$ mV/dec で、これは物理定数だけで決まる壁です(この壁を破るためにトンネルFETや負性容量FETが研究されています)。

以上でNMOSとPMOSの電流式が揃いました。次は、この2つの電流を「等しい」と置くことで、入力電圧から出力電圧を決める関係式 — すなわち伝達特性 — を導きます。

伝達特性(VTC)の導出

出発点はキルヒホッフの電流則ただ1本

CMOSインバータの直流動作を決める式は、驚くほど単純です。出力ノードに外部から電流を引き出す負荷がない(次段はMOSFETのゲート=容量なので直流電流は流れない)とすると、出力ノードに流れ込む電流と流れ出す電流が釣り合うだけです。

$$ \begin{equation} I_{DP}(V_{in}, V_{out}) = I_{DN}(V_{in}, V_{out}) \end{equation} $$

与えられた $V_{in}$ に対してこの式を $V_{out}$ について解けば、伝達特性 $V_{out} = f(V_{in})$ が得られます。これを VTC(Voltage Transfer Characteristic) と呼びます。

グラフィカルに考えると理解しやすくなります。$V_{out}$ を横軸にとって、NMOSの $I_{DN}$($V_{out}$ の増加関数)とPMOSの $I_{DP}$($V_{out}$ の減少関数)を同じ平面に描くと、両者は必ず1点で交わります。この交点が動作点です。$V_{in}$ を変えると2本の曲線が上下に動き、交点が左右に移動していく — その軌跡がVTCです。$I_{DN}$ が単調増加、$I_{DP}$ が単調減少なので、交点は常に一意に存在します。だからCMOSインバータの直流解は一意で、後述の数値解法(brentq)が確実に収束します。

NMOSとPMOSの電流曲線の交点が動作点になること、その交点を並べたものが伝達特性になることを示すグラフ

左が実際にやってみた結果です。$V_{in}$ を $0.7$ / $0.9$ / $1.1$ V と変えると、実線(NMOS)は上へ、破線(PMOS)は下へ動き、赤丸の交点が $V_{out}=1.72 \to 0.90 \to 0.08$ V と大きく左へ移動します。入力をわずか $0.4$ V 動かしただけで出力が $1.64$ V も振れる — これがインバータの利得の正体です。右はその交点を $V_{in}$ に対して並べたもので、まさにVTCそのものになっています。図から、交点は常に1つしかないこと(曲線が一方は増加・他方は減少だから)も見て取れます。

5つの動作領域

$V_{in}$ を $0$ から $V_{DD}$ までゆっくり上げていくと、NMOSとPMOSの動作領域の組み合わせが5通りに移り変わります。ここでは $V_{THN} < V_{DD}/2$ かつ $|V_{THP}| < V_{DD}/2$(両方が同時にオンする窓が存在する、通常のケース)を仮定します。

領域 入力範囲 NMOS PMOS 出力
1 $0 \le V_{in} < V_{THN}$ 遮断 線形 $V_{out} = V_{DD}$
2 $V_{THN} \le V_{in} < V_M$ 飽和 線形 高いが下がり始める
3 $V_{in} = V_M$ 飽和 飽和 急降下(ほぼ垂直)
4 $V_M < V_{in} \le V_{DD}-\lvert V_{THP}\rvert$ 線形 飽和 低い
5 $V_{in} > V_{DD}-\lvert V_{THP}\rvert$ 線形 遮断 $V_{out} = 0$

CMOSインバータの伝達特性に5つの動作領域の境界線と反転点を重ねたグラフ

この表を絵にすると上のようになります。左端の帯(領域1)と右端の帯(領域5)で出力が $1.8$ V と $0$ V に完全に張り付いていること、中央の $V_M=0.900$ V でVTCがほとんど垂直に落ちていることが一目でわかります。赤い点線(NMOSの飽和/線形境界)と緑の点線(PMOSの飽和/線形境界)がVTCと交わるのは $V_{in}=0.909$ V と $0.891$ V で、両者に挟まれたわずか $18$ mV の幅が「両方が飽和している領域3」です。この極端に狭い窓の中で出力が $1.29$ V から $0.51$ V まで落ちる — 領域3が急峻さの正体だ、ということが数値としてはっきりします。

以下、領域ごとに式を解いていきます。

領域1: 出力は厳密に $V_{DD}$

$V_{in} < V_{THN}$ ではNMOSが遮断で $I_{DN} = 0$。したがって $I_{DP} = 0$ でなければなりません。PMOSはオンしているので、$I_{DP} = 0$ となるのは $V_{DD}-V_{out} = 0$ のときだけです。よって

$$ V_{out} = V_{DD} $$

これがフルスイングの数学的な根拠です。抵抗負荷型と違って、$V_{OH}$ が素子寸法にまったく依存しません。

領域5: 出力は厳密に $0$

対称性からすぐわかります。$V_{in} > V_{DD}-|V_{THP}|$ ではPMOSが遮断で $I_{DP} = 0$。NMOSは線形領域でオンしており、$I_{DN} = k_n(V_{ov,n}V_{out} – V_{out}^2/2) = 0$ を満たす解は $V_{out} = 0$ のみです。よって $V_{OL} = 0$。

領域2: NMOS飽和・PMOS線形

ここからが本題です。NMOSが飽和、PMOSが線形なので(チャネル長変調はいったん無視します)、

$$ \frac{k_n}{2}\left(V_{in}-V_{THN}\right)^2 = k_p\left[V_{ov,p}(V_{DD}-V_{out}) – \frac{(V_{DD}-V_{out})^2}{2}\right] $$

見通しをよくするため、$u = V_{DD}-V_{out}$(PMOSのソース・ドレイン間電圧)と $A = V_{ov,p} = V_{DD}-V_{in}-|V_{THP}|$ とおきます。すると右辺は $u$ の2次式です。

$$ k_p\left(Au – \frac{u^2}{2}\right) = \frac{k_n}{2}(V_{in}-V_{THN})^2 $$

両辺を $k_p/2$ で割って整理すると、$u$ についての標準的な2次方程式になります。

$$ u^2 – 2Au + \frac{k_n}{k_p}(V_{in}-V_{THN})^2 = 0 $$

解の公式を使うと $u = A \pm \sqrt{A^2 – (k_n/k_p)(V_{in}-V_{THN})^2}$ の2つが出ますが、PMOSが線形領域にいる条件は $u < A$ なので、マイナス符号の根を採用します。

$$ u = A – \sqrt{A^2 – \frac{k_n}{k_p}(V_{in}-V_{THN})^2} $$

最後に $V_{out} = V_{DD}-u$ に戻すと、領域2のVTCが閉じた形で書けます。

$$ \begin{equation} V_{out} = V_{DD} – \left(V_{DD}-V_{in}-|V_{THP}|\right) + \sqrt{\left(V_{DD}-V_{in}-|V_{THP}|\right)^2 – \frac{k_n}{k_p}\left(V_{in}-V_{THN}\right)^2} \end{equation} $$

平方根の中身に注目してください。$V_{in}$ が上がるにつれて第1項 $A^2$ は減り、第2項 $(k_n/k_p)(V_{in}-V_{THN})^2$ は増えるので、根号の中身は急速に小さくなります。根号がゼロになる点こそが、次に扱う「両方飽和」の点です。

領域4: NMOS線形・PMOS飽和

$V_{in} \to V_{DD}-V_{in}$、$V_{out} \to V_{DD}-V_{out}$ の置き換え対称性を使えば、計算をやり直す必要はありません。念のため直接書くと、

$$ k_n\left[(V_{in}-V_{THN})V_{out} – \frac{V_{out}^2}{2}\right] = \frac{k_p}{2}\left(V_{DD}-V_{in}-|V_{THP}|\right)^2 $$

$B = V_{in}-V_{THN}$ とおいて $V_{out}$ の2次方程式に整理すると、

$$ V_{out}^2 – 2BV_{out} + \frac{k_p}{k_n}\left(V_{DD}-V_{in}-|V_{THP}|\right)^2 = 0 $$

NMOSが線形にいる条件 $V_{out} < B$ から、やはりマイナス符号の根を取ります。

$$ \begin{equation} V_{out} = \left(V_{in}-V_{THN}\right) – \sqrt{\left(V_{in}-V_{THN}\right)^2 – \frac{k_p}{k_n}\left(V_{DD}-V_{in}-|V_{THP}|\right)^2} \end{equation} $$

領域2の式と領域4の式は、$V_{DD}$ を軸にした鏡像の関係になっています。

領域3: 両方飽和 — VTCが垂直になる理由

$V_{in}$ をさらに上げると、領域2の平方根の中身がゼロになり、それ以上は実数解が存在しなくなります。この点で何が起きているのでしょうか。

チャネル長変調を無視した平方則では、飽和領域の電流は $V_{out}$ にまったく依存しません。両方が飽和にいるとき、KCLの式は

$$ \frac{k_n}{2}(V_{in}-V_{THN})^2 = \frac{k_p}{2}(V_{DD}-V_{in}-|V_{THP}|)^2 $$

となり、$V_{out}$ が式から完全に消えてしまいます。つまりこの条件を満たす特定の $V_{in}$ では、$V_{out}$ が「どの値でもよい」ことになり、VTCは垂直線になります。逆に言えば、その $V_{in}$ からほんの少しでもずれると、両辺のバランスが崩れて出力が一気に反対のレールへ飛びます。理想スイッチそのものです。

現実には $\lambda \ne 0$ なので飽和電流もわずかに $V_{out}$ に依存し、VTCは垂直ではなく「非常に急峻な有限の傾き」を持ちます。この傾きこそが利得であり、後で定量的に求めます。

ここまでで、5領域それぞれのVTCが手に入りました。次は、この曲線の中で最も重要な1点 — 垂直に落ちる位置 $V_M$ — を求めます。設計で直接コントロールできるのは、実質この1点だけだからです。

反転点 $V_M$ の導出とW/L比による設計

「入力と出力が等しくなる点」という定義

反転点(switching threshold、logic threshold)$V_M$ は、$V_{out} = V_{in}$ となる点として定義されます。VTC上で $V_{out} = V_{in}$ の45度線と交わる点、と言い換えてもよいでしょう。この点でインバータは「入力を上げるべきか下げるべきか決めかねている」状態、すなわち最も不安定な平衡点にいます。

なぜこの点が特別かというと、インバータをアナログ的に見たときの最大利得の動作点であり、ディジタル的に見たときの論理の閾値だからです。入力が $V_M$ より少しでも高ければ出力はLowへ、少しでも低ければ出力はHighへ振り切ります。

導出

$V_{out} = V_{in} = V_M$ とすると、$V_M$ は $V_{THN}$ より高く $V_{DD}-|V_{THP}|$ より低いので、NMOSは $V_{DS} = V_M \ge V_M – V_{THN}$ より飽和、PMOSも同様に飽和です。よって領域3の式が使えます。

$$ \frac{k_n}{2}(V_M-V_{THN})^2 = \frac{k_p}{2}\left(V_{DD}-V_M-|V_{THP}|\right)^2 $$

両辺は完全平方なので、平方根を取れます。$V_M > V_{THN}$ かつ $V_{DD}-V_M > |V_{THP}|$ より両側の括弧の中身は正なので、符号を気にせず

$$ \sqrt{k_n}\,(V_M-V_{THN}) = \sqrt{k_p}\,\left(V_{DD}-V_M-|V_{THP}|\right) $$

ここで、両辺を $\sqrt{k_n}$ で割り、駆動力比 $r$ を導入します。

$$ r \equiv \sqrt{\frac{k_p}{k_n}} = \sqrt{\frac{\mu_p (W/L)_p}{\mu_n (W/L)_n}} $$

すると式は $V_M-V_{THN} = r\left(V_{DD}-V_M-|V_{THP}|\right)$ となります。$V_M$ を含む項を左辺に集めると、

$$ V_M(1+r) = V_{THN} + r\left(V_{DD}-|V_{THP}|\right) $$

両辺を $(1+r)$ で割って、目的の式が得られます。

$$ \begin{equation} \boxed{\ V_M = \frac{V_{THN} + r\left(V_{DD}-|V_{THP}|\right)}{1+r}, \qquad r = \sqrt{\frac{k_p}{k_n}}\ } \end{equation} $$

式の読み方 — 加重平均としての $V_M$

この式は「$V_{THN}$ と $V_{DD}-|V_{THP}|$ の重み付き平均(重みは $1$ と $r$)」という形をしています。とても解釈しやすい形です。

  • $r \to 0$(PMOSが極端に弱い)なら $V_M \to V_{THN}$。NMOSが少しでもオンすれば勝ってしまうので、閾値がNMOSのしきい値まで下がります
  • $r \to \infty$(PMOSが極端に強い)なら $V_M \to V_{DD}-|V_{THP}|$。PMOSが切れる直前まで出力はHighを保ちます
  • $r = 1$(駆動力が等しい)なら $V_M = \dfrac{V_{THN}+V_{DD}-|V_{THP}|}{2}$。さらに $V_{THN} = |V_{THP}|$ なら $V_M = V_{DD}/2$ ちょうど

多くの標準セルライブラリは $V_M = V_{DD}/2$ を目標にします。ノイズマージンが上下対称になり、立ち上がり遅延と立ち下がり遅延も揃うからです。

W/L比の決め方

$V_M = V_{DD}/2$($V_{THN}=|V_{THP}|$ のとき)には $r = 1$、すなわち $k_p = k_n$ が必要です。$k = \mu C_{ox}(W/L)$ だったので、

$$ \mu_p C_{ox}\left(\frac{W}{L}\right)_p = \mu_n C_{ox}\left(\frac{W}{L}\right)_n \quad\Longrightarrow\quad \frac{(W/L)_p}{(W/L)_n} = \frac{\mu_n}{\mu_p} $$

シリコンでは電子の移動度が正孔の $2\sim3$ 倍あるので、PMOSをNMOSの $2\sim3$ 倍の幅にするのが定石です。レイアウト図でPチャネル側のトランジスタが太く描かれているのは、これが理由です。

PMOSのW/L比を変えたときのVTCの移動と、反転点が寸法比の平方根でしか動かないことを示すグラフ

左が $(W/L)_p$ を $1$ から $12$ まで振ったときのVTC群です。PMOSを太くするほど「出力Highを維持する力」が強まり、曲線は右へずれていきます。右のグラフでは数値解(丸)と加重平均の理論式(四角)が全域で重なっており、導いた閉形式が正しいことが確認できます。そして緑の縦線 $(W/L)_p/(W/L)_n = \mu_n/\mu_p = 2.5$ が、ちょうど赤い横線 $V_{DD}/2=0.9$ V と交差しています。設計の定石が式から出てくる瞬間です。

ここで大事な注意があります。$V_M$ は $r$ の平方根を通してしか効かないので、$V_M$ は素子寸法の変動に鈍感です。たとえば $r$ を2倍にしても($W_p$ を4倍にしても)、$V_{DD}=1.8$ V、$V_{THN}=|V_{THP}|=0.4$ V のケースで $V_M$ は $0.900$ V から $1.067$ V へ、わずか $0.17$ V 動くだけです。この鈍感さこそCMOSが「レシオレス」と呼ばれる所以で、製造ばらつきに強い理由でもあります。

反転点の位置が決まりました。次は、その点でVTCがどれだけ急峻か — 利得 — を求めます。急峻さこそがディジタル回路の「信号を再生する力」の源だからです。

遷移領域の利得

なぜ利得が必要なのか — 信号の再生

ディジタル回路は、多少劣化した信号を受け取っても、次段の出力ではきれいな $0$ / $V_{DD}$ に戻ります。この性質を 再生性(regeneration) と呼びます。もしゲートを何段も通すたびに信号が少しずつ劣化していったら、深い論理段数の回路は成立しません。

再生性の条件は、実は「遷移領域の利得の大きさが1より大きいこと」です。直感的には、入力の $\Delta$ のずれが出力では $|A_v|\Delta$ に拡大され、それが次段の入力に入るとさらに拡大され…という反復が、正しいレール($0$ か $V_{DD}$)へ収束するかどうか、という話です。$|A_v| > 1$ なら、レールから離れた中間状態は不安定な平衡点となって必ず追い出されます。逆に $|A_v| < 1$ だと中間状態が安定になり、ゲートは論理ゲートとして機能しません。

小信号解析による導出

$V_M$ 付近では両トランジスタが飽和領域にいます。チャネル長変調を含めた飽和電流は

$$ I_{DN} = \frac{k_n}{2}(V_{in}-V_{THN})^2(1+\lambda_n V_{out}), \quad I_{DP} = \frac{k_p}{2}(V_{DD}-V_{in}-|V_{THP}|)^2(1+\lambda_p (V_{DD}-V_{out})) $$

KCL $I_{DN} = I_{DP}$ の両辺を $V_{in}$ で全微分します。$I_{DN}$ は $V_{in}$ と $V_{out}$ の両方の関数なので、連鎖律から

$$ \frac{\partial I_{DN}}{\partial V_{in}} + \frac{\partial I_{DN}}{\partial V_{out}}\frac{dV_{out}}{dV_{in}} = \frac{\partial I_{DP}}{\partial V_{in}} + \frac{\partial I_{DP}}{\partial V_{out}}\frac{dV_{out}}{dV_{in}} $$

ここで、標準的な小信号パラメータを次のように定義します。$g_m$ は相互コンダクタンス(入力の効き)、$g_d$ は出力コンダクタンス(出力の効き=有限出力抵抗)です。

$$ g_{mn} = \frac{\partial I_{DN}}{\partial V_{in}} = k_n(V_M-V_{THN})(1+\lambda_n V_M), \qquad g_{dn} = \frac{\partial I_{DN}}{\partial V_{out}} = \frac{\lambda_n k_n}{2}(V_M-V_{THN})^2 $$

PMOS側は、$I_{DP}$ が $V_{in}$ の減少関数、$V_{out}$ の減少関数であることに注意して符号を付けます。

$$ \frac{\partial I_{DP}}{\partial V_{in}} = -g_{mp}, \qquad \frac{\partial I_{DP}}{\partial V_{out}} = -g_{dp} $$

$$ g_{mp} = k_p(V_{DD}-V_M-|V_{THP}|)(1+\lambda_p(V_{DD}-V_M)), \qquad g_{dp} = \frac{\lambda_p k_p}{2}(V_{DD}-V_M-|V_{THP}|)^2 $$

これらを全微分の式に代入して $dV_{out}/dV_{in}$ について解くと、

$$ g_{mn} + g_{dn}A_v = -g_{mp} – g_{dp}A_v \quad\Longrightarrow\quad A_v(g_{dn}+g_{dp}) = -(g_{mn}+g_{mp}) $$

したがって、遷移領域の利得は次の形になります。

$$ \begin{equation} A_v = \left.\frac{dV_{out}}{dV_{in}}\right|_{V_M} = -\frac{g_{mn}+g_{mp}}{g_{dn}+g_{dp}} \end{equation} $$

分子は「入力の効きの合計」、分母は「出力の内部漏れの合計」 です。NMOSとPMOSが両方とも出力を引っ張るので $g_m$ は足し算になり、これがCMOSインバータがアナログアンプとして高い利得を持つ理由でもあります。

対称インバータでの簡単な形

$V_M$ では $I_{DN} = I_{DP} = I_D$ なので、$g_{mn} = 2I_D/(V_M-V_{THN})$、$g_{dn} = \lambda_n I_D/(1+\lambda_n V_M)$ のように、共通因子 $I_D$ で括れます。$\lambda_n = \lambda_p = \lambda$ かつ $V_M = V_{DD}/2$ の対称なケースでは $\lambda_n V_M = \lambda_p(V_{DD}-V_M)$ なので整理が進み、

$$ A_v = -\frac{2\left(1+\lambda V_{DD}/2\right)}{2\lambda}\left(\frac{1}{V_M-V_{THN}} + \frac{1}{V_{DD}-V_M-|V_{THP}|}\right) $$

$V_{DD}=1.8$ V、$V_{THN}=|V_{THP}|=0.4$ V、$\lambda = 0.1$ V$^{-1}$ を代入すると $V_M-V_{THN} = 0.5$ V なので、

$$ A_v = -\frac{2 \times 1.09}{0.2}\times\left(\frac{1}{0.5}+\frac{1}{0.5}\right) = -10.9 \times 4 = -43.6 $$

後のPython実装で数値的に求めた VTC の傾きも $-43.6$ となり、完全に一致します。$|A_v| \approx 44 \gg 1$ なので再生性は十分です。

なお、$\lambda \to 0$ の理想極限では $|A_v| \to \infty$、すなわちVTCは垂直になります。有限の利得は「チャネル長変調という非理想性の代償」だと理解しておくとすっきりします。微細プロセスでは $\lambda$ が大きくなる(短チャネル効果)ため利得は下がり、$V_{DD}$ を下げると $V_M-V_{TH}$ が縮んで利得は上がる(ただし後述のように遅くなる)という、相反する傾向があります。

利得の大きさがわかれば、VTC上で傾きが $-1$ になる2点を特定でき、そこからノイズマージンが定義できます。次節でその手続きを見ていきましょう。

ノイズマージン

どこまでのノイズなら「無視してよい」か

配線が隣り合っていればクロストークが乗り、電源には $Ldi/dt$ のリプルが乗り、宇宙線が通れば一過性のグリッチが出ます。ディジタル回路が動くのは、これらのノイズが「論理を反転させるほどではない」からです。その余裕を数値化したものが ノイズマージン です。

余裕を測るには、まず「どこまでが論理0で、どこからが論理1か」の境界を決める必要があります。CMOSインバータでは、この境界を VTCの傾きが $-1$ になる点 として定義します。

なぜ傾き $-1$ が境界なのか

傾きの絶対値が1より小さい領域では、入力の変動 $\Delta V_{in}$ は出力では $|A_v|\Delta V_{in} < \Delta V_{in}$ に縮小されます。つまりノイズが減衰する「安全な」領域です。逆に傾きの絶対値が1を超える領域では、変動が拡大されてしまいます。だから傾きがちょうど $-1$ になる点が、安全域と危険域の境界としてもっとも自然です。

そこで次の4つの量を定義します。

$$ \begin{aligned} V_{OH} &= V_{out}(V_{in}=0) \quad \text{(出力Highレベル)}\\ V_{OL} &= V_{out}(V_{in}=V_{DD}) \quad \text{(出力Lowレベル)}\\ V_{IL} &: \left.\frac{dV_{out}}{dV_{in}}\right|_{V_{IL}} = -1 \ \text{ を満たす低い方の入力電圧}\\ V_{IH} &: \left.\frac{dV_{out}}{dV_{in}}\right|_{V_{IH}} = -1 \ \text{ を満たす高い方の入力電圧} \end{aligned} $$

$V_{IL}$ は「これ以下なら確実に論理0として受け取られる入力の上限」、$V_{IH}$ は「これ以上なら確実に論理1として受け取られる入力の下限」です。ノイズマージンは、前段の出力レベルと後段の入力許容レベルの差として定義されます。

$$ \begin{equation} NM_L = V_{IL} – V_{OL}, \qquad NM_H = V_{OH} – V_{IH} \end{equation} $$

$NM_L$ は「Low信号がどれだけ持ち上げられても大丈夫か」、$NM_H$ は「High信号がどれだけ引き下げられても大丈夫か」を表します。

$V_{IL}$ を求める条件式

$V_{IL}$ は領域2(NMOS飽和・PMOS線形)にあります。この領域のKCLの式

$$ \frac{k_n}{2}(V_{in}-V_{THN})^2 = k_p\left[V_{ov,p}(V_{DD}-V_{out}) – \frac{(V_{DD}-V_{out})^2}{2}\right] $$

の両辺を $V_{in}$ で微分します。左辺は素直に

$$ \text{左辺}’ = k_n(V_{in}-V_{THN}) $$

右辺は $V_{ov,p} = V_{DD}-V_{in}-|V_{THP}|$ と $(V_{DD}-V_{out})$ の両方が $V_{in}$ に依存することに注意します。$d(V_{DD}-V_{out})/dV_{in} = -V_{out}’$ を使うと、

$$ \text{右辺}’ = k_p\left[-(V_{DD}-V_{out}) – V_{ov,p}V_{out}’ + (V_{DD}-V_{out})V_{out}’\right] $$

ここで $V_{out}’ = -1$ を代入すると、$-V_{ov,p}V_{out}’ = V_{ov,p}$、$(V_{DD}-V_{out})V_{out}’ = -(V_{DD}-V_{out})$ となり、

$$ \text{右辺}’ = k_p\left[V_{ov,p} – 2(V_{DD}-V_{out})\right] $$

したがって $V_{IL}$ とそのときの出力 $V_{out}$ は、次の連立方程式の解です。

$$ \begin{equation} k_n(V_{IL}-V_{THN}) = k_p\left[\left(V_{DD}-V_{IL}-|V_{THP}|\right) – 2\left(V_{DD}-V_{out}\right)\right] \end{equation} $$

これと領域2のKCLの式を連立して解きます。手計算では4次方程式になって扱いにくいので、実務では数値的に解きます(後のPython実装でそうします)。$V_{IH}$ は上下対称の議論から、領域4のKCLとその微分条件の連立で同様に求まります。

区分線形近似 — 手計算で見積もる

厳密解の前に、設計初期の見積もりに便利な近似を示します。遷移領域を「$(V_M, V_M)$ を通る傾き $A_v$ の直線」で置き換えてしまう方法です。

$$ V_{out} \approx V_M + A_v(V_{in}-V_M) $$

この直線が $V_{out} = V_{DD}$ に達する入力を $V_{IL}$、$V_{out}=0$ に達する入力を $V_{IH}$ と見なすと、

$$ V_{IL} \approx V_M – \frac{V_{DD}-V_M}{|A_v|}, \qquad V_{IH} \approx V_M + \frac{V_M}{|A_v|} $$

対称インバータ($V_M = V_{DD}/2$、$V_{OH}=V_{DD}$、$V_{OL}=0$)では両方のノイズマージンが等しくなり、

$$ NM_L = NM_H \approx \frac{V_{DD}}{2}\left(1 – \frac{1}{|A_v|}\right) $$

この形は示唆に富みます。利得が無限大なら、ノイズマージンは $V_{DD}/2$ という理論上限に到達する。CMOSインバータは、利得が数十あるおかげで理論上限の $95\%$ 以上を実現しているわけです。$V_{DD}=1.8$ V、$|A_v|=43.6$ なら $NM \approx 0.9 \times (1-0.0229) = 0.879$ V となります。

ただしこの近似は少し楽観的です。実際には $V_{IL}$ の時点で出力はまだ $V_{DD}$ には達しておらず(後の数値計算では $1.675$ V)、遷移領域の外側で曲線が寝ているぶん $V_{IL}$ は近似値より小さくなります。厳密に数値で解くと $V_{IL}=0.755$ V、$V_{IH}=1.045$ V、$NM_L = NM_H = 0.755$ V($V_{DD}$ の $41.9\%$)です。区分線形近似は真値を $16\%$ ほど過大評価するので、「オーダー感を掴む道具」として使い、最終判断は数値解で行うのが正しい使い方です。

伝達特性上のノイズマージンの図示と、傾きが-1になる2点でV_ILとV_IHが定まることを示す利得曲線

左が定義そのものの図です。緑の帯(Lowとして安全に受け取れる範囲)と赤の帯(Highとして安全に受け取れる範囲)がそれぞれ $V_{DD}$ の $42\%$ を占め、合計 $84\%$。「どちらとも決めかねる」グレーゾーンは中央の $16\%$ しかありません。右の利得曲線を見ると、$V_M=0.90$ V を中心に $-43.6$ の鋭いピークが立ち、そこから少し離れただけで傾きが $-1$ を横切ります(赤丸)。レール付近では利得ほぼ $0$、中央では利得 $44$ というこの極端な非線形性が、雑音を切り捨てつつ信号を再生する仕組みそのものです。

それでも $0.755$ V という値は圧倒的です。同じ電源電圧のバイポーラECLロジックのノイズマージンが $0.15$ V 程度であることと比べると、CMOSが劣悪な環境でも動く理由がよくわかります。

論理レベルの安全余裕がわかりました。次は、この回路が「いつ、どれだけ」電力を消費するのかを分解していきます。

消費電力の3成分分解

CMOS回路の消費電力は、次の3つの独立な成分に分解できます。

$$ \begin{equation} P_{total} = \underbrace{\alpha C_L V_{DD}^2 f}_{\text{動的(スイッチング)}} + \underbrace{P_{short}}_{\text{貫通電流}} + \underbrace{I_{leak}V_{DD}}_{\text{リーク}} \end{equation} $$

順に導出していきます。

動的消費電力 $\alpha C_LV_{DD}^2 f$

出力ノードには、次段のゲート容量・自己容量・配線容量を合わせた 負荷容量 $C_L$ がぶら下がっています。出力がLowからHighへ遷移するとき、$C_L$ は $0$ から $V_{DD}$ まで充電されます。このとき電源から取り出されるエネルギーは、電源電圧が一定なので

$$ E_{supply} = \int_0^{\infty} V_{DD}\, i(t)\, dt = V_{DD}\int_0^{V_{DD}} C_L\, dV_{out} = C_L V_{DD}^2 $$

積分変数を時間から $V_{out}$ へ変えるところで $i = C_L\, dV_{out}/dt$ を使いました。一方、容量に蓄えられるエネルギーは

$$ E_{cap} = \int_0^{\infty} V_{out}\, i(t)\, dt = \int_0^{V_{DD}} C_L V_{out}\, dV_{out} = \frac{1}{2}C_L V_{DD}^2 $$

差し引き $E_{supply}-E_{cap} = \frac{1}{2}C_LV_{DD}^2$ がPMOSのチャネル抵抗で熱になります。ここで驚くべきことに、この損失はPMOSの抵抗値にまったく依存しません。抵抗を小さくすれば電流は増えますが充電時間が短くなり、$\int i^2 R\,dt$ はぴったり相殺します。トランジスタを大きくしても、この損失は減らないのです。

続いてHighからLowへの遷移では、電源からは何も取り出されず、容量に蓄えられていた $\frac{1}{2}C_LV_{DD}^2$ がNMOSのチャネル抵抗ですべて熱になります。したがって、Low→High→Low の1往復あたり電源が供給するエネルギーは $C_LV_{DD}^2$ です。

クロック周波数 $f$ で、ノードが1クロックあたり平均 $\alpha$ 回だけ Low→High 遷移すると仮定します($\alpha$ を 活性化率(activity factor) と呼び、典型的なランダム論理で $0.1 \sim 0.2$、クロック配線では $1$)。すると

$$ P_{dyn} = \alpha C_L V_{DD}^2 f $$

$V_{DD}$ の2乗で効くという点が決定的に重要です。電源電圧を半分にすれば電力は $1/4$ になります。1990年代以降、プロセス世代ごとに電源電圧が $5$ V → $3.3$ V → $1.8$ V → $1.2$ V …と下げられてきた最大の動機がこれです。

具体的に計算してみましょう。$C_L = 50$ fF、$V_{DD}=1.8$ V、$f = 1$ GHz、$\alpha = 0.15$ なら

$$ P_{dyn} = 0.15 \times 50\times10^{-15} \times 1.8^2 \times 10^9 = 24.3\ \mu\text{W} $$

ゲート1個で $24\ \mu$W。これが1億ゲート分あれば $2.4$ kW になる計算で、大規模チップで電力が最大の制約になる事情が実感できます。

貫通電流(短絡電流)$P_{short}$

理想的なステップ入力なら、NMOSとPMOSが同時にオンする瞬間は幅ゼロで、貫通電流は流れません。しかし現実の入力は有限の時間 $\tau$ をかけて遷移します。その間、$V_{THN} < V_{in} < V_{DD}-|V_{THP}|$ を満たす区間では 両方が同時にオン し、$V_{DD}$ からグラウンドへ、負荷容量を経由しない電流が直接流れます。これが貫通電流です。

Veendrickの古典的なモデルでは、負荷容量が小さく出力が入力に追随する($V_{out} \approx V_M$ を保つ)状況を考えます。このとき電流は、飽和領域にいる側のトランジスタで律速されます。入力ランプ $V_{in}(t) = V_{DD}\,t/\tau$ を仮定し、対称インバータ($k_n=k_p=k$、$V_{THN}=|V_{THP}|=V_T$、$V_M=V_{DD}/2$)とします。

$V_T < V_{in} < V_{DD}/2$ ではNMOSが飽和で律速するので $I = \frac{k}{2}(V_{in}-V_T)^2$、$V_{DD}/2 < V_{in} < V_{DD}-V_T$ ではPMOSが律速して $I = \frac{k}{2}(V_{DD}-V_{in}-V_T)^2$ です。この2区間は $V_{DD}/2$ に関して対称なので、片方を計算して2倍すれば済みます。

時間積分を入力電圧の積分に変換します。$dt = (\tau/V_{DD})\,dV_{in}$ を使うと、1回の遷移で流れる電荷は

$$ Q_{sc} = 2\int_{V_T}^{V_{DD}/2}\frac{k}{2}\left(V_{in}-V_T\right)^2 \frac{\tau}{V_{DD}}\,dV_{in} = \frac{k\tau}{V_{DD}}\cdot\frac{1}{3}\left(\frac{V_{DD}}{2}-V_T\right)^3 $$

括弧の中を $\frac{V_{DD}-2V_T}{2}$ と書き直して3乗を展開すると分母に $8$ が出るので、

$$ Q_{sc} = \frac{k\tau\left(V_{DD}-2V_T\right)^3}{24\,V_{DD}} $$

1周期には立ち上がりと立ち下がりの2回の遷移があるので、平均電流はこの2倍を周期 $T = 1/f$ で割った値です。電力に直すと、

$$ \begin{equation} P_{short} = \frac{k\left(V_{DD}-2V_T\right)^3}{12}\cdot\frac{\tau}{T} \end{equation} $$

この式から3つの重要な設計指針が読み取れます。

  1. 入力の遷移時間 $\tau$ に比例する。鈍った信号を受けるゲートほど貫通電流で損をします。だから設計ルールでは「立ち上がり時間の上限」が規定されます
  2. $(V_{DD}-2V_T)^3$ という3乗で効く。$V_{DD}$ が $2V_T$ に近づくと貫通電流は急激に消えます。低電圧動作では貫通電流はほぼ問題になりません
  3. 周期 $T$ に反比例する。高速動作ほど不利ですが、$\tau$ も同時にスケールするなら比 $\tau/T$ は一定に保てます

入力ランプ中の貫通電流波形と、貫通電荷が入力遷移時間に正比例することを示すグラフ

左の波形が、この3つの指針の理由をそのまま見せています。$\tau$ を $50$ ps から $400$ ps へ8倍に伸ばしても、ピークの高さは $54.5\ \mu$A のまま変わらず、ベル型の幅だけが8倍に広がっています。ピーク値は $V_M$ での飽和電流で決まるので入力の傾きとは無関係、というわけです。面積(=電荷)が幅に比例するのだから、$Q_{sc} \propto \tau$ は当然の帰結になります。右のグラフはそれを直接確かめたもので、数値解もVeendrick式も原点を通る直線です。右軸を見ると、$\tau=100$ ps なら往復2回でも動的電荷の $2.4\%$ にすぎませんが、$\tau$ が $400$ ps を超えると設計目安の $10\%$ に達してしまうことがわかります。

数値で確認すると、$k = 400\ \mu$A/V$^2$、$V_{DD}=1.8$ V、$V_T=0.4$ V、$\tau = 100$ ps で $Q_{sc} = 0.93$ fC(数値解では $1.07$ fC、差はチャネル長変調によるもの)。一方、動的スイッチングの電荷は $C_LV_{DD} = 90$ fC です。往復2回分の貫通電荷を足しても動的電荷の約 $2.4\%$ にとどまります。適切に設計されたCMOS回路では、貫通電流は動的電力の $10\%$ 未満に抑えるのが目安とされ、この数値はその範囲に収まっています。

リーク電力 $I_{leak}V_{DD}$

前節で見たサブスレッショルド電流に加え、ドレイン・基板間の逆バイアス接合リーク、薄いゲート酸化膜を通るゲートトンネルリーク、そして短チャネル素子で顕著な GIDL(Gate Induced Drain Leakage)が寄与します。

本記事のモデルパラメータ($n=1.3$、$V_{TH}=0.4$ V)でサブスレッショルド電流を評価すると、$V_{in}=0$ のときNMOSに流れるリークは $I_{leak}\approx 1.7$ pA、リーク電力は $3.0$ pW です。動的電力 $24.3\ \mu$W と比べれば無視できる大きさです。

しかしこれは $V_{TH} = 0.4$ V という「高め」のしきい値だから成り立つ話です。速度を上げるために $V_{TH}$ を $0.2$ V に下げると、リークは $10^{0.2/0.078} \approx 370$ 倍(数値解では $371$ 倍、リーク電力は $2.98$ pW から $1.11$ nW へ)に増えます。さらに温度が上がると $\phi_t \propto T$ を通じて指数の分母が大きくなり、リークは急増します。動作周波数が低いモバイル機器や、待機時間が長い宇宙機の機器では、リークが総消費電力の支配項になることが珍しくありません。$V_{TH}$ の選択は「速度 vs リーク」の直接のトレードオフであり、現代のプロセスが複数の $V_{TH}$ を用意している(マルチ $V_{TH}$ 設計)のはこのためです。

動的・貫通・リークの3成分の周波数依存と、1GHz動作時の成分別の大きさを比較した対数グラフ

左のグラフが3成分の役割分担を一望させてくれます。動的電力と貫通電力は $f$ に比例するので両対数上では平行な直線、リークは周波数によらず水平線です。したがって低周波側ではリークが、高周波側では動的電力が支配するという構造になり、両者が交差する周波数がこのインバータの「損益分岐点」です。$V_{TH}=0.4$ V なら交点は $120$ Hz 付近ですが、$V_{TH}=0.2$ V まで下げると $46$ kHz 付近まで一気に上がります。右のグラフは $1$ GHz 動作時の成分別の大きさで、動的 $24.3\ \mu$W に対し貫通は $0.58\ \mu$W($2.4\%$)、リークは $V_{TH}=0.4$ V なら $2.98$ pW と桁違いに小さい。しかし $V_{TH}=0.2$ V にすると $1.11$ nW へ $371$ 倍に増えており、低しきい値化のコストが目に見えます。

電力の内訳が明らかになりました。しかし電力の議論は「どれだけ速く動かすか」と切り離せません。次は速度、すなわち伝搬遅延を導出します。

伝搬遅延の導出

定義

伝搬遅延 $t_p$ は、入力が $V_{DD}/2$ を横切ってから出力が $V_{DD}/2$ を横切るまでの時間です。出力がHighからLowへ落ちる場合を $t_{pHL}$、LowからHighへ上がる場合を $t_{pLH}$ と書き、平均を $t_p = (t_{pHL}+t_{pLH})/2$ とします。

$50\%$ 点を基準にするのは、遷移の始まりや終わりが漸近的で定義しづらいのに対し、中点なら明確に決まるからです。

積分による厳密な導出

入力が $V_{DD}$ にステップ変化した直後を考えます。PMOSは即座に遮断され、NMOSだけが $C_L$ を放電します。出力ノードの電荷保存則は

$$ C_L\frac{dV_{out}}{dt} = -I_{DN}(V_{DD}, V_{out}) $$

変数分離して積分すると、$V_{out}$ が $V_{DD}$ から $V_{DD}/2$ まで落ちる時間が求まります。

$$ \begin{equation} t_{pHL} = \int_{V_{DD}/2}^{V_{DD}} \frac{C_L}{I_{DN}(V_{DD}, V_{out})}\,dV_{out} \end{equation} $$

この積分を実行するには、NMOSの動作領域が途中で切り替わることに注意します。ゲート電圧は $V_{DD}$ に固定されているので、オーバードライブは $V_{ov} = V_{DD}-V_{THN}$ で一定です。したがって、

  • $V_{out} > V_{ov}$ のあいだ:飽和領域、電流は一定値 $I_{sat} = \frac{k_n}{2}V_{ov}^2$
  • $V_{out} < V_{ov}$ になったら:線形領域、電流は $k_n(V_{ov}V_{out} - V_{out}^2/2)$

第1段階(飽和): 電流が一定なので、時間は単純に「電荷 ÷ 電流」です。出力は $V_{DD}$ から $V_{ov} = V_{DD}-V_{THN}$ まで、すなわち $V_{THN}$ だけ落ちます。

$$ t_1 = \frac{C_L V_{THN}}{\frac{k_n}{2}V_{ov}^2} = \frac{2C_LV_{THN}}{k_n V_{ov}^2} $$

第2段階(線形): こちらは積分が必要です。

$$ t_2 = \frac{C_L}{k_n}\int_{V_{DD}/2}^{V_{ov}}\frac{dV}{V_{ov}V – V^2/2} = \frac{C_L}{k_n}\int_{V_{DD}/2}^{V_{ov}}\frac{2\,dV}{V\left(2V_{ov}-V\right)} $$

被積分関数を部分分数分解します。$\dfrac{2}{V(2V_{ov}-V)} = \dfrac{1}{V_{ov}}\left(\dfrac{1}{V}+\dfrac{1}{2V_{ov}-V}\right)$ なので、原始関数は

$$ \frac{1}{V_{ov}}\left[\ln V – \ln\left(2V_{ov}-V\right)\right] = \frac{1}{V_{ov}}\ln\frac{V}{2V_{ov}-V} $$

上端 $V = V_{ov}$ では $\ln(V_{ov}/V_{ov}) = 0$ となって消えるので、下端の寄与だけが残ります。符号を整理すると、

$$ t_2 = \frac{C_L}{k_n V_{ov}}\ln\frac{2V_{ov}-V_{DD}/2}{V_{DD}/2} = \frac{C_L}{k_n V_{ov}}\ln\left(\frac{4V_{ov}}{V_{DD}}-1\right) $$

$t_1$ と $t_2$ を足し、$C_L/(k_nV_{ov})$ でくくると閉形式が得られます。

$$ \begin{equation} \boxed{\ t_{pHL} = \frac{C_L}{k_n\left(V_{DD}-V_{THN}\right)}\left[\frac{2V_{THN}}{V_{DD}-V_{THN}} + \ln\left(\frac{4\left(V_{DD}-V_{THN}\right)}{V_{DD}}-1\right)\right]\ } \end{equation} $$

$C_L = 50$ fF、$k_n = 400\ \mu$A/V$^2$、$V_{DD}=1.8$ V、$V_{THN}=0.4$ V を入れると $t_{pHL} = 117.7$ ps。後のPython実装で行う数値積分の結果と小数点以下まで一致します。

簡易モデル $t_{pHL} \propto C_LV_{DD}/I_{D,sat}$

設計の見通しをつけるには、遷移の大部分を飽和電流 $I_{D,sat} = \frac{k_n}{2}(V_{DD}-V_{THN})^2$ で近似してしまうのが便利です。

$$ t_{pHL} \approx \frac{C_L \cdot V_{DD}/2}{I_{D,sat}} = \frac{C_L V_{DD}}{k_n\left(V_{DD}-V_{THN}\right)^2} $$

同じ数値を入れると $114.8$ ps。厳密解 $117.7$ ps に対して誤差 $2.5\%$ にすぎません。遅延は $C_L$ に比例し、駆動電流に反比例する — この単純な比例関係が、ディジタル設計における最も基本的な直感です。

伝搬遅延が負荷容量に比例することと、出力の放電波形が飽和区間では直線的・線形区間では寝ることを示すグラフ

左では、数値積分・閉形式・簡易式の3本がほぼ完全に重なっており、しかも原点を通る直線です。$t_{pHL} \propto C_L$ という比例関係が数値でも確認できました。右の放電波形を見ると、この直線性の内訳がわかります。$V_{out}$ が $V_{DD}-V_{THN}=1.4$ V を上回っている間はNMOSが飽和で電流一定なので出力は直線的に落ち、$1.4$ V を切ると線形領域に入って電流が減り、波形が寝ていきます。赤丸が $V_{DD}/2$ を横切る時刻 $t_{pHL}$ で、$C_L$ を $20 \to 50 \to 100$ fF と増やすと $47 \to 118 \to 235$ ps ときれいに比例しています。

この式からファンアウトの効果も読み取れます。次段のゲート数が増えれば $C_L$ が比例して増え、遅延も比例して増えます。逆に駆動側のトランジスタを $m$ 倍に広げれば $k_n$ が $m$ 倍になって遅延は $1/m$ になります。ただし、自分自身のドレイン容量も $m$ 倍になるので、無限に速くはなりません。この折り合いを最適化する手法が「論理的努力(logical effort)」です。

電源電圧スケーリングのトレードオフ

$t_{pHL} \propto \dfrac{C_LV_{DD}}{k_n(V_{DD}-V_{TH})^2}$ と $E = C_LV_{DD}^2$ を並べて眺めると、$V_{DD}$ の役割が正反対であることに気づきます。

  • $V_{DD}$ を下げる → エネルギーは $V_{DD}^2$ で減る(大歓迎)
  • $V_{DD}$ を下げる → 分母の $(V_{DD}-V_{TH})^2$ が急速に縮み、遅延は増える($V_{DD}\to V_{TH}$ で発散)

両者のバランスを取る指標として エネルギー遅延積(EDP: Energy-Delay Product) $EDP = E \cdot t_p$ がよく使われます。簡易モデルで書くと、

$$ EDP \propto C_LV_{DD}^2 \cdot \frac{C_LV_{DD}}{k_n(V_{DD}-V_{TH})^2} = \frac{C_L^2}{k_n}\cdot\frac{V_{DD}^3}{\left(V_{DD}-V_{TH}\right)^2} $$

$V_{DD}$ で微分してゼロと置きます。商の微分を使うと分子は

$$ 3V_{DD}^2\left(V_{DD}-V_{TH}\right)^2 – V_{DD}^3\cdot 2\left(V_{DD}-V_{TH}\right) = 0 $$

共通因子 $V_{DD}^2(V_{DD}-V_{TH})$ で割ると $3(V_{DD}-V_{TH}) – 2V_{DD}=0$ となり、驚くほどきれいな結果が出ます。

$$ \begin{equation} V_{DD}^{opt} = 3V_{TH} \end{equation} $$

$V_{TH} = 0.4$ V なら最適電源電圧は $1.2$ V。厳密な遅延式(対数項を含む形)で数値的に最小化すると $1.17$ V となり、簡易モデルの予測とよく合います。しきい値電圧の3倍あたりが、エネルギーと速度のバランス点 という覚えやすい指針です。

電源電圧に対する伝搬遅延・1遷移あたりエネルギー・エネルギー遅延積の3枚組グラフ

3枚が電源電圧スケーリングの全体像です。左では $V_{DD}$ を $1.8$ V から $0.9$ V へ半分にすると遅延が $117.7$ ps から $450.2$ ps へ $3.8$ 倍に伸び、$V_{TH}=0.4$ V に近づくと発散していきます。中央では同じ操作でエネルギーが $162$ fJ から $40.5$ fJ へ $1/4$ に減ります。右がその積で、$1.17$ V に明確な最小点があり、解析で導いた $3V_{TH}=1.2$ V とよく一致しています。注目すべきは底が広く平坦なことで、$1.0$〜$1.5$ V ならEDPは最小値の $5\%$ 以内。設計者にはこの平坦域の中で周波数目標や電源ノイズ耐性を優先して選ぶ自由がある、ということを意味します。

もっとも、実際のチップでは動作周波数の目標が先に決まっているので、EDP最適点をそのまま採用できるとは限りません。速度が最優先なら $V_{DD}$ を上げ(エネルギーは犠牲)、待機が長いなら下げる(速度は犠牲)。近年のプロセッサが動的電圧周波数スケーリング(DVFS)を備えているのは、この曲線上を負荷に応じて動き回るためです。

理論の骨組みが揃いました。ここからはPythonで実際にVTCを数値的に解き、これまで導いた式が本当に成り立つかを確かめていきます。

Pythonによる実装と可視化

モデルの実装とVTCの数値解

まずMOSFETの電流モデルを実装し、各 $V_{in}$ に対して $I_{DN}=I_{DP}$ を満たす $V_{out}$ を brentq(Brent法による1次元求根)で解きます。前述のとおり $I_{DN}$ は $V_{out}$ の増加関数、$I_{DP}$ は減少関数なので、差 $I_{DN}-I_{DP}$ は単調増加。区間の両端で符号が変わるため、Brent法は確実に収束します。遮断領域を厳密にゼロにすると求根の区間で符号が変わらなくなるので、サブスレッショルド電流を入れておくのがコツです。

import numpy as np
from scipy.optimize import brentq

# --- デバイスパラメータ(1.8V級プロセスを想定) ---
VDD, VTHN, VTHP = 1.8, 0.4, 0.4      # 電源電圧としきい値の大きさ [V]
KN, KP = 400e-6, 400e-6              # 利得係数 k = mu*Cox*(W/L) [A/V^2]
LAMN, LAMP = 0.1, 0.1                # チャネル長変調係数 [1/V]
PHIT, NSUB = 0.026, 1.3              # 熱電圧 [V], サブスレッショルド係数

def id_mos(vgs, vds, k, vth, lam):
    """NMOS基準の平方則モデル(サブスレッショルド付き)。すべて大きさで扱う"""
    if vds <= 0:
        return 0.0
    vov = vgs - vth                       # オーバードライブ電圧
    if vov <= 0:                          # 遮断(サブスレッショルド)
        i0 = 0.5 * k * (NSUB * PHIT) ** 2
        return i0 * np.exp(vov / (NSUB * PHIT)) * (1 - np.exp(-vds / PHIT))
    if vds < vov:                         # 線形(三極管)領域
        return k * (vov * vds - 0.5 * vds ** 2) * (1 + lam * vds)
    return 0.5 * k * vov ** 2 * (1 + lam * vds)   # 飽和領域

def i_nmos(vin, vout, kn=KN):
    return id_mos(vin, vout, kn, VTHN, LAMN)

def i_pmos(vin, vout, kp=KP):
    # PMOSは Vgs, Vds を VDD 基準の大きさに読み替える
    return id_mos(VDD - vin, VDD - vout, kp, VTHP, LAMP)

def solve_vout(vin, kn=KN, kp=KP):
    """KCL: I_DN(vin,vout) = I_DP(vin,vout) を vout について解く"""
    f = lambda vo: i_nmos(vin, vo, kn) - i_pmos(vin, vo, kp)
    return brentq(f, 1e-12, VDD - 1e-12, xtol=1e-14, rtol=1e-15)

vin = np.linspace(0.0, VDD, 2001)
vout = np.array([solve_vout(v) for v in vin])
gain = np.gradient(vout, vin)

VM_theory = (VTHN + np.sqrt(KP / KN) * (VDD - VTHP)) / (1 + np.sqrt(KP / KN))
VM_num = brentq(lambda v: solve_vout(v) - v, 0.1, VDD - 0.1)
print(f"反転点 VM: 理論式 {VM_theory:.4f} V / 数値解 {VM_num:.4f} V")
print(f"最大利得: {gain.min():.2f}")

実行すると、理論式による反転点 $0.9000$ V と数値解 $0.9000$ V が小数点以下4桁まで一致します。$k_n = k_p$ かつ $V_{THN}=|V_{THP}|$ という対称条件を課したので、期待どおり $V_{DD}/2$ ちょうどに来ています。最大利得は $-43.60$ となり、前節で導いた解析式 $A_v = -2(1+\lambda V_{DD}/2)/(2\lambda)\times 4 = -43.6$ とも完全に一致しました。チャネル長変調の補正項 $(1+\lambda V_M) = 1.09$ を落として $-40$ とすると $8\%$ ずれるので、この因子は無視できません。

VTCと5つの動作領域

次に、VTCを描いて5領域の境界を重ねます。境界は $V_{in}=V_{THN}$(NMOSがオンする)、$V_{out}=V_{in}-V_{THN}$(NMOSが飽和↔線形)、$V_{out}=V_{in}+|V_{THP}|$(PMOSが飽和↔線形)、$V_{in}=V_{DD}-|V_{THP}|$(PMOSが切れる)で与えられます。

import matplotlib, matplotlib.pyplot as plt
for cand in ["Hiragino Sans", "Yu Gothic", "Noto Sans CJK JP", "IPAexGothic", "Meiryo"]:
    if any(cand == f.name for f in matplotlib.font_manager.fontManager.ttflist):
        plt.rcParams["font.family"] = cand
        break
plt.rcParams["axes.unicode_minus"] = False

fig, ax = plt.subplots(figsize=(8, 6))
ax.plot(vin, vout, lw=2.5, color="C0", label="伝達特性 VTC")
ax.plot(vin, vin, "--", color="gray", lw=1, label="$V_{out}=V_{in}$(反転点の判定線)")

# 動作領域の境界線
ax.plot(vin, np.clip(vin - VTHN, 0, VDD), ":", color="C3", lw=1.5,
        label="NMOS 飽和/線形の境界 $V_{out}=V_{in}-V_{THN}$")
ax.plot(vin, np.clip(vin + VTHP, 0, VDD), ":", color="C2", lw=1.5,
        label="PMOS 飽和/線形の境界 $V_{out}=V_{in}+|V_{THP}|$")
ax.axvline(VTHN, color="C3", alpha=0.35)
ax.axvline(VDD - VTHP, color="C2", alpha=0.35)
ax.plot([VM_num], [VM_num], "o", color="crimson", ms=9,
        label=f"反転点 $V_M$ = {VM_num:.3f} V")

for x0, x1, txt in [(0, VTHN, "領域1\nN:遮断\nP:線形"),
                    (VTHN, VM_num, "領域2\nN:飽和\nP:線形"),
                    (VM_num, VDD - VTHP, "領域4\nN:線形\nP:飽和"),
                    (VDD - VTHP, VDD, "領域5\nN:線形\nP:遮断")]:
    ax.axvspan(x0, x1, alpha=0.06, color="C0" if txt[2] in "15" else "C1")
    ax.text((x0 + x1) / 2, 0.62 * VDD, txt, ha="center", fontsize=8.5)

ax.set_xlabel("入力電圧 $V_{in}$ [V]"); ax.set_ylabel("出力電圧 $V_{out}$ [V]")
ax.set_title("CMOSインバータの伝達特性と動作領域", fontsize=13)
ax.set_xlim(0, VDD); ax.set_ylim(0, VDD); ax.grid(alpha=0.3)
ax.legend(fontsize=8, loc="upper right")
plt.tight_layout(); plt.show()

このグラフから3つのことが読み取れます。第一に、領域1と領域5の平坦部では出力が正確に $V_{DD}$ と $0$ に張り付いており、フルスイングが数値的にも確認できます。第二に、$V_{THN}=0.4$ V を超えた瞬間から出力が下がり始めますが、$0.7$ V あたりまでは緩やかで、そこから急激に落ちます。第三に、赤い破線(NMOSの飽和/線形境界)とVTCの交点は $V_{in}=0.909$ V、緑の破線との交点は $V_{in}=0.891$ V にあり、両方が飽和している領域3の幅はわずか $18$ mV しかありません。この極端に狭い窓の中で出力が $1.291$ V から $0.509$ V まで落ちる、というのがVTCの急峻さの正体です。

W/L比を変えるとVTCはどう動くか

$V_M$ の設計は $r = \sqrt{k_p/k_n}$ を通じて行いました。実際に $(W/L)_p$ を振ってVTCがどう平行移動するかを確かめます。ここでは $\mu_nC_{ox}=200\ \mu$A/V$^2$、$\mu_pC_{ox}=80\ \mu$A/V$^2$(移動度比 $2.5$)、$(W/L)_n = 2$ 固定とします。

import numpy as np
import matplotlib.pyplot as plt

MUN_COX, MUP_COX = 200e-6, 80e-6     # プロセスで決まる値 [A/V^2]
WL_N = 2.0                           # NMOSのW/Lは固定
kn_fix = MUN_COX * WL_N

fig, axes = plt.subplots(1, 2, figsize=(13, 5))
wl_p_list = [1.0, 2.0, 3.0, 5.0, 8.0, 12.0]
vm_num, vm_th, ratios = [], [], []

for wlp in wl_p_list:
    kp = MUP_COX * wlp
    vo = np.array([solve_vout(v, kn_fix, kp) for v in vin])
    r = np.sqrt(kp / kn_fix)
    axes[0].plot(vin, vo, lw=1.8, label=f"$(W/L)_p$={wlp:g}  (r={r:.2f})")
    vm = brentq(lambda v: solve_vout(v, kn_fix, kp) - v, 0.05, VDD - 0.05)
    vm_num.append(vm)
    vm_th.append((VTHN + r * (VDD - VTHP)) / (1 + r))
    ratios.append(wlp / WL_N)

axes[0].plot(vin, vin, "--", color="gray", lw=1)
axes[0].set_xlabel("入力電圧 $V_{in}$ [V]"); axes[0].set_ylabel("出力電圧 $V_{out}$ [V]")
axes[0].set_title("W/L比を変えたときのVTC群", fontsize=12)
axes[0].grid(alpha=0.3); axes[0].legend(fontsize=8); axes[0].set_xlim(0, VDD)

axes[1].plot(ratios, vm_num, "o-", lw=2, label="数値解(KCLをbrentqで求根)")
axes[1].plot(ratios, vm_th, "s--", lw=1.5, label=r"理論式 $V_M=\frac{V_{THN}+r(V_{DD}-|V_{THP}|)}{1+r}$")
axes[1].axhline(VDD / 2, color="crimson", ls=":", label="目標 $V_{DD}/2$")
axes[1].axvline(MUN_COX / MUP_COX, color="C2", ls=":", label=r"$(W/L)_p/(W/L)_n=\mu_n/\mu_p$")
axes[1].set_xlabel("$(W/L)_p / (W/L)_n$"); axes[1].set_ylabel("反転点 $V_M$ [V]")
axes[1].set_title("W/L比と反転点の関係", fontsize=12)
axes[1].grid(alpha=0.3); axes[1].legend(fontsize=8)
plt.tight_layout(); plt.show()

左のグラフでは、$(W/L)_p$ を大きくするほどVTCが右へずれていきます。PMOSが強くなるほど「出力Highを維持する力」が強まり、より高い入力電圧まで倒れなくなるからです。右のグラフでは、数値解(丸)と理論式(四角)が全域で重なっており、$V_M$ の閉形式が正しいことが確認できます。そして $(W/L)_p/(W/L)_n = \mu_n/\mu_p = 2.5$ の縦線がちょうど $V_M = V_{DD}/2$ の横線と交わっています。$(W/L)_p$ を $1$ から $12$ へ 12倍 変えても $V_M$ は $0.713$ V から $1.005$ V へ $0.29$ V しか動かないことにも注目してください。$r$ が平方根で入るため、$V_M$ は寸法ばらつきに極めて鈍感です。

利得曲線とノイズマージン

続いて $dV_{out}/dV_{in}$ を数値微分し、$-1$ を横切る2点から $V_{IL}$, $V_{IH}$ を求め、ノイズマージンを図示します。

import numpy as np
import matplotlib.pyplot as plt

VOH, VOL = vout[0], vout[-1]          # 入力0のときの出力H / 入力VDDのときの出力L
idx = np.where(gain < -1.0)[0]
lo, hi = idx[0], idx[-1]

def cross_minus1(i0, i1):
    """gain = -1 を線形補間で求める"""
    return vin[i0] + (-1.0 - gain[i0]) * (vin[i1] - vin[i0]) / (gain[i1] - gain[i0])

VIL = cross_minus1(lo - 1, lo)
VIH = cross_minus1(hi, hi + 1)
NML, NMH = VIL - VOL, VOH - VIH
print(f"VOH={VOH:.4f} VOL={VOL:.4f} VIL={VIL:.4f} VIH={VIH:.4f}")
print(f"NM_L={NML:.4f} V ({100*NML/VDD:.1f}% of VDD), NM_H={NMH:.4f} V")
Av = gain.min()
print(f"区分線形近似のNM = {(VDD/2)*(1-1/abs(Av)):.4f} V")

出力は次のようになります。$V_{OH}=1.8000$、$V_{OL}=0.0000$、$V_{IL}=0.7549$、$V_{IH}=1.0451$、$NM_L = NM_H = 0.7549$ V($V_{DD}$ の $41.9\%$)。上下対称なのは $r=1$ かつ $V_{THN}=|V_{THP}|$ としたためで、設計意図どおりです。一方、区分線形近似は $0.8794$ V を与え、真値を $16.5\%$ 過大評価します。前節で述べたとおり、$V_{IL}$ の時点で出力がまだ $V_{DD}$ に届いていない分を無視しているのが原因です。

fig, axes = plt.subplots(1, 2, figsize=(13, 5))

axes[0].plot(vin, vout, lw=2.5, color="C0")
axes[0].axhspan(0, VIL, color="C2", alpha=0.12)
axes[0].axhspan(VIH, VDD, color="C3", alpha=0.12)
for x, lb, c in [(VIL, "$V_{IL}$", "C2"), (VIH, "$V_{IH}$", "C3")]:
    axes[0].axvline(x, color=c, ls="--", lw=1.2)
    axes[0].text(x, VDD * 0.95, lb, ha="center", color=c, fontsize=11)
axes[0].annotate("", xy=(0.12, VOL), xytext=(0.12, VIL),
                 arrowprops=dict(arrowstyle="<->", color="C2", lw=2))
axes[0].text(0.16, VIL / 2, f"$NM_L$={NML:.3f} V", color="C2", fontsize=10)
axes[0].annotate("", xy=(1.65, VIH), xytext=(1.65, VOH),
                 arrowprops=dict(arrowstyle="<->", color="C3", lw=2))
axes[0].text(1.02, (VIH + VOH) / 2, f"$NM_H$={NMH:.3f} V", color="C3", fontsize=10)
axes[0].set_xlabel("入力電圧 $V_{in}$ [V]"); axes[0].set_ylabel("出力電圧 $V_{out}$ [V]")
axes[0].set_title("ノイズマージンの定義", fontsize=12)
axes[0].grid(alpha=0.3); axes[0].set_xlim(0, VDD); axes[0].set_ylim(0, VDD)

axes[1].plot(vin, gain, lw=2.2, color="C4")
axes[1].axhline(-1, color="crimson", ls="--", label="利得 $= -1$(安全域の境界)")
axes[1].plot([VIL, VIH], [-1, -1], "o", color="crimson", ms=8)
axes[1].axvline(VM_num, color="gray", ls=":", label=f"$V_M$={VM_num:.2f} V")
axes[1].text(VM_num + 0.05, Av * 0.85, f"最大利得 {Av:.1f}", fontsize=10)
axes[1].set_xlabel("入力電圧 $V_{in}$ [V]"); axes[1].set_ylabel("$dV_{out}/dV_{in}$")
axes[1].set_title("利得曲線と $V_{IL}$, $V_{IH}$", fontsize=12)
axes[1].grid(alpha=0.3); axes[1].legend(fontsize=9)
plt.tight_layout(); plt.show()

左の図では、緑の帯(論理0として安全に受け取れる範囲)と赤の帯(論理1として安全に受け取れる範囲)が、それぞれ $V_{DD}$ の $42\%$ を占めています。合計すると $84\%$ で、「決めかねる」グレーゾーンは $16\%$ しかありません。右の利得曲線を見ると、利得は $V_M$ を中心に鋭いピークを持ち、$V_{IL}$ と $V_{IH}$ の外側では急速に $0$ に近づきます。この「レール付近では利得ほぼ0、中央では利得44」という極端な非線形性こそ、ディジタル回路が雑音を切り捨てながら信号を再生できる仕組みです。

貫通電流と入力スルーレートの関係

次に、遷移中に $V_{DD}$ からグラウンドへ抜ける電流を見ます。負荷容量が小さい極限では出力がVTCに追随するので、電源電流は各 $V_{in}$ における直流電流に等しくなります。

import numpy as np
import matplotlib.pyplot as plt

Idd = np.array([i_pmos(v, o) for v, o in zip(vin, vout)])   # 電源から流れ出す電流

# 入力ランプ(遷移時間 tau)を仮定した時間波形へ変換
taus = [50e-12, 100e-12, 200e-12, 400e-12]
fig, axes = plt.subplots(1, 2, figsize=(13, 5))

for tau in taus:
    t = vin / VDD * tau            # Vin = VDD*t/tau の逆関数
    axes[0].plot(t * 1e12, Idd * 1e6, lw=1.8, label=f"入力遷移時間 {tau*1e12:.0f} ps")
axes[0].set_xlabel("時間 [ps]"); axes[0].set_ylabel("貫通電流 $I_{DD}$ [$\\mu$A]")
axes[0].set_title("入力ランプ中に流れる貫通電流の波形", fontsize=12)
axes[0].grid(alpha=0.3); axes[0].legend(fontsize=9)

# 貫通電荷 vs 遷移時間(数値積分 と Veendrick 式)
tau_ax = np.linspace(10e-12, 500e-12, 60)
area = np.trapz(Idd, vin)                       # ∫ I dVin
Q_num = area * tau_ax / VDD
Q_vee = KN * (VDD - 2 * VTHN) ** 3 * tau_ax / (24 * VDD)
axes[1].plot(tau_ax * 1e12, Q_num * 1e15, lw=2.2, label="数値解(VTC上の電流を積分)")
axes[1].plot(tau_ax * 1e12, Q_vee * 1e15, "--", lw=2,
             label=r"Veendrick式 $Q_{sc}=\frac{k\tau(V_{DD}-2V_T)^3}{24V_{DD}}$")
CL = 50e-15
axes[1].axhline(CL * VDD * 1e15, color="crimson", ls=":",
                label=f"比較: 動的電荷 $C_LV_{{DD}}$ = {CL*VDD*1e15:.0f} fC")
axes[1].set_xlabel("入力遷移時間 $\\tau$ [ps]"); axes[1].set_ylabel("1遷移あたりの貫通電荷 [fC]")
axes[1].set_title("貫通電荷は入力スルーレートに比例する", fontsize=12)
axes[1].set_yscale("log"); axes[1].grid(alpha=0.3, which="both"); axes[1].legend(fontsize=9)
plt.tight_layout(); plt.show()
print(f"貫通電流のピーク: {Idd.max()*1e6:.1f} uA (Vin={vin[Idd.argmax()]:.3f} V)")

左の図は、入力が $V_{THN}=0.4$ V を超えたところで電流が立ち上がり、$V_M=0.9$ V でピーク $54.5\ \mu$A に達し、$V_{DD}-|V_{THP}|=1.4$ V で消えるという、きれいなベル型の波形を示します。ピーク値は理論値 $\frac{k_n}{2}(V_M-V_{THN})^2(1+\lambda V_M) = 54.5\ \mu$A と一致します。重要なのはピークの高さは遷移時間によらず一定で、波形の幅だけが伸びるという点です。だから貫通電荷は $\tau$ に正比例します。

右の図では、数値解(実線)とVeendrick式(破線)が同じ傾きの直線になっており、比例関係が確認できます。数値解が約 $16\%$ 上に来ているのは、Veendrick式がチャネル長変調 $(1+\lambda V)$ とサブスレッショルドの裾を無視しているためで、$(1+\lambda V_M)=1.09$ の補正でおおむね説明がつきます。そして赤い点線(動的電荷 $C_LV_{DD}=90$ fC)と比べると、$\tau = 100$ ps でも貫通電荷は $1.07$ fC。往復2回でも動的電荷の $2.4\%$ にすぎません。ただし $\tau$ を $400$ ps まで鈍らせると $10\%$ 近くまで増えるので、「入力波形は鈍らせない」という設計ルールの意味がはっきりします。

負荷容量と伝搬遅延

放電の微分方程式を直接数値積分し、閉形式の妥当性を確かめます。

import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import quad

def tphl_closed(CL, Vdd=VDD, kn=KN, vth=VTHN):
    """閉形式: 飽和区間 + 線形区間"""
    vov = Vdd - vth
    return CL / (kn * vov) * (2 * vth / vov + np.log(4 * vov / Vdd - 1))

def tphl_numeric(CL, Vdd=VDD, kn=KN):
    """C_L dV/dt = -I_DN の積分(チャネル長変調は無視して閉形式と条件を揃える)"""
    f = lambda vo: CL / id_mos(Vdd, vo, kn, VTHN, 0.0)
    return quad(f, Vdd / 2, Vdd)[0]

CLs = np.linspace(5e-15, 200e-15, 40)
t_cl = np.array([tphl_closed(c) for c in CLs])
t_nm = np.array([tphl_numeric(c) for c in CLs])
Isat = 0.5 * KN * (VDD - VTHN) ** 2
t_simple = CLs * (VDD / 2) / Isat

fig, axes = plt.subplots(1, 2, figsize=(13, 5))
axes[0].plot(CLs * 1e15, t_nm * 1e12, lw=2.5, label="数値積分 $\\int C_L/I_{DN}\\,dV$")
axes[0].plot(CLs * 1e15, t_cl * 1e12, "--", lw=2, label="閉形式(飽和+線形)")
axes[0].plot(CLs * 1e15, t_simple * 1e12, ":", lw=2,
             label="簡易式 $C_LV_{DD}/(2I_{D,sat})$")
axes[0].set_xlabel("負荷容量 $C_L$ [fF]"); axes[0].set_ylabel("$t_{pHL}$ [ps]")
axes[0].set_title("伝搬遅延は負荷容量に比例する", fontsize=12)
axes[0].grid(alpha=0.3); axes[0].legend(fontsize=9)

# 放電波形そのもの
for CL in [20e-15, 50e-15, 100e-15]:
    vgrid = np.linspace(VDD, 0.02 * VDD, 400)
    tt = np.array([quad(lambda vo: CL / id_mos(VDD, vo, KN, VTHN, 0.0), v, VDD)[0]
                   for v in vgrid])
    axes[1].plot(tt * 1e12, vgrid, lw=2, label=f"$C_L$={CL*1e15:.0f} fF")
    axes[1].plot([tphl_closed(CL) * 1e12], [VDD / 2], "o", color="crimson", ms=7)
axes[1].axhline(VDD / 2, color="gray", ls=":", label="$V_{DD}/2$(遅延の判定レベル)")
axes[1].set_xlabel("時間 [ps]"); axes[1].set_ylabel("出力電圧 $V_{out}$ [V]")
axes[1].set_title("出力の放電波形と $t_{pHL}$", fontsize=12)
axes[1].grid(alpha=0.3); axes[1].legend(fontsize=9); axes[1].set_xlim(0, 500)
plt.tight_layout(); plt.show()
print(f"CL=50fF: 閉形式 {tphl_closed(50e-15)*1e12:.2f} ps / "
      f"数値積分 {tphl_numeric(50e-15)*1e12:.2f} ps / 簡易式 {50e-15*0.9/Isat*1e12:.2f} ps")

左のグラフでは3本の線がほぼ重なっており、閉形式と数値積分は完全に一致($C_L=50$ fF でともに $117.74$ ps)、簡易式も $114.80$ ps で誤差 $2.5\%$ です。そして3本とも原点を通る直線であることから、遅延が $C_L$ に厳密に比例することが確認できます。右の放電波形を見ると、最初のうちは飽和電流一定なので直線的に落ち、$V_{out}$ が $V_{DD}-V_{THN}=1.4$ V を下回ってNMOSが線形領域に入ると、電流が減って波形が寝ていくことがわかります。$V_{DD}/2$ を横切る赤い点が $t_{pHL}$ です。この「最初は直線、あとは指数的に寝る」形は、実際のオシロスコープ波形とよく一致します。

電源電圧スケーリング — 遅延・エネルギー・EDP

最後に、$V_{DD}$ を振ったときの遅延・エネルギー・エネルギー遅延積を描き、最適点を確認します。

import numpy as np
import matplotlib.pyplot as plt

CL = 50e-15
Vdds = np.linspace(0.62, 2.5, 400)
t_p = np.array([tphl_closed(CL, V) for V in Vdds])
E = CL * Vdds ** 2
EDP = E * t_p
V_opt = Vdds[EDP.argmin()]

fig, axes = plt.subplots(1, 3, figsize=(15, 4.5))
axes[0].plot(Vdds, t_p * 1e12, lw=2.5, color="C0")
axes[0].axvline(VTHN, color="crimson", ls=":", label="$V_{TH}$(ここで遅延が発散)")
axes[0].set_xlabel("電源電圧 $V_{DD}$ [V]"); axes[0].set_ylabel("$t_{pHL}$ [ps]")
axes[0].set_title("遅延: 低電圧ほど急激に遅くなる", fontsize=11)
axes[0].set_yscale("log"); axes[0].grid(alpha=0.3, which="both"); axes[0].legend(fontsize=8)

axes[1].plot(Vdds, E * 1e15, lw=2.5, color="C1")
axes[1].set_xlabel("電源電圧 $V_{DD}$ [V]"); axes[1].set_ylabel("1遷移あたりエネルギー [fJ]")
axes[1].set_title("エネルギー: $C_LV_{DD}^2$ で単調増加", fontsize=11)
axes[1].grid(alpha=0.3)

axes[2].plot(Vdds, EDP / EDP.min(), lw=2.5, color="C2")
axes[2].axvline(V_opt, color="crimson", ls="--", label=f"数値最適 {V_opt:.2f} V")
axes[2].axvline(3 * VTHN, color="C4", ls=":", label=f"簡易モデル $3V_{{TH}}$ = {3*VTHN:.2f} V")
axes[2].set_xlabel("電源電圧 $V_{DD}$ [V]"); axes[2].set_ylabel("EDP(最小値で正規化)")
axes[2].set_title("エネルギー遅延積には最小点がある", fontsize=11)
axes[2].grid(alpha=0.3); axes[2].legend(fontsize=8); axes[2].set_ylim(0.9, 2.5)
plt.tight_layout(); plt.show()

for V in [0.8, 1.0, 1.2, 1.5, 1.8, 2.5]:
    print(f"VDD={V:.1f} V  tpHL={tphl_closed(CL,V)*1e12:7.1f} ps  "
          f"E={CL*V**2*1e15:6.1f} fJ  EDP(正規化)={CL*V**2*tphl_closed(CL,V)/EDP.min():.3f}")

3枚のグラフが、電源電圧スケーリングの本質を語っています。左では、$V_{DD}$ を $1.8$ V から $0.9$ V へ半分にすると遅延が $117.7$ ps から $450.2$ ps へ $3.8$ 倍 に伸びます。中央では、同じ操作でエネルギーが $162$ fJ から $40.5$ fJ へ $1/4$ に減ります。「電力を $1/4$ にできるが $3.8$ 倍遅くなる」という交換条件です。

右のEDP曲線には明確な最小点があり、数値最適値は $1.17$ V。前節で解析的に導いた $V_{DD}^{opt}=3V_{TH}=1.2$ V とよく一致しています(対数項を含む厳密式のぶんだけわずかに低い)。曲線の底が広く平坦なことにも注目してください。$1.0$ V から $1.5$ V の範囲ならEDPは最小値の $5\%$ 以内に収まるので、実際の設計では周波数目標や電源ノイズ耐性を優先して、この平坦域の中から選ぶ余地があります。逆に $2.5$ V まで上げるとEDPは $36\%$ 悪化し、$0.8$ V まで下げても $18\%$ 悪化します。「高すぎても低すぎても損」という構造が数値ではっきり見えます。

まとめ

本記事では、CMOSインバータの静特性と動特性を、MOSFETの平方則モデルから一つずつ導出しました。

  • 相補構成が静的電流をゼロにする — NMOSとPMOSが必ず一方だけオンするため、定常状態で $V_{DD}$ からGNDへの導通経路が存在しません。同時に $V_{OH}=V_{DD}$、$V_{OL}=0$ のフルスイングと、素子寸法比に依存しないレシオレス動作が実現します
  • VTCはKCL $I_{DN}=I_{DP}$ を5領域に場合分けして解く — 領域1・5は自明に $V_{DD}$ と $0$、領域2・4は $V_{out}$ の2次方程式を解いて閉形式が得られ、領域3(両方飽和)でVTCが急峻に落ちます
  • 反転点は $V_M = \dfrac{V_{THN}+r(V_{DD}-|V_{THP}|)}{1+r}$、$r=\sqrt{k_p/k_n}$ — $V_{THN}$ と $V_{DD}-|V_{THP}|$ の加重平均という形です。$V_M=V_{DD}/2$ を狙うなら $(W/L)_p/(W/L)_n = \mu_n/\mu_p \approx 2\sim3$。$r$ が平方根で入るぶん、$V_M$ は寸法ばらつきに鈍感です
  • 利得は $A_v = -(g_{mn}+g_{mp})/(g_{dn}+g_{dp})$ — 分子はNMOSとPMOSの相互コンダクタンスの和、分母はチャネル長変調による出力コンダクタンスの和。今回のパラメータで $-43.6$ となり、数値解と完全に一致しました。$|A_v|>1$ が信号の再生性の条件です
  • ノイズマージンは $dV_{out}/dV_{in}=-1$ で定義する — 数値解で $NM_L=NM_H=0.755$ V($V_{DD}$ の $41.9\%$)。区分線形近似 $\frac{V_{DD}}{2}(1-1/|A_v|)$ は $16\%$ ほど楽観的なので、見積もり用と割り切って使います
  • 消費電力は3成分に分解できる — 動的電力 $\alpha C_LV_{DD}^2f$ が支配的で、$V_{DD}$ の2乗で効きます。貫通電力はVeendrick式 $\frac{k(V_{DD}-2V_T)^3}{12}\frac{\tau}{T}$ で入力遷移時間に比例し、適切な設計では動的電力の数%。リークはサブスレッショルドが主で、$V_{TH}$ を下げると指数関数的に増えます
  • 伝搬遅延は $t_{pHL}=\dfrac{C_L}{k_nV_{ov}}\left[\dfrac{2V_{THN}}{V_{ov}}+\ln\left(\dfrac{4V_{ov}}{V_{DD}}-1\right)\right]$ — 飽和区間と線形区間を分けて積分した結果です。簡易式 $C_LV_{DD}/(2I_{D,sat})$ でも誤差 $2.5\%$ で、$t_p \propto C_L/I_{D,sat}$ という比例関係が設計の基本直感になります
  • エネルギー遅延積は $V_{DD}=3V_{TH}$ 付近で最小 — 電圧を下げるとエネルギーは $V_{DD}^2$ で減る一方、遅延は $(V_{DD}-V_{TH})^{-2}$ で発散します。今回のパラメータでは最適値 $1.17$ V(簡易モデルの予測 $1.2$ V)でした

CMOSインバータは、ディジタル回路のすべての性能指標 — 論理レベル、ノイズ耐性、速度、消費電力 — が2個のトランジスタだけで完結して現れる、稀有な題材です。ここで身につけた「動作領域で場合分けして電流を等置する」という手法は、NAND/NORゲート、伝送ゲート、SRAMセル、センスアンプなど、あらゆるCMOS回路の解析にそのまま使えます。

次のステップとして、以下の記事も参考にしてください。