Yuri Panchul (panchul) wrote in ru_programming,
Yuri Panchul
panchul
ru_programming

Введение в дизайн харвера микросхем для тех программистов, которые этим никогда не занимались

Господа! Я периодически встречаю программистов (в том числе хороших), которые имеют совершенно фантастические представления о дизайне хардвера. Например, есть люди, которые думают, что языки описания хадвера Verilog и VHDL транслируются в микрокод, есть люди, которые думают, что микросхемы сейчас дизайнятся с помощью рисования мышкой по экрану, и есть люди, которые не знают, зачем в микросхемах clock, то бишь синхросигнал.

Поэтому я написал текст под катом, чтобы на уровне примерно 5-го класса средней щколы сделать введение в данные материи. Зачем это нужно? Я думаю, что то, что я написал, может быть интересным следующим трем группам:


1. Юным программистам, которые могут захотеть внести коррекцию в свои планы карьеры, и выучиться не на гуру операционных систем или компиляторов, а на дизайнеров микропроцессоров и графических чипов используя методологию RTL (register-transfer-level - уровень регистровых передач, не путать с другими расшифровками этой аббревиатуры).

2. Алгоритмически-ориентированным программистам среднего возраста, которые могут захотеть сделать карьеру в логически сложных средствах проектирования электроники (Electronic Design Automation). Я сам работал в индустрии средств проектирования электроники больше 15 лет, после чего перешел в саму электронную индустрию.

3. Опытным программистам, которые могут захотеть сменить карьеру с например писания ООП приложений на Джаве на карьеру в Design Verification на SystemVerilog - это создание фреймворков, которые тестируют хардверные дизайны на прочность, бомбардируя их превдослучайными транзакциями и учитывая functional coverage (это сейчас модно и хорошо оплачивается).



Итого. В последние 20 лет дизайн чаще всего пишется на языке Verilog (в Европе и у военных - VHDL), после чего специальная программа (logic synthesis) превращает дизайн в граф из проводов и логических примитивов, другая программа (static timing analysis) сообщает дизайнеру, вписывается ли он в бюджет скорости, а третья программа (place-and-route) раскладывает этот дизайн по площадке микросхемы.

Когда дизайн проходит все этапы: кодирование на верилоге, отладка, верификация, синтез, static timing analysis, floorplanning, place-n-route, parasitics extraction и т.д. - получается файл под названием GDSII, который отправляют на фабрику, и фабрика выпекает микросхемы. Самые известные фабрики этого типа принадлежат компании Taiwan Semiconductor Manufacturing Company или TSMC.


Теперь допустим, нам нужно сделать микросхему - счетчик, которая бы выводила в цикле числа 0, 1, 2, 3, 0, 1, 2, 3, ...

Пишем на SystemVerilog:

 
module counter
(
    input              clock,
    input              reset,
    output logic [1:0] n
);

    always @(posedge clock)
    begin
        if (reset)
            n <= 0;
        else
            n <= n + 1;
    end

endmodule


Это означает: Имеется модуль, в который идет два провода - clock (синхросигнал, который идет вверх-вниз-вверх-вниз-...) и reset (сброс в начальное состояние). Из модуля выходит тоже два провода, которые образуют одно двухбитное число, которое на каждом биении синхросигнала увеличивают значение на единицу (по модулю 4). Иными словами: на каждом положительном фронте сигнала (clock edge) смотреть на провод reset. Если reset равен 1, то обнулить внутренний регистр (подсоединенный к выводу), если reset равен 0, то увеличить число, хранящееся в этом регистре на единицу.

Теперь если скормить этот код синтезис-тулу, в нашем случае Synopsys Design Compiler, то он превратит его вот в такую схему:



Если покрупнее фрагмент:



Схема выглядит мудрено, но на самом деле она работает так:



Note: Да, я знаю, что это "проще" реализовать с помощью двух T-flip-flops, но я показал это именно так, чтобы иллюстрировать общий принцип "комбинаторная логика + флип-флопы" (см. картинка с википедии):



Разъяснение что есть что:

Квадратик слева - сумматор, такой комбинаторный дизайн, которые берет на входе два числа и через некоторое время T выдает на выходе их сумму. До истечения времени T на выходе сумматора будут находиться какие-то неопределенные значения, а после T все устаканится.

