Как отличить начинающего профессионала от умудренного хоббиста в цифровой схемотехнике?

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

В чем главное отличие между FPGA-хоббистом, ностальгирующим по КР580ИК80 на пенсии - и начинающим микроархитектором, ориентированным на будущее трудоустройство в передовую процессорную компанию или сфинансированный венчурными капиталистами стартап?

Три слова: понимание концепции конвейера. Молодым профессионалом, не старым хоббистом.

Это наглядно видно, если вы погуглите тексты про FPGA для начинающих. Если текст пишет программист, которому захотелось потрогать FPGA чисто для разнообразия, он как правило до конвейера не доходит. Помигает лампочками, поговорит про конечные автоматы и может начнет встраивать какую-нибудь FPGA-реализацию старого 8-битного процессора.

(Некоторые из таких людей даже пишут книги - вот некий Роберт Дунне реализовал процессор конечным автоматом с состояниями fetch/decode/execute, но до конвейера не дожал)

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

Но это надо преодолеть, поскольку если вы прийдете интервьироваться в какой-нибудь AMD на позицию юного проектировщика, вас будут спрашивать не как помигать лампочками и засунуть Радио РК-86 в Xilinx, а как стоя перед интервьирующим написать на доске конвейерную реализацию какого-нибудь умножения со сложением. Или сделать это на компьютере отрезанном от интернета, так что вы даже не cможете нагуглить решение - вот садисты, а?

Именно этому вопросу будет посвящено следующее занятие Сколковской Школы Синтеза Цифровых Схем.

Это занятие состоится 4 декабря в Технопарке "Альтаир" МИРЭА
(пр-т Вернадского, 86, стр.2, Метро"Юго-Западная)

Вот живой линк на трансляцию:

В свое время я написал тест в стиле ЕГЭ для студентов университета под названием NPU в Фримонт, Калифорния, где я помогал преподавать компьютерную архитектуру Тимуру Палташеву из AMD. В тесте приводились три реализации арифметического блока для вычисления возведения числа - комбинационная, последовательностная и конвейерная.

Этот тест я приведу ниже, а до него приведу аллегорическое объяснение информации, нужной для прохождения теста, из другого моего текста:

Разъяснение на пальцах концепций комбинационной (combinational), секвенциальной (sequential) и конвейерной (pipelined) организации вычислений

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

Если целью является минимизация количества помещений для осмотра, то можно усадить всех членов комиссии в одну большую комнату, в которую впускать по одному. Это пример комбинационной (combinational) организации вычислений. Недостатком его будет то, что осмотр всех допризывников будет проходить долго, а члены комиссии будут скучать [каждый из четырех членов комиссии соответствует схеме умножения на схеме ниже].

Как это выглядит в виде кода, а также синтезированной из него схемы (до mapping-а, размещения и трассировки). Комбинационный каскад из пяти операций умножения:

module pow_5_implementation_1
(
    input  [17:0] n,
    output [17:0] n_pow_5
);

    assign n_pow_5 = n * n * n * n * n;

endmodule

Если целью является минимизация количества специалистов, то можно устроить и так, но при этом у военкоматовца-одиночки должно быть несколько специальностей (глазник, зубник, уролог), и нужно будет нанять специального товарища, который бы временно выводил допризывника из комнаты, пока военкоматовец меняет в ней оборудование - вещает табличку проверки зрения на стену, ставит зубоврачебное кресло (обстановка, определяемая состоянием конечного автомата, state). А потом помощник по звоночку (тактовому сигналу, clock) вводил бы допризывника обратно для следущей стадии осмотра.

Это пример секвенциальной (sequential) организации вычислений. Частным случаем такой организации вычислений является популярный в 1970-х годах микрокод - трюк, который я не буду рассматривать в данном посте.

Соотвественно (здесь у нас только операция умножения, которое повторяется пять раз, Но можно построить пример, в котором тут будет ALU с разными операциями в каждом такте):

module pow_5_implementation_3
(
    input         clock,
    input         reset_n,
    input         run,
    input  [17:0] n,
    output        ready,
    output [17:0] n_pow_5
);

    reg [4:0] shift;

    always @(posedge clock or negedge reset_n)
        if (! reset_n)
            shift <= 0;
        else if (run)
            shift <= 5'b10000;
        else
            shift <= shift >> 1;

    assign ready = shift [0];

    reg [17:0] r_n, mul;

    always @(posedge clock)
        if (run)
        begin
            r_n <= n;
            mul <= n;
        end
        else
        begin
            mul <= mul * r_n;
        end

    assign n_pow_5 = mul;

endmodule

Наконец, если у вас есть много комнат, то можно организовать конвейер (pipeline), который будет обеспечивать наибольшую пропускную способность, в идеальном случае определяемую только одним (самым медленным) специалистом. В неидеальном случае допризывник может начать пререкаться и затормозит процесс для всех (stall) или для всех. кто стоит за ним (slip). Против этого существуют всякие out-of-order методы, которые я не буду рассматривать в этом посте - наш "военкомат" (конвейер для вычисления функции) будет работать идеально.

На фото выше - только одна комната. Можно представить несколько комнат с медиками, которые пересекает в процессе допризывник, как чиcло n пересекает пять "комнат" (регистров из D-триггеров, перед которыми сидят медики - четыре операции умножения.

module pow_5_implementation_2
(
    input             clock,
    input      [17:0] n,
    output reg [17:0] n_pow_5
);

    reg [17:0] n_1, n_2, n_3;
    reg [17:0] n_pow_2, n_pow_3, n_pow_4;

    always @(posedge clock)
    begin
        n_1 <= n;
        n_2 <= n_1;
        n_3 <= n_2;

        n_pow_2 <= n * n;
        n_pow_3 <= n_pow_2 * n_1;
        n_pow_4 <= n_pow_3 * n_2;
        n_pow_5 <= n_pow_4 * n_3;
    end

endmodule

А теперь вы можете сами ответить на вопросы, которые я задавал студентам в Северо-Западном Политехническом Университете по поводу этих трех схем:

7. Which implementation is likely to allow the highest maximum frequency (assuming that the outputs of the combinational implementation are connected to clocked register)?

a) pow_5_implementation_1; b) pow_5_implementation_2; c) pow_5_implementation_3

