Вопросы на собеседовании: FPGA-инженер
100 реальных вопросов с образцовыми ответами и пояснениями для уровня Junior.
Смотреть пример резюме: FPGA-инженер →Тренировка флешкарточками
Интервальное повторение · Hunter Pass
Вопросы
FPGA представляет собой реконфигурируемую микросхему, аппаратная структура которой программируется под конкретную цифровую схему.
- CPU выполняет последовательность инструкций на в основном фиксированном оборудовании, а FPGA может реализовать множество операций как параллельные схемы.
- ASIC имеет неизменяемую после производства схему и может быть плотнее или эффективнее, зато FPGA можно перепрограммировать.
- Проект для FPGA отображается на такие ресурсы, как LUT, триггеры, память, DSP-блоки и маршрутизация.
Зачем это спрашивают: Интервьюер проверяет, понимает ли кандидат, что именно физически проектируется внутри FPGA.
Конфигурационный bitstream программирует ресурсы FPGA и связи между ними для реализации синтезированного проекта.
- Конфигурационные биты выбирают содержимое LUT, ключи маршрутизации, режимы I/O и параметры hard-блоков.
- Файл создаётся для конкретного семейства и устройства FPGA, поэтому это не переносимый машинный код.
- Многие FPGA на SRAM загружают bitstream из внешней flash-памяти или от хоста при каждом включении питания.
Зачем это спрашивают: Сильный ответ связывает bitstream с физической конфигурацией, а не считает его обычной программной прошивкой.
HDL описывает аппаратную структуру и поведение, которые работают параллельно, а не последовательность инструкций процессора.
- Разные always-блоки или процессы VHDL представляют одновременно активную логику, хотя операторы внутри одного процедурного блока имеют определённую семантику.
- Разрядность сигналов, тактовые сигналы, регистры и комбинационные пути напрямую влияют на получившуюся схему.
- Синтезируемый HDL должен отображаться на доступное оборудование, тогда как симулятор может выполнять дополнительные конструкции только для верификации.
Зачем это спрашивают: Интервьюер хочет увидеть, что кандидат рассуждает о схемах и параллельности, а не о порядке выполнения программы.
Модуль Verilog задаёт повторно используемый аппаратный блок с интерфейсом из портов input, output и inout.
- Порты input передают сигналы внутрь блока, а output выводят наружу значения, сформированные внутри него.
- Разрядность порта, например logic [7:0] data, явно задаёт количество физических сигнальных битов.
- Создание экземпляра модуля добавляет оборудование этого блока и соединяет его порты с сигналами родительского модуля.
Зачем это спрашивают: Интервьюер проверяет понимание базовой иерархии RTL и соединения блоков.
Комбинационную логику обычно описывают оператором assign или блоком always_comb, который присваивает каждому выходу значение на всех путях.
- Оператор assign подходит для прямого выражения, например assign sum = a + b.
- always_comb автоматически реагирует на сигналы, прочитанные внутри блока, и поддерживает процедурные конструкции if и case.
- Каждая назначаемая переменная должна получать значение при любой комбинации входов, часто через значение по умолчанию, иначе возникнет защёлка.
Зачем это спрашивают: Сильный ответ показывает оба корректных способа и правило полного присваивания для комбинационной схемы.
Тактируемую последовательностную логику обычно описывают блоком always_ff, срабатывающим по фронту тактового сигнала.
- always_ff @(posedge clk) моделирует триггеры, которые захватывают новые значения по нарастающему фронту.
- Неблокирующие присваивания сохраняют одновременное обновление, ожидаемое от группы регистров.
- Reset или clock enable размещают внутри блока, если эти сигналы входят в требуемое поведение регистра.
Зачем это спрашивают: Интервьюер проверяет, умеет ли кандидат выражать регистры с ясной синхронной семантикой.
Непрерывное присваивание постоянно управляет net-сигналом из выражения, а процедурное выполняется внутри блока always или initial.
- assign y = a & b обновляет y при изменении любого операнда и напрямую представляет комбинационную логику.
- Процедурные присваивания поддерживают if и case и обычно назначают переменные типа logic в SystemVerilog.
- У сигнала обычно должен быть один понятный драйвер, поскольку несколько процедурных драйверов не являются обычным синтезируемым поведением регистра.
Зачем это спрашивают: Интервьюер оценивает, умеет ли кандидат выбирать правильный контекст присваивания и избегать конфликтующих драйверов.
Блокирующее присваивание действует сразу внутри процедурной последовательности, а неблокирующее планирует обновление на конец текущего шага симуляции.
- Блокирующий оператор = обычно используют для временных вычислений и выходов комбинационных блоков always_comb.
- Неблокирующий оператор <= обычно используют для регистров в блоках always_ff, срабатывающих по фронту.
- При q1 <= d и q2 <= q1 неблокирующие присваивания передают в q2 предыдущее значение q1, как в двух последовательных триггерах.
Зачем это спрашивают: Сильный ответ связывает семантику присваиваний с оборудованием и поведением симуляции, которое они моделируют.
Защёлка возникает, когда комбинационная процедурная логика не присваивает выходу значение при некоторых входных условиях и вынуждает его сохранять прежнее значение.
- Конструкция if без else может создать защёлку, если выход назначается только в истинной ветке.
- Значение по умолчанию перед условием закрывает пропущенные пути без повторения каждого присваивания.
- Защёлка является чувствительным к уровню элементом памяти и обычно не нужна в синхронном RTL для FPGA.
Зачем это спрашивают: Интервьюер проверяет, узнаёт ли кандидат неполные комбинационные присваивания и их аппаратное последствие.
always_comb автоматически включает зависимости, прочитанные блоком, и явно обозначает комбинационное намерение разработчика.
- Ручной список, например always @(a or b), может устареть, если выражение позже начнёт читать c.
- Пропущенный сигнал чувствительности может привести к расхождению RTL-симуляции с синтезированной комбинационной схемой.
- Инструменты могут применять к always_comb дополнительные проверки, включая ограничения на назначение его переменных в других местах.
Зачем это спрашивают: Интервьюер хочет увидеть, что кандидат использует языковые конструкции, предотвращающие расхождения симуляции и синтеза.
wire представляет net-сигнал с непрерывным источником, а logic является типом переменной для большинства RTL-сигналов с одним драйвером.
- Выход модуля или оператор assign может управлять wire, поскольку net-сигнал отражает значение своего драйвера.
- Блок always_comb или always_ff процедурно назначает переменную logic.
- Объявление сигнала как logic само по себе не создаёт триггер, поскольку оборудование определяют присваивание и управляющая структура.
Зачем это спрашивают: Сильный ответ отделяет объявление типа данных от логики, которую выводит инструмент.
Параметры позволяют настраивать один RTL-модуль во время elaboration без копирования его реализации.
- Параметр WIDTH может согласованно задавать разрядность портов, размеры регистров и границы циклов.
- Каждый экземпляр модуля может переопределить постоянное значение параметра по умолчанию.
- Параметры описывают статический выбор оборудования и не ведут себя как доступные для записи регистры во время работы.
Зачем это спрашивают: Интервьюер проверяет, умеет ли кандидат писать повторно используемое оборудование с настройкой во время сборки.
Разрядность и знаковость определяют расширение операндов, интерпретацию арифметики и сохранённые биты результата.
- Для сложения двух беззнаковых 8-битных значений может потребоваться 9-битный результат, чтобы сохранить перенос и значения до 510.
- Знаковое значение использует старший бит как знак и расширяется знаковым битом, а беззнаковое обычно дополняется нулями.
- Явные размеры и приведения не дают литералам без размера или смешанным знаковым операндам неожиданно изменить сравнение и арифметику.
Зачем это спрашивают: Интервьюер оценивает, умеет ли кандидат предотвращать незаметное усечение и ошибки знаковости.
Симуляция Verilog использует 0 и 1 для известных логических уровней, X для неизвестного значения и Z для высокого импеданса.
- X может появиться из-за неинициализированного регистра, конфликтующих драйверов или операции с неопределимым результатом.
- Z моделирует отключённое tri-state соединение, которое в основном имеет смысл на I/O-выводах FPGA, а не внутри обычной логической ткани.
- Анализ X помогает найти пропущенный reset или присваивание вместо маскировки проблемы принудительным нулём.
Зачем это спрашивают: Сильный ответ объясняет, как четырёхзначная симуляция выявляет реальные ошибки RTL и где применим высокий импеданс.
Побитовые операторы действуют на соответствующие биты, логические выдают значение истинности, а редукционные объединяют все биты одного вектора.
- Для 4'b1010 и 4'b1100 побитовое & даёт 4'b1000.
- Логический && считает каждый операнд целиком ложным или истинным и возвращает однобитный результат.
- Редукционный &data возвращает единицу, только если все биты data равны единице, а |data обнаруживает любой установленный бит.
Зачем это спрашивают: Интервьюер проверяет, умеет ли кандидат определять ширину и смысл выражения, не путая похожие операторы.
Конкатенация, репликация и выбор части вектора собирают или извлекают явно заданные группы битов.
- {header, payload} размещает биты header выше битов payload в одном более широком векторе.
- {4{bit_value}} повторяет одно значение четыре раза и подходит для масок или явного расширения.
- data[7:4] выбирает четыре бита, поэтому нужно внимательно проверять направление индексов и границы.
Зачем это спрашивают: Интервьюер оценивает базовое владение векторными операциями, которые постоянно встречаются в RTL.
Обе конструкции могут описывать мультиплексирование, но цепочка if естественно задаёт приоритет, а case выбирает явные значения одного выражения.
- В конструкции if a, затем else if b условие a побеждает, когда оба истинны, поэтому синтезируется приоритетное поведение.
- case удобен для opcode или состояния FSM с взаимоисключающими закодированными вариантами.
- Ветка default или присваивание перед конструкцией покрывает несовпавшие значения и предотвращает непреднамеренную память.
Зачем это спрашивают: Сильный ответ связывает управляющий синтаксис со схемой выбора и требованием полноты.
Entity в VHDL объявляет внешний интерфейс блока, а architecture задаёт одну реализацию этого интерфейса.
- Entity перечисляет порты с направлениями in, out и inout и типами вроде std_logic_vector.
- Architecture содержит параллельные присваивания, процессы, экземпляры компонентов и внутренние сигналы.
- Разделение интерфейса и реализации позволяет связать с одной entity несколько architecture.
Зачем это спрашивают: Интервьюер проверяет понимание базовой организации design unit в VHDL.
Signal в VHDL представляет связь между параллельной логикой, а variable обновляется сразу внутри владеющего ею процесса или подпрограммы.
- Присваивание signal через <= планирует новое значение, поэтому последующее чтение в том же процессе может ещё увидеть старое значение.
- Присваивание variable через := действует сразу для следующих операторов текущего запуска процесса.
- Variable удобны для промежуточных вычислений, но создание комбинационной логики или регистров всё равно определяет структура процесса.
Зачем это спрашивают: Сильный ответ объясняет семантику обновления, а не утверждает, что одна форма всегда означает оборудование, а другая нет.
Процесс 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