Skip to content

Вопросы на собеседовании: FPGA-инженер

100 реальных вопросов с образцовыми ответами и пояснениями для уровня Junior.

Смотреть пример резюме: FPGA-инженер

Тренировка флешкарточками

Интервальное повторение · Hunter Pass

Вопросы

fpga

FPGA представляет собой реконфигурируемую микросхему, аппаратная структура которой программируется под конкретную цифровую схему.

  • CPU выполняет последовательность инструкций на в основном фиксированном оборудовании, а FPGA может реализовать множество операций как параллельные схемы.
  • ASIC имеет неизменяемую после производства схему и может быть плотнее или эффективнее, зато FPGA можно перепрограммировать.
  • Проект для FPGA отображается на такие ресурсы, как LUT, триггеры, память, DSP-блоки и маршрутизация.

Зачем это спрашивают: Интервьюер проверяет, понимает ли кандидат, что именно физически проектируется внутри FPGA.

fpgabitstreamconfig

Конфигурационный bitstream программирует ресурсы FPGA и связи между ними для реализации синтезированного проекта.

  • Конфигурационные биты выбирают содержимое LUT, ключи маршрутизации, режимы I/O и параметры hard-блоков.
  • Файл создаётся для конкретного семейства и устройства FPGA, поэтому это не переносимый машинный код.
  • Многие FPGA на SRAM загружают bitstream из внешней flash-памяти или от хоста при каждом включении питания.

Зачем это спрашивают: Сильный ответ связывает bitstream с физической конфигурацией, а не считает его обычной программной прошивкой.

hdl

HDL описывает аппаратную структуру и поведение, которые работают параллельно, а не последовательность инструкций процессора.

  • Разные always-блоки или процессы VHDL представляют одновременно активную логику, хотя операторы внутри одного процедурного блока имеют определённую семантику.
  • Разрядность сигналов, тактовые сигналы, регистры и комбинационные пути напрямую влияют на получившуюся схему.
  • Синтезируемый HDL должен отображаться на доступное оборудование, тогда как симулятор может выполнять дополнительные конструкции только для верификации.

Зачем это спрашивают: Интервьюер хочет увидеть, что кандидат рассуждает о схемах и параллельности, а не о порядке выполнения программы.

verilog

Модуль Verilog задаёт повторно используемый аппаратный блок с интерфейсом из портов input, output и inout.

  • Порты input передают сигналы внутрь блока, а output выводят наружу значения, сформированные внутри него.
  • Разрядность порта, например logic [7:0] data, явно задаёт количество физических сигнальных битов.
  • Создание экземпляра модуля добавляет оборудование этого блока и соединяет его порты с сигналами родительского модуля.

Зачем это спрашивают: Интервьюер проверяет понимание базовой иерархии RTL и соединения блоков.

system-designsystemverilog

Комбинационную логику обычно описывают оператором assign или блоком always_comb, который присваивает каждому выходу значение на всех путях.

  • Оператор assign подходит для прямого выражения, например assign sum = a + b.
  • always_comb автоматически реагирует на сигналы, прочитанные внутри блока, и поддерживает процедурные конструкции if и case.
  • Каждая назначаемая переменная должна получать значение при любой комбинации входов, часто через значение по умолчанию, иначе возникнет защёлка.

Зачем это спрашивают: Сильный ответ показывает оба корректных способа и правило полного присваивания для комбинационной схемы.

system-designsystemverilog

Тактируемую последовательностную логику обычно описывают блоком always_ff, срабатывающим по фронту тактового сигнала.

  • always_ff @(posedge clk) моделирует триггеры, которые захватывают новые значения по нарастающему фронту.
  • Неблокирующие присваивания сохраняют одновременное обновление, ожидаемое от группы регистров.
  • Reset или clock enable размещают внутри блока, если эти сигналы входят в требуемое поведение регистра.

Зачем это спрашивают: Интервьюер проверяет, умеет ли кандидат выражать регистры с ясной синхронной семантикой.

verilog