Время T должно быть меньше, чем время между пульсами синхросигнала. Точнее, наоборот. Дизайнер задаёт программе-синтесайзеру, с какой частотой он хочет гонять дизайн, и программа подбирает подходящий сумматор (быстрый-большой, медленный-маленький и т.д.) под эту частоту. Если получится.

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

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

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

Теперь как это отлаживать? А очень просто. В язык Verilog входит не только "synthesizable subset" (подмножество языка, код на котором в конечном итоге становится силиконовыми дорожками и силиконовыми транзисторами, переключающимися за наносекунды).

В верилог входит еще и "behavioral level", кучу конструкций для обыкновенного программирования, которые позволяют писать на верилоге высокоуровневые модели и тесты для симуляции блоков, процессоров и систем на обычных компьютерах.

Например, тест для нашего счетчика может выглядеть так:

module testbench;

    // Декларируем провода

    logic       clock;
    logic       reset;
    logic [1:0] n;

    // Адын инстанс модуля counter
    counter counter_instance (clock, reset, n);

   // Инициализируем и врубаем синхросигнал,
   // меняющий значение каждые 5 условных наносекунд

    initial clock = 0;
    always # 5 clock = ~ clock;

    // Через два цикла синхросигнала запускаем reset,
    // Держим его еще два цикла, запускаем обратно

    initial
    begin
        reset <= 0;
        repeat (2) @(posedge clock);
        reset <= 1;
        repeat (2) @(posedge clock);
        reset <= 0;
    end

    initial
    begin
        // Записываем все изменения сигналов в файл

        $dumpvars (0, counter_instance);

        // Печатаем на экране

        $display ("time clock reset n");
        $monitor ("  %2d     %b     %b %b", $time, clock, reset, n);

        repeat (10) @(posedge clock);
        $finish;
    end

endmodule


Теперь запустим все это дело на симуляторе верилога, например Cadence NC-Verilog:

ncverilog +access+r +sv counter.sv testbench.sv


ncsim> run
time clock reset n
   0     0     0 xx
   5     1     0 xx
  10     0     0 xx
  15     1     1 xx
  20     0     1 xx
  25     1     1 00
  30     0     1 00
  35     1     0 00
  40     0     0 00
  45     1     0 01
  50     0     0 01
  55     1     0 10
  60     0     0 10
  65     1     0 11
  70     0     0 11
  75     1     0 00
  80     0     0 00
  85     1     0 01
  90     0     0 01
Simulation complete via $finish(1) at time 95 NS + 0


Но харвер-инжинеры и хардвер-верификейшн-инжинеры редко отлаживаются с помощью printf-ов, то бишь $display-statement-ов. Гораздо удобнее смотреть на сигналы с помощью так называемого waveform viewer:





В больших дизайнах больше кода на Верилоге, но суть примерно та же. Вот например на этой картинке изображен один из ранних конвейерных RISC-микропроцессоров архитектуры MIPS с пятью стадиями конвейера (Fetch, Decode, Execute, Memory Access, Write Back). Вы видите пять рядов флип-флопов и пять комбинаторных облаков, соответствующих пяти стадиям конвейера, через который проходят извлеченные из памяти команды процессора:






Дополнение 1. Кусок моей старой неопубликованной статьи про индустрию автоматизации электронного дизайна (Electronic Design Automation или EDA) (поленился окончить и опубликовать в своё время):

Дизайнеры электроники используют специальные программы, для разработки которых возникла индустрия автоматизации электронного дизайна (Electronic Design Automation или EDA). Сама по себе индустрия EDA невелика – ее рынок менее $ 5 млрд долларов, но она «питается» на гораздо более крупной индустрии дизайна и производства микросхем ($200 млрд долл), которая в свою очередь стоит на огромной (более $1 триллиона долл) мировой индустрии электронных систем, которая выпускает всю электронику – от наручных часов до систем управления спутниками. Самая большая часть рынка EDA находится в США, за ним идет Япония, затем Европа и быстрорастущий рынок Китая и других восточноазиатских стран. Многие EDA компании имеют штаб-квартиру в калифорнийской Силиконовой Долине и группы разработчиков в других частях света – в Индии, Китае, Европе, Южной Корее, Тайване или Израиле.

