В одном из материалов блога YADRO мы рассказывали, как выглядит проектирование СнК с точки зрения тополога. Только вот создание топологии – это один из заключительных этапов проектирования. Что же идет до него? Давайте разбираться.

Статью можно использовать как шпаргалку для продолжающих или гайд для начинающих – тех, кто со временем хотел бы понять, как проектируют системы на кристалле. Так что мы сознательно кое-где упрощаем описания, но приветствуем уточнения и дополнения в комментариях.

Материал подготовлен по мотивам лекции Павла Кириченко, старшего инженера по разработке систем на кристалле в YADRO.

Иногда термины «микропроцессор» и СнК (система на кристалле) могут употребляться как синонимы, но по сути это разные вещи:

  • Микропроцессор — составная часть СнК.

  • СнК (система на кристалле, SoC) — это цифровая микросхема, на которой есть множество компонентов: например, сам микропроцессор и графический процессор, контроллеры и другие периферийные блоки.

Этот материал посвящен именно проектированию СнК: от запроса требований до отправки готового проекта на фабрику, где SoC будут изготовлять. 

Техническое задание

Все начинается с технического задания, ТЗ. Оно формируется двумя способами:

  • Внутри компании — когда заказчик из соседнего отдела желает получить микропроцессорные системы собственной разработки для продукта той же компании.

  • Извне — когда есть внешний заказчик.

Какие требования мы запрашиваем в рамках ТЗ? Сперва из всего разнообразия мы совместно с заказчиком выбираем архитектуру для СнК. Выбор архитектуры зависит от требуемой производительности, энергоэффективности и ряда других свойств. Тактовую частоту ядра и производительность будущей СнК мы тоже получаем в рамках ТЗ, и они напрямую зависят от архитектуры. Как это работает, подробнее разберем ниже.

Для разработки нам также нужны количество ядер, напряжение питания и предполагаемая потребляемая мощность. Также заказчик обозначает требования для встроенных интерфейсов (USB, PCIe, и т.д.), среднюю наработку СнК на отказ и прочие параметры. 

Зачастую сам заказчик не полностью представляет, что именно должно быть оговорено в ТЗ для успеха проекта, и разработчик принимает активнейшее участие в формировании задания. Поэтому среди инженеров есть поговорка, которая является шуткой лишь отчасти: «ТЗ пишет разработчик».

Получив все нужные требования, мы приступаем к проектированию СнК.

Архитектурное проектирование

Архитектура, по сути, — это система команд, с которой работает наш микропроцессор и на которой программисты будут писать свое программное обеспечение. 

На этом этапе мы создаем высокоуровневую модель процессора как «черного ящика». Такой тип модели означает, что мы не рассматриваем детально происходящее внутри системы, а лишь описываем ее реакции на определенные внешние воздействия в стиле «подали вот эти сигналы на вход, получили такую реакцию на выходе, а подали другие сигналы, получили другую реакцию». Эта грубая модель уходит на отладку системным программистам, дабы им не терять времени попусту и не дожидаться завершения разработки самой СнК.

Важно отметить, что в целом этапы проектирования идут не друг за другом, а скорей параллельно. Далее пойдет речь о разработке логического описания СнК и ее физического дизайна. Так вот, команда логического дизайна может отправить проектировщикам физического уровня часть кода для какого-то блока без полной его отладки. Они после проработки физического воплощения блока и получения отчетов о площади, быстродействии и потребляемой мощности отправят результаты исследования с указанием на выявленные узкие места и проблемы в реализации. 

В этом случае команда разработчиков логического дизайна сможет внести необходимые исправления на ранних этапах, когда сделать это намного проще, чем после окончания разработки. Исправленный вариант снова попадает физическим дизайнерам для оценки, и цикл повторяется. Такой подход называется итеративным и применяется на всех этапах проектирования СнК, да и в других инженерных областях тоже.

RTL-проектирование