Непрерывное присваивание постоянно управляет net-сигналом из выражения, а процедурное выполняется внутри блока always или initial.

  • assign y = a & b обновляет y при изменении любого операнда и напрямую представляет комбинационную логику.
  • Процедурные присваивания поддерживают if и case и обычно назначают переменные типа logic в SystemVerilog.
  • У сигнала обычно должен быть один понятный драйвер, поскольку несколько процедурных драйверов не являются обычным синтезируемым поведением регистра.

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

assignments

Блокирующее присваивание действует сразу внутри процедурной последовательности, а неблокирующее планирует обновление на конец текущего шага симуляции.

  • Блокирующий оператор = обычно используют для временных вычислений и выходов комбинационных блоков always_comb.
  • Неблокирующий оператор <= обычно используют для регистров в блоках always_ff, срабатывающих по фронту.
  • При q1 <= d и q2 <= q1 неблокирующие присваивания передают в q2 предыдущее значение q1, как в двух последовательных триггерах.

Зачем это спрашивают: Сильный ответ связывает семантику присваиваний с оборудованием и поведением симуляции, которое они моделируют.

rtllogic

Защёлка возникает, когда комбинационная процедурная логика не присваивает выходу значение при некоторых входных условиях и вынуждает его сохранять прежнее значение.

  • Конструкция if без else может создать защёлку, если выход назначается только в истинной ветке.
  • Значение по умолчанию перед условием закрывает пропущенные пути без повторения каждого присваивания.
  • Защёлка является чувствительным к уровню элементом памяти и обычно не нужна в синхронном RTL для FPGA.

Зачем это спрашивают: Интервьюер проверяет, узнаёт ли кандидат неполные комбинационные присваивания и их аппаратное последствие.

system-designsystemverilog

always_comb автоматически включает зависимости, прочитанные блоком, и явно обозначает комбинационное намерение разработчика.

  • Ручной список, например always @(a or b), может устареть, если выражение позже начнёт читать c.
  • Пропущенный сигнал чувствительности может привести к расхождению RTL-симуляции с синтезированной комбинационной схемой.
  • Инструменты могут применять к always_comb дополнительные проверки, включая ограничения на назначение его переменных в других местах.

Зачем это спрашивают: Интервьюер хочет увидеть, что кандидат использует языковые конструкции, предотвращающие расхождения симуляции и синтеза.

system-designsystemverilog

wire представляет net-сигнал с непрерывным источником, а logic является типом переменной для большинства RTL-сигналов с одним драйвером.

  • Выход модуля или оператор assign может управлять wire, поскольку net-сигнал отражает значение своего драйвера.
  • Блок always_comb или always_ff процедурно назначает переменную logic.
  • Объявление сигнала как logic само по себе не создаёт триггер, поскольку оборудование определяют присваивание и управляющая структура.

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

rtl

Параметры позволяют настраивать один RTL-модуль во время elaboration без копирования его реализации.

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

Зачем это спрашивают: Интервьюер проверяет, умеет ли кандидат писать повторно используемое оборудование с настройкой во время сборки.

verilog

Разрядность и знаковость определяют расширение операндов, интерпретацию арифметики и сохранённые биты результата.

  • Для сложения двух беззнаковых 8-битных значений может потребоваться 9-битный результат, чтобы сохранить перенос и значения до 510.
  • Знаковое значение использует старший бит как знак и расширяется знаковым битом, а беззнаковое обычно дополняется нулями.
  • Явные размеры и приведения не дают литералам без размера или смешанным знаковым операндам неожиданно изменить сравнение и арифметику.

Зачем это спрашивают: Интервьюер оценивает, умеет ли кандидат предотвращать незаметное усечение и ошибки знаковости.

verificationverilog

Симуляция Verilog использует 0 и 1 для известных логических уровней, X для неизвестного значения и Z для высокого импеданса.

  • X может появиться из-за неинициализированного регистра, конфликтующих драйверов или операции с неопределимым результатом.
  • Z моделирует отключённое tri-state соединение, которое в основном имеет смысл на I/O-выводах FPGA, а не внутри обычной логической ткани.
  • Анализ X помогает найти пропущенный reset или присваивание вместо маскировки проблемы принудительным нулём.