В конце 1950-х годов цифровая электроника строилась на основе транзисторов в отдельных корпусах на трех ножках. Первую микросхему изобрел в 1958 году инженер из компании Texas Instruments Джек Килби (Jack Kilby), который получил за это изобретение нобелевскую премию 2000 года. Но микросхема Килби была на основе полупроводника германия, а первую микросхему на основе кремния изобрел Роберт Нойс (Robert Noyce) из Fairchild Semiconductor, который работал независимо от Килби, но сделал свою микросхему на полгода позже. Первым компьютером, построенным на микросхемах, был Apollo Guidance Computer (1962), который стоял в космических кораблях, приземлившихся на Луну.

Программы, помогающие инженерам проектировать микросхемы, стали возникать еще в 1960-х. Сначала это были графические редакторы, в которых можно было прямоугольниками разных цветов рисовать слои разных типов на поверхности микросхемы. В 1970-х количество транзисторов на одной микросхеме стало исчисляться тысячами и технология изменилась - инженеры стали вводить дизайн как сеть из логических элементов («и», «или», «не», ячеек памяти), после чего специальная программа (place-and-route) автоматически расставляла логические элементы по площадке микросхемы и соединяла их дорожками. В это же время появились программы-симуляторы, позволяющие промоделировать поведение микросхемы до воплощения ее в кремнии.

«Золотым веком» EDA стали 1980 годы, когда EDA выделилась как самостоятельная индустрия (сноска: До 1980-х EDA рассматривалась как часть индустрии CAD (Computer Aided Design) или по-русски САПР (Системы Автоматизированного ПРоектирования) – индустрии, занимавшейся также механическим дизайном). В 1981 году возникла первая тройка индустриальных лидеров - компании Daisy Systems, Mentor Graphics и Valid Logic, которые сокращенно называли DMV (сноска: игра слов – DMV – это также Department of Motor Vehicles, автотранспортная инспекция). Возникли языки дизайна Verilog и VHDL и технология логического синтеза, которые вместе позволяли инженеру писать логические и математические выражения в виде текста, а не рисовать кропотливо сеть из логических элементов с помощью мышки на экране.

В 1990-х количество транзисторов на кристалле стало ограничиваться не возможностями станков на фабрике, а производительностью труда инженеров. После окончания «холодной войны» с СССР, главными клиентами EDA-компаний стали не военные, а производители потребительской электроники.



Дополнение 2 - Список рекомендуемой литературы:

Из учебников для самых начинающих лично мне больше всего понравилась David Harris, Sarah Harris. Digital Design and Computer Architecture.
Там есть и про логику, и про HDL, и введение в процессоры:



С этой книжкой можно просто взять в руки какой-нибудь бесплатный симулятор верилога - и вперед.

Также для самого-самого начала есть полезная книжка для "легкого чтения" с описанием работы дизайнеров для нетехнических людей (например маркетологов):

Essential Electronic Design Automation (EDA)
Mark D. Birnbaum



Есть также стандартная вводная книжка Patterson & Hennesy для студентов начальных курсов, но она ИМХО слишком многословная и разбавленная, кроме этого она более софтверная, чем хардверная, т.е. вначале слишком много ассемблера (для того кто уже знает, будет неинтересно):

David A. Patterson, John L. Hennessy. Computer Organization and Design, Fourth Edition: The Hardware/Software Interface.



Далее есть более продвинутая и тоже стандартная университетская книжка, но ИМХО не очень хорошо структурированная:

Computer Architecture: A Quantitative Approach, 4th Edition
John L. Hennessy, David A. Patterson



Занятная книженция с историческими статьями про изобретения тех или иных микропроцессорных штучек:

Readings in Computer Architecture (The Morgan Kaufmann Series in Computer Architecture and Design)
Mark D. Hill, Norman P. Jouppi, Gurindar S. Sohi



Вот есть еще новая книжка, которую я не читал, но судя по оглавлению,
там есть многие нужные вещи:



Microprocessor Architecture
Jean-Loup Baer

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



Вас интересуют тексты этой тематики?

Да
98(97.0%)
Нет
3(3.0%)
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 86 comments
Previous
← Ctrl ← Alt
Next
Ctrl → Alt →
Спасибо огромное! Очень интересный пост.
Нда, неожиданно такой труд тут видеть. Респект за старания, хоть и не моя это область, и интересно только для общего развития.
>(это сейчас модно и хорошо оплачивается)
Смотрим:
http://rabota.yandex.ru/search.xml?text=Verilog
Результаты на первой странице
50 000 – 70 000 руб.
70 200 руб.
100 000 – 150 000 руб.
70 200 руб.
70 000 руб.
30 000 руб.
30 000 руб.
В среднем - так себе