RTL, он же уровень регистровых передач (Register Transfer Level), — это модель системы на более детальном уровне. Здесь уже речь идет об обмене данными внутри процессора. На этом этапе мы описываем логику работы составных частей СнК. Поэтому эта часть процесса часто называется логическим дизайном. 

Мы начинаем раскрывать на этом этапе глубокий внутренний мир нашего «черного ящика» из прошлого этапа. При этом нам пока неважно, как именно будут размещены его элементы и с какой скоростью будут бегать сигналы между ними. Важно только, чтобы все, что нам нужно, было правильно представлено и связано друг с другом. Из названия «логический дизайн» следует, что тут нужно описать логику работы нашей системы, никак не касаясь ее физической стороны.

На бумаге или в программе мы сначала рисуем блок-схему, где разные блоки изображены определенными геометрическими фигурами, а связи между ними обозначены стрелочками — по ним данные бегут от блока к блоку. Далее исходя из полученной блок-схемы проектируем потактовую модель обмена данными на языках описания аппаратуры (hardware description language), где прописываем, что изобразили на схеме. В качестве языка чаще используют либо VHDL, либо Verilog, либо их разновидности. Иногда языки смешивают и часть блоков СнК может быть написана на одном языке, а часть — на другом. 

Простой блок на языке Verilog
Простой блок на языке Verilog

Такие языки описания аппаратуры можно по-простому назвать «одновременными языками»: они описывают, что должно происходить в каждый момент (он же такт), а не в каком порядке. И это одно из существенных отличий языков описания аппаратуры от языков программирования. В реальной системе сигналы бегут по всем проводам одновременно. Поэтому совершенно не важно, в какой последовательности в Verilog будут записаны операции внутри одного такта. Процесс похож на то, что как выступают музыканты в оркестре: партитура у всех своя, но при этом они исполняются одновременно.

В примере на рисунке выше смена такта происходит, когда сигнал clk меняется с 0 на 1, потому что используется конструкция posedge clk. Это сокращение от positive edge, его противоположность — это обратное переключение negative edge или negedge. Эта конструкция встречается в двух местах в модуле pipe:

  • @ (posedge clk) — ждем положительного фронта тактового сигнала, то есть когда clk меняется с 0 на 1.

  • repeat (2) @ (posedge clk) — ждем два фронта (два подъема сигнала clk с 0 до 1) перед тем, как присвоить значение in в out.

Что в итоге происходит в коде выше? Мы реагируем на все изменения входа in (always @(in)) при положительном фронте тактового сигнала (@ (posedge clk)), но значение in передаем на выход out только спустя два фронта (repeat (2) @ (posedge clk)). Все эти операции идут одновременно и на входе, и на выходе.

Не имеет значения, написали бы мы сначала прием сигнала на входе или передачу сигнала на выход — электрические сигналы по кристаллу бегут по всем проводам постоянно. 

Для чего же нам нужен тактовый сигнал? Для ответа на этот вопрос рассмотрим схему:

Сумматор с входами A и B выдает на выходе сумму S. Эта сумма идет на вход регистра D, регулируемого сигналом clk. Регистр выдает сумму на выход Q только при переключении clkиз 0 в 1
Сумматор с входами A и B выдает на выходе сумму S. Эта сумма идет на вход регистра D, регулируемого сигналом clk. Регистр выдает сумму на выход Q только при переключении clkиз 0 в 1

Мы видим сумматор, который обозначен сложной геометрической фигурой со входами A и B для слагаемых и выходом суммы S. А за ним установлен прямоугольник под названием «регистр», управляемый тактовым сигналом clk. На входы сумматора поступают два потока чисел: D1 и D2. При этом в реальной системе данные могут поступать не одновременно. Чтобы как-то это изобразить графически, применяются временны́е диаграммы, подобные той, что на рисунке выше. Сигналы располагаются друг над другом — как бы идут параллельно друг другу, — и на каждом из них откладывается время (на схеме это вертикальные пунктиры).