Зачем это спрашивают: Сильный ответ объясняет, как четырёхзначная симуляция выявляет реальные ошибки RTL и где применим высокий импеданс.

verilog

Побитовые операторы действуют на соответствующие биты, логические выдают значение истинности, а редукционные объединяют все биты одного вектора.

  • Для 4'b1010 и 4'b1100 побитовое & даёт 4'b1000.
  • Логический && считает каждый операнд целиком ложным или истинным и возвращает однобитный результат.
  • Редукционный &data возвращает единицу, только если все биты data равны единице, а |data обнаруживает любой установленный бит.

Зачем это спрашивают: Интервьюер проверяет, умеет ли кандидат определять ширину и смысл выражения, не путая похожие операторы.

replicationverilog

Конкатенация, репликация и выбор части вектора собирают или извлекают явно заданные группы битов.

  • {header, payload} размещает биты header выше битов payload в одном более широком векторе.
  • {4{bit_value}} повторяет одно значение четыре раза и подходит для масок или явного расширения.
  • data[7:4] выбирает четыре бита, поэтому нужно внимательно проверять направление индексов и границы.

Зачем это спрашивают: Интервьюер оценивает базовое владение векторными операциями, которые постоянно встречаются в RTL.

Обе конструкции могут описывать мультиплексирование, но цепочка if естественно задаёт приоритет, а case выбирает явные значения одного выражения.

  • В конструкции if a, затем else if b условие a побеждает, когда оба истинны, поэтому синтезируется приоритетное поведение.
  • case удобен для opcode или состояния FSM с взаимоисключающими закодированными вариантами.
  • Ветка default или присваивание перед конструкцией покрывает несовпавшие значения и предотвращает непреднамеренную память.

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

vhdl

Entity в VHDL объявляет внешний интерфейс блока, а architecture задаёт одну реализацию этого интерфейса.

  • Entity перечисляет порты с направлениями in, out и inout и типами вроде std_logic_vector.
  • Architecture содержит параллельные присваивания, процессы, экземпляры компонентов и внутренние сигналы.
  • Разделение интерфейса и реализации позволяет связать с одной entity несколько architecture.

Зачем это спрашивают: Интервьюер проверяет понимание базовой организации design unit в VHDL.

vhdl

Signal в VHDL представляет связь между параллельной логикой, а variable обновляется сразу внутри владеющего ею процесса или подпрограммы.

  • Присваивание signal через <= планирует новое значение, поэтому последующее чтение в том же процессе может ещё увидеть старое значение.
  • Присваивание variable через := действует сразу для следующих операторов текущего запуска процесса.
  • Variable удобны для промежуточных вычислений, но создание комбинационной логики или регистров всё равно определяет структура процесса.

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

concurrencyvhdl

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

  • Комбинационный процесс читает все нужные входы и назначает каждый выход на всех путях, а в VHDL-2008 доступен process(all).
  • Тактируемый процесс обычно использует rising_edge(clk) и обновляет сигналы, которые синтезируются в триггеры.
  • Параллельные процессы выполняются независимо, поэтому их порядок в исходном коде не превращает аппаратные блоки в последовательность.

Зачем это спрашивают: Интервьюер оценивает, умеет ли кандидат сопоставлять шаблоны процессов VHDL с нужными схемами.