>(называемая по-русски "триггер")
Это очень "по-русски" )

В целом - большое спасибо. Популярно и кругозорорасширительно.
За пределами нашей страны обычно это называется flip-flop, так что триггер - действительно наша особенность.

francis_drake

6 years ago

isolder

6 years ago

Спасибо! Хоть нас этому в универе и как раз неплохо учили, но все равно полезный пост :)
Блин. Читал с открытым ртом, не поглядев даже на автора.
Спасибо!!!
Могу продолжить рассказ в реале в субботу, присоединяйтесь - http://panchul.livejournal.com/171938.html

_navi_

6 years ago

juan_gandhi

6 years ago

за список литературы отдельное спасибо!
Спасибо, очень познавательно.
Эх, затронули тему. Спасибо большое :-)
По списку литературы - есть еще Поляков - "Verilog и VHDL в проектировании цифровой аппаратуры" - она конечно устарела, но русскоязычная и как основа - пойдет. Еще из вышедших у нас можно найти "Проектирование на ПЛИС: Курс молодого бойца", если не ошибаюсь, Максфилда. Из английских еще "System Verilog for Design" и "System Verilog for Verification" неплохи.
Вот только по поводу области... Она, конечно, оплачивается и востребована, но не в России, в основном. У нас подобными вещами, на сколько я смог найти, практически всегда интересуются государственные конторы (в той или иной мере). Ну скажем: Элвис, МЦСТ, НИИСИ, НИИИС, Микрон и т.д. Зарплаты они могут дать неплохие, но "неплохие" в понятии гос.предприятий. Из зарубежных: Intel свернул разработку аппаратуры в Москве, но вроде бы что-то осталось в Нижнем Новгороде. LG, Samsung, Nvidia тоже вроде как не имеют здесь подразделений связанных именно с HDL, хотя представительства есть, но занимаются обычно ПО.
Если вы в этом плане осведомлены больше - расскажите пожалуйста, по возможности.
> Intel свернул разработку аппаратуры в Москве

Интересно, откуда у вас такая информация.


maor22

6 years ago

diam_2003

6 years ago

maor22

6 years ago

diam_2003

6 years ago

maor22

6 years ago

Текст хороший, хотя по современным меркам несколько устаревший.

С модой на SoC и "Big Bad Ass Design" производительность труда дизайнера стала ещё более критичным фактором, поэтому от рукописного RTL-я нынче все пытаются уползти. Наиболее одиозные товарищи говорят, что "RTL уже умер", но тут, как всегда, надо делать поправку на ангажированность.
*** поэтому от рукописного RTL-я нынче все пытаются уползти ***

Я конечно могу рассказать и про algorithmic / behavioral synthesis, ESL и т.д. и т.п. но я боюсь, что я буду в своём рассказе предвзят. Дело в том, что маркетинг в Synopsys/Cadence/Mentor и других компаниях уже 15 лет массажирует правду в этой области, создавая впечатление, что якобы решение проблемы algorithm -> RTL не за горами.

На самом деле ситуация гораздо сложнее и её обсуждение вышло бы за пределы данного поста, в котором я хочу дать читателям твердую основу (RTL), а дальше пусть разбираются сами.

diam_2003

6 years ago

panchul

6 years ago

diam_2003

6 years ago

maor22

6 years ago

diam_2003

6 years ago

maor22

6 years ago

diam_2003

6 years ago

maor22

6 years ago

diam_2003

6 years ago

maor22

6 years ago

diam_2003

6 years ago

maor22

6 years ago

diam_2003

6 years ago

maor22

6 years ago

diam_2003

6 years ago

maor22

6 years ago

sassa_nf

6 years ago

супер! спасибо!

Насчёт голосовалки - думаю, если Вы не будете перегружать коммьюнити постами про железо, а просто регулярно что-то подобное постить - будет очень круто!

В каментах говорят, что статья несколько устарела. Так что есть пожелание - в следующей статье ответься на эту критику!