Когда одноразрядные сигналы, такие как clk, равны логическому нулю, рисуется низкий уровень (горизонтальная линия пониже), а при логической единице — высокий (горизонтальная линия повыше). Переключение из низкого уровня в высокий у clk и будет тем самыми posedge.

Сигналы многоразрядные, такие как D1 и D2, изображают двумя параллельными линиями, между которыми прописывают текущее значение данного числа. А при переключении хотя бы в одном из его разрядов линии перекрещивают и вписывают между ними новое значение.

Можно заметить, что многоразрядные сигналы D1 и D2 изменяются в произвольные моменты, приводя к соответствующему изменению суммы S. Каждый разряд может приходить к сумматору с разной скоростью в реальной физической системе, из-за этого значение суммы может быть недостоверно. Это представлено на рисунке выше теми событиями, когда сумма становится на короткое время равной 15, 23 или 9. Мы избавляемся от этой недостоверности за счет упорядочивания времени приема данных — как в поликлинике, где есть определенная периодичность приема пациентов. В реальной жизни, правда, нарушаемая разными «я только спросить». 

В качестве такого «упорядочивателя» используется важный элемент в цифровой электронике — регистр, который, как можно догадаться, регистрирует электрические сигналы. Это особенный тип электронных схем, который обладает эффектом памяти. Управляется же эта память тактовым сигналом. Один регистр — это ячейка памяти, она запоминает один бит. Если мы поставим 64 таких в ряд, они будут запоминать 64-битное число. 

Пока в регистр не придет нужная часть сигнала clk, ему абсолютно все равно, что происходит у него на входе — воображаемая калитка для прохода данных внутрь него и далее закрыта. Значения из сумматора подаются на вход регистра D непрерывно. Но на выход регистра Q попадают только суммы, которые были поданы на вход во время переключения clk из низкого уровня в высокий, когда сработала конструкция @(posedge clk). Именно в этот краткий миг калитка приоткрывается и данные со входа попадают на выход. 

Как только сигнал покидает регистр, он попадает в одну из частей произвольной логики, одним из примеров которой был сумматор. Фактически, у нас есть два класса схем: произвольная логика, выполняющая какие-то операции над числами, и регистры, запоминающие промежуточные результаты по команде от тактового сигнала. Последовательность регистров и логики называют RTL-конвейером.

Мы добавляем «облака» произвольной логики между регистрами, создавая регистровые передачи, чтобы не было одного большого «облака». Иначе данные будут обрабатываться очень долго, и это будет тормозить их передачу. Форма облака была когда-то выбрана, чтобы на общей схеме не рисовать конкретное исполнительное устройство, которых существует гигантское множество, а просто показать, что здесь у нас есть нечто, обрабатывающее числа, а что конкретно — неважно.

Благодаря размещению регистров между исполнительными устройствами, мы дробим работу процессора, а не ждем, пока он закончит каждое вычисление. Мы выполнили какую-то часть операции, по тактовому сигналу записали ее в регистр, и с выхода регистра она почти в тот же момент поступила на вход следующего «облака» логики — вот так внутри процессора данные передаются, как по конвейеру, управляемому сигналом clk

Производительность процессора зависит от того, сколько логики мы можем поместить между двумя регистрами при одной и той же тактовой частоте. Не слишком много, чтобы данные там не задерживались, но и не слишком мало — иначе ни о какой производительности речь не идет. 

Задачка про скорость тактовой частоты

Дано:

Тактовая частота микропроцессора = 3 ГГц.

Скорость света = 3*108 м/с.

Найти:

Расстояние в вакууме, которое преодолевает свет за 1 такт.

Решение:

Тактовая частота показывает, сколько тактов процессор может выполнить за секунду. У нас 3*109 тактов в секунду, т.е. одна операция (такт) происходит за ~0.33*10-9 секунд.