Закрытые вопросы

  • 21

    Что такое lookup table внутри FPGA?

    fpga
  • 22

    Какую роль играют триггеры в логическом блоке FPGA?

    fpgaresources
  • 23

    Что такое выделенная carry chain в FPGA?

    fpga
  • 24

    Что такое block RAM в FPGA?

    fpga
  • 25

    Чем distributed RAM отличается от block RAM?

    distributed
  • 26

    Для каких арифметических операций предназначены DSP-блоки FPGA?

    designfpga
  • 27

    Зачем FPGA нужны выделенные тактовые ресурсы?

    fpga
  • 28

    Какие функции предоставляют I/O-блоки FPGA?

    fpga
  • 29

    Чем комбинационная логика отличается от последовательностной?

  • 30

    Что означает синхронный дизайн?

    design
  • 31

    Что такое setup time и hold time триггера?

    timingresources
  • 32

    Почему clock enable обычно предпочтительнее тактового сигнала, созданного обычной логикой?

  • 33

    Почему асинхронный вход может вызвать метастабильность?

    cdcasync
  • 34

    Чем синхронный reset отличается от асинхронного?

    async
  • 35

    Почему снятие асинхронного reset часто синхронизируют с clock?

    async
  • 36

    Каждому ли регистру в проекте FPGA нужен явный reset?

    designfpga
  • 37

    Что такое конечный автомат в RTL?

    rtlfsm
  • 38

    Чем отличаются выходы автоматов Мура и Мили?

  • 39

    Как SystemVerilog позволяет ясно представить состояния FSM?

    system-designfsmsystemverilog
  • 40

    Почему FSM должен обрабатывать недопустимые или неожиданные значения состояния?

    fsm
  • 41

    Как работает двоичный счётчик в синхронном RTL?

    rtl
  • 42

    Как работает сдвиговый регистр?

  • 43

    Как отрицательные целые числа представлены в дополнительном коде?

  • 44

    Что такое арифметическое переполнение сигнала фиксированной разрядности в RTL?

    rtl
  • 45

    Что представляет формат fixed-point?

  • 46

    Как сложение и умножение влияют на масштаб fixed-point?

    scaling
  • 47

    Чем симуляция отличается от синтеза?

    verificationsynthesis
  • 48

    Какие распространённые HDL-конструкции предназначены только для симуляции, а не для синтезируемого RTL?

    rtlhdlsynthesis
  • 49

    Для чего нужен HDL-testbench?

    verificationhdl
  • 50

    Как Verilator и cocotb применяются в верификации FPGA на junior-уровне?

    fpga
  • 51

    Как бы вы реализовали счётчик по модулю 100 с enable и однотактовым импульсом переполнения?

  • 52

    Программируемый таймер срабатывает на один такт позже; как бы вы нашли и исправили ошибку RTL?

    rtl
  • 53

    Нужно медленно и периодически обновлять состояние от быстрого системного clock; как реализовать это без создания ещё одного clock в логике?

    system-design
  • 54

    Как бы вы реализовали подавление дребезга кнопки на входе FPGA?

    debouncefpga
  • 55

    Какой testbench вы бы написали для модуля подавления дребезга кнопки?

    debounceverification
  • 56

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

  • 57

    Следующий блок не видит однотактовый импульс статуса; как сделать событие заметным в течение нескольких тактов?

  • 58

    Как бы вы реализовали 8-битный PWM-выход с программируемым значением duty?

  • 59

    Как проверить PWM-модуль, не оценивая его только глазами по waveform?

  • 60

    Как бы вы реализовали арбитр с фиксированным приоритетом для нескольких запросов?

  • 61

    Регистр статуса должен помнить короткие события ошибки до очистки программой; как бы вы его написали?

  • 62

    Как написать небольшую синхронную память, чтобы синтез мог вывести block RAM FPGA?

    fpgamemorysynthesis
  • 63

    Testbench памяти ожидает данные в такте запроса, но выведенная RAM возвращает их позже; что бы вы изменили?

    memoryverification
  • 64

    Как бы вы спроектировали базовый одноклоковый FIFO?

    designfifo
  • 65

    Кольцевой FIFO сообщает empty при совпадении указателей чтения и записи; как отличить empty от full?

    fifo
  • 66

    Как одноклоковый FIFO должен обрабатывать запросы чтения и записи в одном такте?

    fifo
  • 67

    Какой самопроверяющийся testbench вы бы написали для одноклокового FIFO?

    fifoverification
  • 68

    На какие RTL-блоки вы бы разделили базовый UART receiver?

    rtlinterfaces
  • 69

    UART RX видит спадающий фронт, который возвращается вверх до первого data bit; как он должен отреагировать?

    interfaces
  • 70

    Какой конкретный сценарий вы бы использовали для сквозной проверки UART receiver?

    interfaces
  • 71

    Системный clock не кратен точно baud rate UART; что вы проверите перед применением целочисленного делителя?

    system-designinterfaces
  • 72

    UART receiver возвращает правильные данные, но иногда отмечает неверный stop bit; как вы будете искать причину?

    interfaces
  • 73

    Как бы вы реализовали принимающую часть сдвигового регистра SPI mode 0?

    evm
  • 74

    Какой тест поймает SPI receiver, который теряет последний бит каждого слова?

    evm
  • 75

    Как бы вы реализовали однопозиционный буфер ready-valid?

  • 76

    Как проверить правильность поведения источника ready-valid при backpressure?

    backpressure
  • 77

    Комбинационный выход сохраняет прежнее значение для одного входного случая; как вы найдёте и исправите причину?

  • 78

    RTL-симуляция обновляет выход только при изменении входа a, но synthesis правильно реагирует на изменение b; какова вероятная причина?

    rtlsynthesisverification
  • 79

    Двухступенчатый pipeline пропускает новый вход через обе ступени за один такт симуляции; какую ошибку RTL вы проверите?

    rtlpipeliningownership
  • 80

    Комбинационный always-блок использует неблокирующие присваивания, и testbench видит устаревший промежуточный результат; как его исправить?

    assignmentsverification
  • 81

    Модуль не выходит из reset на плате, хотя его отдельный тест проходит; какую ошибку интеграции reset вы проверите первой?

    ownership
  • 82

    Задуманный асинхронный reset срабатывает в RTL-симуляции только на следующем такте; какую ошибку кода вы проверите?

    rtlasyncverification
  • 83

    Симуляция начинается со значений X, но плата внешне запускается с нуля; как следует обработать это различие?

    verification
  • 84

    Synthesis сообщает о нескольких драйверах регистра; как вы перестроите RTL?

    rtlsynthesis
  • 85

    Беззнаковая длина пакета стала отображаться отрицательной после изменения RTL; как найти ошибку разрядности или знаковости?

    rtl
  • 86

    Вы написали RTL-память, но synthesis использовал множество триггеров вместо block RAM; что вы проверите?

    rtlresourcesmemory
  • 87

    Timing report показывает отрицательный setup slack на пути между регистрами; что вы сделаете сначала?

    timing
  • 88

    У пути отрицательный hold slack; исправит ли его снижение частоты clock?

    timing
  • 89

    Куда смотреть в static timing report, чтобы понять один failing path?

    timing
  • 90

    Implementation сообщает о timing paths без constraints; как вы отреагируете?

    timing
  • 91

    Setup violation проходит между несвязанными clocks; нужно ли сразу объявить путь false path?

  • 92

    Длинное комбинационное вычисление не проходит setup timing; как выбрать место для регистра pipeline?

    pipeliningci-cdtiming
  • 93

    Clock после делителя проведён через обычную логику и теперь имеет большой skew; как вы измените дизайн?

  • 94

    Как ввести асинхронный однобитный уровень статуса в тактовую область?

    cdcasync
  • 95

    Однотактовый импульс из быстрой тактовой области иногда пропускается медленной; почему двухтриггерный синхронизатор не решает проблему?

    resourcescdc
  • 96

    Несколько битов асинхронной шины статуса синхронизируются отдельно и иногда образуют невозможное значение; что пошло не так?

    formsasync
  • 97

    Можно ли безопасно передать значение двоичного счётчика между тактовыми областями двухтриггерным синхронизатором?

    resourcescdc
  • 98

    Синхронизированный уровень статуса работает, но его edge detector иногда создаёт неожиданный импульс после reset; что вы проверите?

  • 99

    Вы выберете binary или one-hot encoding для небольшого управляющего FSM на FPGA?

    fpgafsm
  • 100

    FSM функционально работает в симуляции, но не проходит timing после synthesis; как оценить смену encoding?

    decision-makingtimingsynthesis