8. Which implementation is likely to use the smallest number of gates?

9. Which implementation is likely to have the highest throughput (number of calculated pow_5(n) results per seconds)?

10. Which implementation is going to have the smallest latency in clock cycles (assuming that the outputs of the combinational implementation are connected to clocked registers)?

И коронный вопрос:

11. The testbench instantiated all three implementations of pow_5.

module testbench;

    reg         clock;
    reg         reset_n;
    reg         run;
    reg  [17:0] n;
    wire        ready;

    wire [17:0] n_pow_5_implementation_1;
    wire [17:0] n_pow_5_implementation_2;
    wire [17:0] n_pow_5_implementation_3;

    initial
    begin
        clock = 1;

        forever # 50 clock = ! clock;
    end

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

    pow_5_implementation_1 pow_5_implementation_1
        (n, n_pow_5_implementation_1);

    pow_5_implementation_2 pow_5_implementation_2
        (clock, n, n_pow_5_implementation_2);

    pow_5_implementation_3 pow_5_implementation_3
        (clock, reset_n, run, n, ready, n_pow_5_implementation_3);

    integer i;

    initial
    begin
        #0
        $dumpvars;

        $monitor ("clock %b reset_n %b n %d comb %d seq %d run %b ready %b pipe %d",
            clock,
            reset_n,
            n,
            n_pow_5_implementation_1,
            n_pow_5_implementation_2,
            run,
            ready,
            n_pow_5_implementation_3);

        @(posedge reset_n);
        @(posedge clock);

        for (i = 0; i < 50; i = i + 1)
        begin
            n   <= i & 7;
            run <= (i == 0 || ready);

            @(posedge clock);
        end

        $finish;
    end

endmodule