Теперь умножим это время на скорость света: ~0.33*10-9 × 3*108 м/с ≈ 0.1 м ≈ 10 см

Таким образом, пока длится один такт частоты 3 ГГц, свет успевает пройти всего 10 см!

Верификация

RTL-уровень включает наибольшее количество верификаций, то есть проверок. Мы должны убедиться, правильно ли реализовали то, что запланировали на предыдущих этапах. В начале этого этапа у нас была некоторая идея, выраженная в схеме, а в итоге нам надо получить формальное машиночитаемое описание СнК и при этом быть уверенными, что оно правильно реализует нашу идею. Мы пишем много тестов, запускаем их и вносим в RTL правки, пока не добиваемся того, чтобы все работало. Всем этим занимается специальная команда верификаторов.

Даже после отправки чипа на фабрику верификация RTL не прекращается: может быть такое, что чип уже изготовили, а потом нашли баг — его надо будет постараться обойти программными средствами. В самом чипе после его изготовления уже ничего не исправишь, но часто можно сделать программную «заплатку», которая позволит обойти проблему, пусть и с некоторой потерей производительности. Но для этого проблему нужно диагностировать.

Логический синтез

После получения отлаженного RTL, мы приступаем к логическому синтезу. На этом шаге мы переходим от абстрактного описания, не привязанного к конкретной технологии, к реальной технологической модели. 

Мы подаем RTL и некоторый набор логических элементов (И, ИЛИ, Исключающее ИЛИ, регистров и прочих) на вход специализированной САПР. Библиотеки логических элементов разработчикам предлагает либо сама фабрика-изготовитель чипов, либо сотрудничающие с ней фирмы. Эти библиотеки включают в себя как логические функции элементов, так и их физические характеристики: размеры, потребляемую мощность, задержки переключения и многое другое. 

Здесь в полный рост и проявляется важный нюанс: не бывает ничего идеального. Как в прошлом примере многоразрядные числа подавались на вход сумматора асинхронно, так и ток по проводам стабильно не течет. При замене какого-нибудь абстрактного логического И из RTL на его реальное воплощение появляются изъяны фронтов – переключение из состояния 0 в состояние 1 происходит не за бесконечно малое, а все-таки за некоторое время. Что в свою очередь приводит к ложным переключениям, показанным на рисунке ниже при сравнении одних и тех же сигналов — в идеальном RTL, где нет никаких задержек, и в реалистичном синтезе. 

Идеальный мир RTL сталкивается с реальным миром логического синтеза
Идеальный мир RTL сталкивается с реальным миром логического синтеза

Логические элементы в их физическом воплощении должны быть рассчитаны на разную нагрузочную способность, то есть выдавать разную силу тока на выходе. Поэтому для каждой логической функции представлены несколько вариантов одних и тех же схем, а значит, в библиотеке могут быть сотни (а иногда и тысячи) логических элементов для разной нагрузочной способности и других случаев.

Мы могли бы сделать все схемы с максимальной нагрузочной способностью, потому что чем больше ток — тем эффективнее, не так ли? Все не так просто. Элемент с большой нагрузочной способностью занимает бо́льшую площадь и создает бо́льшую нагрузку для предыдущих элементов. Поэтому нам и нужен самый широкий выбор вариантов элементов с разной нагрузочной способностью — чтобы САПР при оптимизации произвольной логики под требования конкретного проекта могла выбрать именно тот вариант, который наилучшим образом подходит в конкретном месте.

У каждой схемы в технологической библиотеке есть несколько вариантов с разным усилением тока, и для каждого из них авторы библиотеки рисуют топологию — послойный чертеж.

Схемотехническое представление функции XOR
Схемотехническое представление функции XOR
http://www.eecs.tufts.edu/~rjdang/Booth_Multiplier/xor2_1x/xor2_1x_layout.png
Топологическое представление функции XOR для некоторой технологии 
Для самых любопытных про топологию