а так - ещё раз спасибо!
Если говорить о всех новых разработках (пост-RTL), то это собъет с толку начинающего читателя. См. http://ru-programming.livejournal.com/1271886.html?thread=20457806#t20457806

Вообще у меня есть надежда именно на то, что те или иные сегодняшние молодые люди прочтут это (стандартный RTL -> GDSII flow), потом посмотрят, что дальше (уровень выше, чем RTL), выяснят, что дальше в последние 15 лет происходил разброд и шатания и придумают что-то новое. Проблема еще далеко не решена.
Еще у Тарасова есть неплохие книжки про VHDL. Книжки под рукой нет, точные данные не помню. Книжка на русском.

Кстати, у VHDL возможности чуть шире, чем у верилога, так что при наличии выбора советую именно VHDL, а не верилог или систем-С.
В VHDL есть ценные features, которых не было в исходном верилоге (packages, generics, отсутствие Verilog-style race conditions), но большинство этих features внесли сейчас в SystemVerilog, который backward compatible с Verilog, и при этом вобрал в себя все что можно и из VHDL, и из верификационных языков (Vera), и даже из SystemC (TLM 2.0, хотя ИМХО лучше если бы его там не было).

При этом в VHDL нет встроенной в язык поддержки современных методологий functional verification (constraint random transaction generation и coverage bins/groups), поэтому пользователи VHDL часто используют комбинацию из VHDL/e (Specman) и иногда даже VHDL / SystemVerilog.

Про SystemC говорить не буду, я не поклонник SystemC, хотя его хорошо знаю и согласен, что у него есть определенные применения в моделировании систем.

maor22

6 years ago

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

В принципе по теме в общих чертах мне всё понятно (ну с точки зрения несколько системного программиста), кроме одной маленькой детальки: генератор синхроимпульса в процессоре (ну тот, который clock) и тайминг вообще. Вот например в книжке по ассемблеру пишут: команда такая-то, выполняется за N тактов. Я так правильно понимаю, что такты совсем != clock? Или таки это одно и то же, и ALU может быть настолько крутым и суровым, чтобы и вправду за один такт производить какую-нибудь несложную операцию?
Сколько циклов (тактов) необходимо для выполнения инструкции зависит от того, как сделан процессор. Процессоры для цифровой обработки сигналов могут, например, за 1 такт умножить пару 16-ти битных целых из памяти, прибавить произведение к аккумулятору, обработать возникшие арифметические переполнения, увеличить/уменьшить адреса множителей чтобы можно было тут же повторить эту инструкцию со следующей парой чисел из памяти. Но это не всегда так круто или чисто. Часто (обычно?) за 1 такт делается только часть из перечисленного, а целиком инструкция выполняется за несколько тактов. Т.н. конвейер в процессоре делает возможным выполнение нескольких инструкций одновременно, но для каждой это происходит на разных уровнях: например, только одна из них читает данные из памяти, только одна другая в тот момент работает с ALU и т.д. И в среднем в итоге вполне может выходить что-то типа 1-го такта на инструкцию, а не 4, 12, 40 и т.д., и т.п., но результат получается с задержкой из-за конвейера.
Кроме того, используются частотные умножители, благодаря которым внутри процессора (и м.б. даже внутри какой-то его части) синхроимпульсы могут идти чаще в N раз, чем снаружи. И тогда нужно отличать одни синхроимпульсы от других.

serge_sb

6 years ago

panchul

6 years ago

panchul

6 years ago

serge_sb

6 years ago

archaicos

6 years ago

sassa_nf

6 years ago

sassa_nf

6 years ago

archaicos

6 years ago

sassa_nf

6 years ago

sassa_nf

6 years ago

sassa_nf

6 years ago

serge_sb

6 years ago

sassa_nf

6 years ago

serge_sb

6 years ago

archaicos

6 years ago

serge_sb

6 years ago

lonelycactus

6 years ago

sassa_nf

6 years ago

продолжению - быть!

а верификация всегда вручную? или можно задать какие-то условия, типа LTL/CTL?
Методы верификации - это целый мир, в котором присутствует как ручная, так и functional coverage-based random verification, так и model checking, formal verification (даже высокоуровневое - например автоматическое формальное доказательство, что процессор с N стадиями конвейера эквивалентен по результату записи в регистры последовательному).

sassa_nf

6 years ago

Previous
← Ctrl ← Alt
Next
Ctrl → Alt →