Транзистор и вентиль: что происходит под булевой логикой
В треке «Компьютерные науки» статья «Булева логика и логические вентили» показывает, что из NAND собирается что угодно: сумматор, мультиплексор, защёлка, в пределе — процессор. Это верно и красиво. Но там вентиль остаётся математическим объектом: у него есть таблица истинности и нет ни размера, ни задержки, ни температуры.
Здесь мы открываем коробку. Все интересные свойства реального железа — почему частота не растёт, почему кэш маленький, почему ветвления дороги, почему ускоритель обыгрывает процессор общего назначения — живут не в булевой алгебре. Они живут на уровне, где вентиль становится несколькими транзисторами, которые перезаряжают ёмкость за конечное время и за конечную энергию.
Отсюда два тезиса, на которые опирается весь остальной трек. Первый: транзистор — не ключ, а плавный аналоговый прибор, которому цифровая схемотехника запрещает задерживаться в промежуточных состояниях. Второй: задержка вентиля — это время перезарядки ёмкости, а энергия переключения — заряд, умноженный на напряжение; из этих двух фактов выводится почти вся современная микроархитектура.
Историю переключающего элемента разбирает предыдущая глава. Мы берём ту же линию с другой стороны: не «что за чем появилось», а «что физически делает элемент и во что это обходится».
Цифровая абстракция — это дисциплина, а не природа
Внутри кристалла нет нулей и единиц, есть напряжения — непрерывная величина. Цифровым устройство делает соглашение: диапазон около нуля объявляем логическим 0, диапазон около питания — логической 1, а всё между ними — запрещённой зоной, в которой корректная схема не задерживается дольше времени переключения.
Ключевое слово — восстанавливающая логика (restoring logic). Вентиль обязан выдавать сигнал «чище», чем принял: если на входе 0.05 В вместо идеального нуля, на выходе должен быть полноценный уровень, а не тот же шум. Разница между тем, что вентиль гарантированно считает правильным уровнем, и тем, что он гарантированно выдаёт, называется запасом помехоустойчивости (noise margin). Именно он позволяет соединять миллиарды элементов подряд и не накапливать ошибку — в отличие от аналоговой цепочки, где искажение растёт с каждым каскадом.
Напряжение питания падало от поколения к поколению, и это важный сюжет:
| Эпоха и класс устройств | Питание Vdd (порядок) |
|---|---|
| TTL и ранняя КМОП-логика, 1970–1980-е | 5 В |
| Массовая КМОП середины 1990-х | 3.3 В |
| Логика начала 2000-х | 1.8–1.2 В |
| Логические ноды 2010–2020-х | около 1.0–0.7 В |
| Околопороговый режим (сверхнизкое потребление, исследования) | 0.4–0.6 В |
Это ориентиры по классам устройств, а не паспорт конкретной модели: реальное Vdd зависит от ноды, режима, температуры и от того, разгоняется чип или экономит батарею. Направление важнее значений: запас помехоустойчивости в вольтах сжимался всё сильнее, и то, что цифровая абстракция вообще выжила, — заслуга схемотехники, а не физики.
Что такое МОП-транзистор на самом деле
Доминирующий элемент — МОП-транзистор (MOSFET, metal–oxide–semiconductor field-effect transistor). Разберём n-канальный (nMOS).
В подложке p-типа сделаны две сильно легированные области n-типа — исток и сток. Между ними участок, по которому ток идти не может: два p-n перехода включены встречно. Сверху — очень тонкий изолятор (затворный оксид), на нём электрод затвора. Когда на затвор подают положительное напряжение относительно истока, поле через изолятор притягивает к поверхности электроны, и под оксидом возникает инверсионный канал, соединяющий исток со стоком. Напряжение, при котором канал считается образовавшимся, — пороговое, Vt (порядок 0.2–0.5 В в современной логике; в нодах с 5-вольтовым питанием — около 1 В).
Четыре следствия, каждое из которых аукнется дальше по треку.
1. Управление полем, а не током. Затвор изолирован, постоянный ток через него не течёт — принципиальное отличие от биполярного транзистора, которому в базу нужно постоянно подавать ток. Поэтому КМОП и вытеснил биполярную логику: у биполярных семейств (ECL) скорость была выше, но рассеиваемая мощность делала большие кристаллы невозможными.
2. Затвор — это конденсатор. Ток не течёт, но заряд надо закачать, чтобы канал появился, и откачать, чтобы исчез. Переключение вентиля — перезарядка ёмкости, отсюда одновременно и задержка, и энергия. Запомните формулировку: вся цифровая техника занимается тем, что таскает заряд по кристаллу.
3. Транзистор — плавный прибор. У него три режима, и в двух из трёх он ведёт себя совсем не как ключ:
Цифровая схема живёт на краях этого автомата и старается проскакивать середину быстро. Аналоговая — наоборот, работает в насыщении, где транзистор становится усилителем. Одинаковые приборы, разные способы их использовать.
4. Отсечка не означает нулевого тока. Ниже порога ток убывает не скачком, а экспоненциально. Крутизна спада — подпороговый размах (subthreshold swing) — ограничена физикой: при комнатной температуре нельзя получить лучше примерно 60 мВ на декаду тока (это kT/q, умноженное на натуральный логарифм десяти, при 300 К). Реальные приборы дают порядка 65–80 мВ/декаду в зависимости от поколения и геометрии.
Это не инженерная недоработка, а термодинамический предел, и он объясняет главный тупик отрасли. Хотите снизить Vdd ради экономии? Придётся снижать и Vt, иначе транзистор не успеет открыться. Снизили Vt на 60 мВ — ток утечки вырос вдесятеро. Миллиарды транзисторов, каждый чуть-чуть течёт — и статическое потребление становится сравнимо с динамическим. Сюда упирается сюжет главы «Мощность и пределы».
Есть и зеркальный прибор — pMOS: канал дырочный, открывается низким напряжением на затворе. При равных размерах он медленнее nMOS (подвижность дырок меньше — исторически примерно вдвое-втрое; современные приборы разрыв частично компенсируют механическим напряжением кремния). Это неравенство прямо влияет на то, как рисуют схемы: pMOS делают шире.
КМОП: почему логику строят именно так
КМОП (CMOS, комплементарная МОП-логика) — не единственный способ сделать вентиль, но победивший. У каждого вентиля две сети транзисторов: PDN (pull-down network) из nMOS соединяет выход с землёй, когда функция должна дать 0, а PUN (pull-up network) из pMOS — с питанием, когда функция должна дать 1. Сети строят взаимно двойственными: где в одной последовательное соединение, в другой параллельное. Тогда в любом устойчивом состоянии проводит ровно одна сеть: выход жёстко притянут к рельсе, сквозного тока от питания к земле нет.
Читается схема так: выход притягивается к нулю, только когда оба nMOS открыты, то есть A = 1 и B = 1. Иначе открыт хотя бы один pMOS и тянет выход к единице. Это ровно Y = NOT (A AND B) — NAND на четырёх транзисторах. Общее правило синтеза:
И становится последовательным соединением,
ИЛИ становится параллельным"] F --> PUN["Верхняя сеть на pMOS:
двойственная — И становится параллельным,
ИЛИ последовательным"] PDN --> CHK{"Сети взаимно двойственны
на всех наборах входов?"} PUN --> CHK CHK -->|да| OK["Проводит ровно одна сеть:
выход определён, сквозного тока нет"] CHK -->|нет| BAD["Либо Vdd замкнуто на GND,
либо выход повисает без источника"] OK --> CELL["Готовая ячейка библиотеки:
NAND2, NOR3, AOI21, MUX2 и так далее"]
Практические следствия, объясняющие внешний вид нижнего уровня:
- Инвертирующие вентили дешевле. NAND и NOR получаются напрямую (4 транзистора на два входа). AND — это NAND плюс инвертор: 6 транзисторов и две ступени задержки вместо одной. Поэтому синтезаторы проталкивают инверсии по схеме (законы де Моргана в железе), а библиотеки полны NAND, NOR и составных инвертирующих ячеек.
- Составные вентили экономят ступени.
Y = NOT((A AND B) OR C)делается одной ячейкой AOI21 (AND-OR-Invert): шесть транзисторов, одна ступень вместо трёх. Библиотека стандартных ячеек — это и есть набор таких выгодных кусков булевых функций. - Последовательные цепочки ограничивают число входов. NOR на 4 входа — четыре pMOS последовательно, сопротивления складываются, а pMOS и так медленные. Поэтому широких NOR в библиотеках почти нет, а «широкие» функции собирают деревом из узких: аппаратный аналог правила «не пиши функцию на сто аргументов».
- Транзистор хорошо передаёт свой уровень и плохо противоположный. nMOS отлично проводит 0, но 1 передаёт с потерей около Vt; у pMOS наоборот. Поэтому ключ для передачи произвольного сигнала (transmission gate) делают из пары nMOS + pMOS. Из таких ключей мультиплексоры и защёлки выходят экономнее, чем из полных вентилей, — так обычно и реализован аппаратный
if. - Третье состояние — не «ещё один уровень». Если отключить обе сети, выход не притянут никуда и держит заряд на паразитной ёмкости (состояние Z). Так делают общие шины, но отпущенный узел уплывает из-за утечек, поэтому внутри кристалла третье состояние почти вытеснено мультиплексорами: предсказуемость дороже экономии проводов.
Задержка: откуда берутся пикосекунды
Вентиль переключается не мгновенно: выходной узел — это ёмкость (затворы следующих вентилей плюс ёмкость проводов), а транзистор — источник конечного тока. В первом приближении
задержка ≈ C_нагрузки × ΔV / I_привода
Отсюда вся арифметика цифрового проектирования. Чем больше входов кормит один выход (разветвление по выходу, fan-out), тем больше ёмкость и задержка. Шире транзисторы — больше ток, но и больше их собственная входная ёмкость, так что увеличивать размер бесконечно бессмысленно: вы ускоряете текущий каскад и замедляете предыдущий. Оптимальная цепочка буферов растёт примерно вчетверо на ступень — это результат теории логического усилия (logical effort, Sutherland–Sproull–Harris): чтобы разогнать сигнал на большую нагрузку (тактовую сеть, шину), ставят несколько инверторов нарастающей мощности, а не один огромный.
Отраслевая единица задержки — FO4: задержка инвертора, нагруженного четырьмя такими же. Она нормирует технологию, поэтому в FO4 схемы разных поколений сравнимы. Порядки величины (именно порядки — конкретика зависит от ноды, напряжения, температуры и библиотеки):
| Класс технологии | FO4 (порядок) | Что это значит |
|---|---|---|
| КМОП начала 2000-х | 15–25 пс | такт 3 ГГц ≈ 13–22 FO4 |
| Ноды конца 2010-х | единицы пс | такт 5 ГГц ≈ 30–60 FO4 |
| Микроконтроллер на «зрелой» ноде | десятки пс | такт десятки–сотни МГц |
Ступень конвейера в высокопроизводительных ядрах исторически укладывалась примерно в 10–20 FO4: меньше — накладные расходы на триггеры съедают выигрыш, больше — приходится снижать частоту. Почему нельзя просто нарезать конвейер тоньше — в главах «Конвейер» и «Мощность и пределы».
Отдельная беда — провода. Транзисторы уменьшались, а сопротивление проводника при уменьшении сечения растёт; задержка длинной линии растёт квадратично с длиной. Поэтому длинные связи режут повторителями через каждые сотни микрон, превращая квадратичный рост в линейный. Архитектурное следствие: пройти через весь кристалл за один такт давно нельзя. Отсюда многоядерность вместо одного гигантского ядра, локальные кэши вместо одного общего и сети внутри чипа — аргумент, к которому вернётся глава «Многоядерность».
Такт: договор о том, когда сигнал считается готовым
Комбинационная логика выдаёт правильный ответ когда-нибудь. Чтобы система стала предсказуемой, результаты фиксируют в триггерах по фронту такта. Триггер предъявляет два требования: setup — данные стабильны за некоторое время до фронта; hold — данные остаются стабильны некоторое время после фронта. Отсюда базовое неравенство синхронного дизайна:
T_такта ≥ t_clk→Q + t_логики + t_проводов + t_setup + перекос такта
Это и есть критический путь: самая длинная комбинационная цепочка между двумя триггерами. Такт определяется ею одной — не средней задержкой, а худшей. Бюджет такта раскладывается примерно так:
Обратите внимание на пропорции: собственно логика занимает чуть больше половины такта, остальное — накладные расходы синхронной дисциплины. Поэтому наращивание глубины конвейера упирается в стену: доля накладных расходов растёт, а полезная работа на ступень падает.
Нарушение hold отдельно поучительно: его нельзя вылечить снижением частоты. Если сигнал приходит слишком рано (быстрая логика плюс перекос такта), новое значение перезапишет старое до того, как приёмник его защёлкнул. Лечится вставкой буферов, то есть намеренным замедлением пути. Интуиция ломается: бывает логика, которая «слишком быстрая» и поэтому неисправна.
Тактовая сеть — самая дорогая цепь на кристалле: идёт ко всем триггерам, переключается каждый такт и обязана приходить всюду почти одновременно. В высокочастотных ядрах 1990–2000-х на распределение такта уходили десятки процентов динамической мощности. Отсюда тактовое стробирование (clock gating) — не подавать такт в блоки, которые ничего не делают. Это самая массовая техника энергосбережения в железе и первая причина, по которой частота простаивающего чипа ничего не говорит о его возможностях.
Метастабильность: когда логика законно даёт неопределённость
Если сигнал приходит из другого тактового домена или вообще снаружи (кнопка, датчик, другой чип), гарантировать setup/hold невозможно в принципе. Триггер может зависнуть между уровнями:
это метастабильность, а не поломка FF1-->>FF1: состояние рассасывается экспоненциально
с постоянной времени тау FF1->>FF2: к следующему фронту уровень уже определился FF2->>L: чистый синхронный сигнал Note over FF2,L: вероятность не успеть падает как exp минус t делить на тау;
две ступени дают наработку на отказ в годы
Формула, которую стоит знать всем, кто трогает FPGA или межпроцессорные интерфейсы:
MTBF = exp(t_разрешения / τ) / (T0 × f_такта × f_событий)
Наработка на отказ растёт экспоненциально со временем, отданным на рассасывание, и падает линейно с частотами. Поэтому стандартное решение — двухступенчатый синхронизатор, и почти никогда не нужен третий триггер. Практическая сторона — в треке встраиваемых систем, где асинхронные входы встречаются на каждом шагу.
Энергия: за что платит каждое переключение
Динамическая мощность КМОП-схемы описывается формулой, которую стоит выучить:
P_дин ≈ α × C × Vdd² × f
α — активность: доля узлов, реально переключающихся за такт
C — суммарная переключаемая ёмкость
Vdd — напряжение питания
f — тактовая частота
К ней добавляются два слагаемых. Сквозной ток (short-circuit): пока входное напряжение проходит середину диапазона, обе сети приоткрыты и от Vdd к земле течёт короткий импульс — чем медленнее фронт, тем дороже, ещё одна причина не перегружать выходы. Статические утечки: подпороговый ток закрытых транзисторов плюс туннелирование через оксид толщиной в считанные атомные слои; в нодах середины 2000-х это стало проблемой первого порядка, и её частично решили заменой SiO₂ на диэлектрик с высоким k и металлический затвор.
Главное в формуле — квадрат по напряжению. Пока по правилам масштабирования Деннарда (Robert Dennard и соавторы, 1974) вместе с размерами транзистора уменьшалось и напряжение, плотность мощности оставалась примерно постоянной: транзисторы становились мельче, быстрее и экономичнее одновременно. Это и был «бесплатный обед» — частота росла сама собой. Примерно к середине 2000-х масштабирование Деннарда кончилось: напряжение почти перестало падать (упирается в порог, порог упирается в те самые 60 мВ/декаду), а транзисторы продолжили уменьшаться. Плотность мощности пошла вверх, частота встала на плато в районе единиц гигагерц — и производительность начали брать параллелизмом и специализацией. Это стержневой сюжет трека: «Мощность и пределы» и «Ускорители».
Инструменты, которыми сегодня управляют этой формулой:
| Приём | На что действует | Цена |
|---|---|---|
| Тактовое стробирование (clock gating) | α: не переключать неиспользуемое | логика разрешения, небольшая |
| Отключение питания домена (power gating) | утечки: обесточить блок целиком | долгий выход из сна, потеря состояния |
| DVFS: снижение частоты и напряжения | f и Vdd² сразу | ниже производительность, задержки смены режима |
| Ячейки с разным Vt (multi-Vt) | быстрые ячейки на критическом пути, экономные везде | сложнее синтез и верификация |
| Околопороговая работа | максимум эффективности на операцию | резкий рост чувствительности к разбросу |
Порядки энергии на операцию, которые стоит держать в голове (оценки Марка Горовица, ISSCC 2014, для 45-нм КМОП; в новых нодах числа меньше, но соотношения сохраняются): целочисленное сложение 32 бита — доли пикоджоуля; сложение с плавающей точкой — около пикоджоуля; чтение 32 бит из небольшого блока SRAM — единицы пикоджоулей; обращение к внешней DRAM за теми же битами — сотни пикоджоулей.
Вывод жёсткий и определяющий всю современную инженерию: арифметика почти бесплатна, дорого перемещение данных. Пересчитать значение заново часто дешевле, чем достать его из памяти. Поэтому кэш-дружественный код выигрывает на порядки — практическая сторона в «Кэше и локальности».
Из вентилей — элементы памяти
Логика умеет считать, но не помнить. Хранение строят из тех же транзисторов, и разные компромиссы дают принципиально разные ячейки.
- Триггер (D flip-flop) — порядка двух десятков транзисторов на бит. Быстрый, удобный, дорогой; из них делают регистры и конвейерные ступени.
- Регистровый файл — массив ячеек с несколькими портами чтения и записи. Каждый порт добавляет свои словарные и разрядные линии, и площадь ячейки растёт примерно как квадрат числа портов. Вот почему в системе команд регистров десятки, а не тысячи, — прямая связь физики с ISA, к которой мы придём в следующей главе.
- SRAM 6T — два перекрёстно включённых инвертора (защёлка) плюс два ключа доступа. Внутри заложен неустранимый конфликт: чтобы чтение не разрушало содержимое, защёлка должна быть «сильной», а чтобы прошла запись — «слабой»; баланс задаётся соотношением размеров транзисторов и с уменьшением ноды держится всё труднее из-за разброса. Площадь ячейки — порядка 1 мкм² в нодах начала 2000-х и сотые доли мкм² в нодах конца 2010-х.
- DRAM 1T1C — один транзистор и один конденсатор. Плотнее SRAM в разы, но чтение разрушающее (заряд стекает на разрядную линию и его надо восстанавливать), а сам заряд утекает — отсюда регенерация всего массива, по стандарту JEDEC примерно каждые 64 мс и вдвое чаще при повышенной температуре. Конденсатор нужной ёмкости плохо делается на логическом техпроцессе, поэтому DRAM живёт на отдельном кристалле, а обращение к ней стоит десятки наносекунд вместо долей наносекунды.
- Флеш-память — заряд на изолированном («плавающем») затворе держится годами без питания. Плата: медленная запись, стирание крупными блоками и конечный ресурс — туннелирование постепенно разрушает изолятор.
Этот график — физическое объяснение того, почему иерархия памяти вообще существует. Никто не выбирал «сделать кэш маленьким»: маленьким его делают площадь шеститранзисторной ячейки и то, что большой массив дольше адресуется и дольше ждёт сигнала по длинным линиям. Обзорную картину даёт «Иерархия памяти», инженерную — глава «Подсистема памяти».
Как это описывают люди: RTL, синтез и STA
Никто не рисует миллиарды транзисторов руками. Схему описывают на языке уровня регистровых передач (RTL) — Verilog/SystemVerilog или VHDL, — а превращает описание в транзисторы синтезатор.
// Описание ПОВЕДЕНИЯ, а не схемы: транзисторов здесь нет вообще.
module counter4 (
input wire clk, // тактовый сигнал
input wire rst_n, // синхронный сброс, активный низким уровнем
input wire en, // разрешение счёта
output reg [3:0] q // состояние счётчика
);
// Всё внутри блока защёлкивается по переднему фронту такта:
// синтезатор развернёт это в четыре триггера плюс сумматор с константой.
always @(posedge clk) begin
if (!rst_n) q <= 4'b0000;
else if (en) q <= q + 4'b0001;
end
endmodule
Маршрут превращения текста в кристалл: синтез (RTL → сеть из ячеек конкретной библиотеки: NAND2_X1, DFF_X2, AOI21_X1 — где суффикс означает силу привода: шире транзисторы, меньше задержка при большей нагрузке и большей входной ёмкости), затем размещение и трассировка (ячейки раскладываются по рядам и соединяются металлом — здесь появляются реальные длины проводов, а значит реальные задержки), затем статический временной анализ (STA): проверка, что при любых входных данных критический путь укладывается в такт.
Последний шаг заслуживает разбора, потому что инженерная задача сводится к учебному графовому алгоритму. Перебирать все комбинации входов — это O(2ⁿ), невозможно уже при сорока входах. Вместо этого схему рассматривают как ориентированный ациклический граф и считают времена прибытия сигналов:
вход: DAG схемы (узлы — выходы вентилей, рёбра — связи), задержка каждого вентиля,
времена прибытия на первичных входах
1. упорядочить узлы топологически
2. для каждого узла в этом порядке:
arrival[узел] = max по всем входам (arrival[вход]) + задержка[узел]
запомнить, какой вход дал максимум
3. эндпоинт = узел с наибольшим arrival
4. критический путь = развернуть цепочку запомненных входов от эндпоинта назад
5. запас (slack) = T_такта − t_setup − arrival[эндпоинт]
"""Игрушечный статический временной анализ: критический путь комбинационной схемы."""
from collections import defaultdict, deque
# Схема как DAG: выходной узел -> (входы, задержка ячейки в пикосекундах).
# Задержки условные и правдоподобны лишь по порядку величины.
NETLIST = {
"s1": (["a", "b"], 14.0), # XOR2 — самый дорогой из простых вентилей
"c1": (["a", "b"], 8.0), # AND2
"sum": (["s1", "cin"], 14.0), # XOR2
"c2": (["s1", "cin"], 8.0), # AND2
"cout": (["c1", "c2"], 7.0), # OR2
}
# Перенос из младшего разряда приходит позже остальных входов:
PRIMARY_INPUTS = {"a": 0.0, "b": 0.0, "cin": 30.0}
def static_timing(netlist, primary_inputs):
"""Возвращает (времена прибытия, критический путь как список узлов)."""
successors, indegree = defaultdict(list), defaultdict(int)
nodes = set(primary_inputs) | set(netlist)
for out, (ins, _delay) in netlist.items():
indegree.setdefault(out, 0)
for src in ins:
successors[src].append(out)
indegree[out] += 1
arrival = dict(primary_inputs)
worst_input = {} # узел -> вход, определивший его время
queue = deque(n for n in nodes if indegree[n] == 0)
visited = 0
while queue: # топологическая сортировка Кана
node = queue.popleft()
visited += 1
for nxt in successors[node]:
_ins, delay = netlist[nxt]
candidate = arrival[node] + delay
# Берём ХУДШИЙ вход: сигнал готов, только когда пришёл последний.
if candidate > arrival.get(nxt, float("-inf")):
arrival[nxt], worst_input[nxt] = candidate, node
indegree[nxt] -= 1
if indegree[nxt] == 0:
queue.append(nxt)
if visited != len(nodes):
raise ValueError("в схеме комбинационная петля — STA такое не анализирует")
path = [max(arrival, key=arrival.get)]
while path[-1] in worst_input:
path.append(worst_input[path[-1]])
return arrival, list(reversed(path))
arrival, path = static_timing(NETLIST, PRIMARY_INPUTS)
print("критический путь:", " -> ".join(path)) # cin -> c2 -> cout
print(f"время прибытия: {arrival[path[-1]]:.1f} пс") # 45.0 пс
print(f"запас: {330.0 - 25.0 - arrival[path[-1]]:.1f} пс") # такт 3 ГГц, setup 25 пс
Сложность. По времени O(V + E): каждый узел и каждое ребро обрабатываются ровно один раз. По памяти O(V + E) на списки преемников и O(V) на времена прибытия. Сравните с O(2ⁿ) перебора входных наборов — именно эта разница делает проектирование чипов на миллиарды транзисторов возможным. Алгоритм вы уже видели под другим именем: это критический путь в сетевом графике и топологическая сортировка.
Настоящий STA сложнее ровно в двух местах: он считает не одно число, а диапазон (минимум и максимум — для проверок hold и setup), и делает это в нескольких углах (corners) — комбинациях процесса, напряжения и температуры: медленный кремний плюс низкое напряжение плюс жара против быстрого кремния плюс высокого напряжения плюс холода. Схема обязана работать во всех углах сразу.
Всё это можно потрогать бесплатно: Yosys синтезирует Verilog, Verilator моделирует RTL, OpenROAD доводит проект до топологии, SkyWater PDK даёт открытую библиотеку ячеек реального техпроцесса. Для интуиции на уровне вентилей работают nandgame и курс nand2tetris.
Планарный транзистор кончился: FinFET и нанолисты
Пока транзистор уменьшали, работал простой принцип: короче канал — быстрее прибор. Но при малых длинах затвор начал терять контроль: сток своим полем сам приоткрывает канал (эффекты короткого канала, DIBL), порог плывёт, утечка растёт. Плоская геометрия, где затвор управляет каналом только сверху, исчерпалась примерно на рубеже 2010-х. Ответ — поднять канал в третье измерение и увеличить площадь соприкосновения с затвором.
FinFET (в производстве примерно с 2011–2012 годов, к середине 2010-х подхватили все крупные фабрики) — канал в виде вертикального «плавника», затвор обнимает его с трёх сторон: управление резко улучшилось, утечка упала. Побочный эффект, важный для проектировщиков: ширина транзистора стала квантованной — задаётся числом плавников, а не плавной величиной, и привычная в планарной эпохе тонкая настройка размеров исчезла. GAA / нанолисты (gate-all-around, начало 2020-х) — канал из нескольких горизонтальных пластин, затвор охватывает каждую со всех сторон; ширина снова стала настраиваемой, через ширину пластины.
Здесь же снимем частое недоразумение: «5 нм» или «3 нм» — это название узла, а не размер чего-либо в транзисторе. Уже много поколений эти цифры не соответствуют ни длине затвора, ни шагу металла; сравнивать поколения корректно по плотности (в передовых нодах 2020-х — порядок сотни миллионов транзисторов на мм²) и по энергии на операцию. Подробно — в главе «Производство».
Где абстракция протекает
Уровень «транзистор → вентиль» надёжен, но не герметичен. Утечки стоит знать даже тем, кто никогда не откроет схемотехнический редактор.
- Разброс параметров. Два «одинаковых» транзистора на одном кристалле различаются: легирование — статистический процесс, при современных размерах речь буквально о десятках атомов примеси. Отсюда работа с запасом (guardband), сортировка кристаллов по достижимой частоте и напряжению (binning) и то, что два экземпляра одной модели ведут себя чуть по-разному.
- Старение. Смещение порога под нагрузкой (NBTI), горячие носители (HCI), электромиграция в тонких проводниках — металл буквально сносит током. Проект закладывает запас на годы работы, поэтому чип «из коробки» быстрее, чем требует спецификация.
- Мягкие сбои. Частица космического происхождения или альфа-частица из примесей корпуса переворачивает бит в SRAM. Порядок — единицы–сотни FIT на мегабит в зависимости от поколения и высоты над уровнем моря (1 FIT = один сбой на 10⁹ часов). Умножьте на десятки мегабит кэша и парк серверов — получите поток событий, ради которых существуют ECC и контроль чётности.
- Энергия зависит от данных. Из
P = α C V² fследует: больше переключений — выше потребление. Значит, по потреблению и по электромагнитному излучению можно считывать данные. На этом стоит семейство атак по побочным каналам, и поэтому криптографический код пишут в постоянном времени и без ветвлений по секрету — см. «Прикладную криптографию». - Физика бьёт по памяти. Многократное «продалбливание» одной строки DRAM переворачивает биты в соседних (Rowhammer): паразитная связь между близкими ячейками нарушает изоляцию, которую программная модель считает абсолютной. Пожалуй, самый наглядный пример того, как аналоговая реальность пробивает цифровую абстракцию до уровня прикладного кода.
Что это меняет для того, кто пишет код
Спускаться до транзисторов ежедневно не нужно, но четыре вывода меняют решения на любом языке.
- Данные дороже вычислений. Раз обращение к DRAM стоит на два-три порядка больше энергии, чем сложение, оптимизация «поменьше считать» почти всегда проигрывает оптимизации «поменьше ходить за данными». Компактная структура, обход по порядку, пересчёт вместо кэширования мелочей — это не микрооптимизации, а следствие физики.
- Частота — плохая мера. Она ничего не говорит ни о работе за такт, ни о том, удержит ли чип эту частоту под нагрузкой: бюджет мощности и тепловой лимит решают больше. Как читать характеристики без самообмана — в «Выборе железа под задачу».
- Постоянное время — это про железо, а не про стиль. Одинаковый код для обеих ветвей имеет смысл ровно потому, что энергия и задержка зависят от данных.
- Пределы физические, а не организационные. Никто не «придерживает» частоту: 60 мВ/декаду при 300 К — это термодинамика. Поэтому дальше идут путём параллелизма и специализации, и об этом весь остаток трека.
Типичные заблуждения
- «Транзистор — это ключ: ток либо есть, либо нет». Ток есть всегда, вопрос лишь в том, на сколько порядков он меньше. Утечка закрытых транзисторов — заметная часть бюджета мощности современного чипа.
- «Нанометры — это размер транзистора». Давно нет: это торговое имя узла, сравнивать надо плотность и энергию на операцию.
- «Выключенный блок ничего не потребляет». Остановленный тактом блок не тратит динамическую мощность, но продолжает течь статически, пока не обесточен целиком.
- «Логика дешёвая, память дорогая». Дорога не память как таковая, а перемещение данных: длинные провода и большие массивы.
- «Больше вентилей — медленнее схема». Такт определяется не числом вентилей, а длиной критического пути. Часто добавление логики (ускоренный перенос, предвычисление) укорачивает путь и повышает частоту.
- «Синхронный дизайн — единственно возможный». Асинхронные схемы без глобального такта существуют; они лучше по энергии и хуже по предсказуемости и инструментам, поэтому остаются нишевыми.
Мини-итог
- Цифровая логика — это дисциплина поверх аналоговой физики: диапазоны напряжений, запрещённая зона, восстанавливающие вентили.
- МОП-транзистор управляется полем через изолированный затвор, а затвор — конденсатор. Вся цифровая техника сводится к перекачиванию заряда: отсюда задержка
C·ΔV/Iи энергияC·V². - Подпороговый размах не может быть лучше примерно 60 мВ/декаду при комнатной температуре. Это запрещает бесконечно снижать порог, а значит и напряжение — корень конца масштабирования Деннарда и остановки роста частоты.
- КМОП строит вентиль из двух двойственных сетей: отсюда дешевизна NAND/NOR, дороговизна широких вентилей и существование составных ячеек.
- Такт определяется критическим путём, и логика занимает лишь около половины его бюджета; остальное — накладные расходы синхронности, перекос такта и запасы.
- Компромиссы «площадь против скорости» дают триггер, SRAM, DRAM и флеш — и из них вырастает иерархия памяти.
- Проектируют на RTL, а корректность по времени проверяют статическим анализом за
O(V+E)вместо перебораO(2ⁿ).
Источники и что читать дальше
- Neil Weste, David Harris. CMOS VLSI Design: A Circuits and Systems Perspective — канонический учебник по всему, что было выше: https://pages.hmc.edu/harris/cmosvlsi/4e/index.html
- David Harris, Sarah Harris. Digital Design and Computer Architecture — мост от вентилей к процессору, с RTL и лабораторными на RISC-V.
- Ivan Sutherland, Bob Sproull, David Harris. Logical Effort: Designing Fast CMOS Circuits — откуда берётся правило «умножай размер вчетверо на ступень».
- R. Dennard et al. Design of Ion-Implanted MOSFET’s with Very Small Physical Dimensions, IEEE JSSC, 1974: https://ieeexplore.ieee.org/document/1050511
- Mark Horowitz. Computing’s Energy Problem (and what we can do about it), ISSCC 2014 — источник порядков «энергия на операцию»: https://ieeexplore.ieee.org/document/6757323
- IEEE IRDS — открытая дорожная карта отрасли, без маркетинга: https://irds.ieee.org/
Смежные материалы портала: обзорный уровень — «Как работает процессор»; взгляд со стороны кода — «Основы ассемблера»; как это выглядит для инженера-встройщика — «Основы железа» и «Питание и ограничения».
Что дальше
Мы разобрали, из чего физически сделан вентиль и во что обходится каждое переключение. Следующий уровень абстракции — договор между этим железом и программой: какие операции процессор обещает выполнять, какие регистры показывает наружу и что именно гарантирует.