An engineer simulated the testbench and got the following waveform. However he forgots the order he added the last three signals to the waveform. Can you determine which signal is the output of combinational implementation, sequential non-pipelined implementation and sequential pipelined implementation?

a) The order is (from upper n_pow_5... to lower n_pow_5...): combinational, sequential non-pipelined implementation, pipelined

b) combinational, pipelined, sequential non-pipelined implementation

c) pipelined, combinational, sequential non-pipelined implementation

d) pipelined, sequential non-pipelined implementation, combinational

e) sequential non-pipelined implementation, combinational, pipelined

f) sequential non-pipelined implementation, pipelined, combinational

Если вы разобрались с этим упражнением, то вам будет гораздо проще понять и как работает конвейер в процессоре, графическом процессоре, сетевых чипах - принцип тот же самый, но вокруг этого много наворотов - приостановок, очередей, backpressure, кредиты итд - за знание всего этого собственно и платят заработную плату в группах разработки чипов в Apple, NVidia, Cisco, Syntacore, НИИСИ (крутой российский процессор Комдив-64) итд.

Следующее занятие на школе будет про графику. Собственно вот вся программа:

  • 30 октября 2021: 1. Введение в маршрут проектирования и упражнения с комбинационной логикой.

  • 13 ноября 2021: 2. Архитектура: вид процессора с точки зрения программиста.

  • 20 ноября 2021: 3. Последовательностая логика и конечные автоматы.

  • 27 ноября 2021: 4. Разбор учебного проекта: распознавание и генерация звуков и мелодий.

  • 4 декабря 2021: 5. Конвейеры и систолические массивы, с приложением для искуственного интеллекта.

  • 11 декабря 2021: 6. Разбор учебного проекта: модульная графичеcкая игра со спрайтами.

  • 18 декабря 2021: 7. Микроархитектура однотактового процессора.

  • 25 декабря 2021: 8. Микроархитектура конвейерного процессора.

  • 15 января 2022: 9. Проектирование процессорного кэша и измерение его производительности.

  • 22 января 2022: 10. Стандартные блоки и приемы проектирования: очереди FIFO и кредитные счетчики.

  • 29 января 2022: 11. Стандартные блоки и приемы проектирования: арбитры, банки и разделение памяти.

  • 5 февраля 2022: 12. Пробуем маршрут RTL2GDSII: как разрабатываются массовые микросхемы. Часть I.

  • 12 февраля 2022: 13. Пробуем маршрут RTL2GDSII: как разрабатываются массовые микросхемы. Часть II.

  • 19 февраля 2022: 14. Имитиция собеседования на позицию проектировщика цифровых микросхем.

  • 26 февраля 2022: 15. Разбор имитации интервью с вручением поощрительных призов.

Присоединяйтесь онлайн и офлайн - еще даже остались бесплатные (оплаченные Syntacore / Ядро Микропроцессоры, Максимом Масловым и Cadence Design Systems) платы с микросхемами ПЛИС. См. пост Готовимся к Сколковской Школе Синтеза Цифровых Схем: литература, FPGA платы и сенсоры - для деталей:

Источник: https://habr.com/ru/post/593377/


Интересные статьи

Интересные статьи

В задачах обработки сигналов часто возникает необходимость фильтрации сигналов, когда сигнал разбивается на узкополосные диапазоны. В бытовом плане мы с этим сталкиваемся при воспроизведении музыки че...
Субботний вечер омрачен скандалом - сайт не работает, провайдер негодяй, админы - не специалисты, а сервера - решето. Вызов принят, или почему при всей нелюбви к 1С-Битри...
В прошлой части мы поговорили о советах директору по разработке бизнес-процесса в Битрикс24, сейчас же я постараюсь дать советы руководителям отделов, поскольку по моему опыту почти всегд...
Статья о том, как упорядочить найм1. Информируем о вакансии2. Ведём до найма3. Автоматизируем скучное4. Оформляем и выводим на работу5. Отчитываемся по итогам6. Помогаем с адаптацией...
«Битрикс» — кошмар на костылях. Эта популярная характеристика системы среди разработчиков и продвиженцев ныне утратила свою актуальность.