Библиотечные ячейки называются стандартными, так как у них всех изначально была одинаковая высота. Ширина тоже менялась не произвольно, а с определенным шагом, чтобы соблюдать кратность горизонтальных размеров. Теперь высота стала квантованной – одна ячейка может быть и двукратной, и четырехкратной, и даже восьмикратной высоты. Такой подход позволяет САПР легко составлять из библиотечных элементов сложные блоки, как из конструктора LEGO.

Физическое проектирование

После этапа логического синтеза, когда мы прошли несколько кругов-итераций между ним и RTL, исправили все ошибки и узкие места, самое время приступить к физическому проектированию.

Сперва физическая планировка происходит в схематическом виде: у нас есть некий кристалл, он же чип, он же микросхема, с условными входами и выходами. На нем мы должны разместить блоки, спроектированные на прошлом этапе, и связующую логику между ними.

Мы пишем САПР, как мы хотим, чтобы все стояло: какие блоки ближе, какие дальше, что с чем соединяется, какая толщина проводов, каким образом к ним будет подведено питание и так далее. На этом этапе с первого раза далеко не все получается. Иногда надо просто передвинуть какие-то блоки, а иногда и RTL затронуть, если обнаруживается непреодолимое препятствие — например, в виде слишком длинной цепочки логических элементов. 

На этапе физического проектирования во внимание принимаются не только задержки логических элементов, но и неидеальность проводов. Закон Ома никто не отменял, как и электрическую емкость между двумя длинными проводами, из-за которой между ними возникают помехи. Паразитные сопротивления и емкости проводов (это не ругательство, а технический термин) могут повлиять на работу устройства самым драматическим образом и даже иногда потребовать его радикальной переделки.

Обычно после составления и отладки планировки кристалла проводится трассировка сетки питания из проводников во всех доступных слоях — чтобы напряжение от выводов микросхемы, подключенных к самому верхнему слою, достигло транзисторов в самом низу. Затем — размещение стандартных ячеек в соответствии с заданными ограничениями и критериями оптимизации. Следом строится дерево синхронизации: набор из проводов и усилителей, который подведет тактовый сигнал ко всем регистрам чипа. А в финале — трассировка всех оставшихся сигналов данных.

Подробнее про этот этап можно почитать в статье «Разработка и производство современных ASIC/СнК глазами тополога».

http://www.tms.org/pubs/journals/JOM/0509/fig1.large.gif
Срез шестислойной технологии под электронным микроскопом с подписанными металлами — пронумерованные буквы М — и переходные окна между ними

Заключение

Мы завершили разработку всех нужных нам блоков на всех уровнях проектирования и получили файл в специальном формате. Фактически, это послойный чертеж нашего чипа, который мы отправляем на фабрику. Там наш кристалл «испекут», а мы продолжим работать: верификаторы будут искать баги, а все остальные команды переключатся на новые проекты.

Весь этот путь мы прошли, чтобы создать один маленький кристалл. Сам он площадью не больше 100 мм2. Однако общая длина проводов внутри больше, чем расстояние от Москвы до Тулы. 

Готовую систему на кристалле устанавливают в устройство, будь то СХД или персональный компьютер, и там она приступает к работе.

? Разобраться в произвольной логике, собрать свой секундомер и другие устройства на макетной плате, а самое главное — понять, как они работают, можно на открытом курсе по схемотехнике. 

? Начать знакомство с электроникой

Комментарии (2)


  1. nerudo
    06.08.2025 10:13

    Мне так нравятся подобные статьи: берем логический вентиль, приделываем к нему триггер, моделируем, немного магии и микросхема на сто миллионов гейтов готова, встречайте на полках магазинов...


    1. yadro_team Автор
      06.08.2025 10:13

      В начале статьи мы отметили, что сознательно упростили некоторые описания, чтобы статья была понятна начинающим. Мы приветствуем уточнения и дополнения в комментариях, а в будущем постараемся и про «магию» рассказать :)