HDL и поток проектирования: от Verilog до битстрима

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

HDL (Hardware Description Language, язык описания аппаратуры) — язык, на котором вы описываете цифровую схему: какие в ней элементы и как они соединены, а не последовательность команд для выполнения.

Главная мысль, ради которой стоит держать в голове весь курс: Verilog — это язык описания аппаратуры, а не программирования. Когда вы пишете на Python x = a + b, процессор выполнит сложение в тот момент, когда дойдёт до этой строки. Когда вы пишете на Verilog assign x = a + b;, вы не «выполняете» сложение — вы говорите синтезатору: «построй в железе сумматор, у которого входы a и b, а выход x». Этот сумматор будет существовать физически и работать постоянно, складывая входы в реальном времени.

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

Что такое Verilog

Verilog появился в 1980-х как язык для моделирования и описания цифровых схем. Сегодня это один из двух главных HDL (второй — VHDL). На нём описывают всё: от простого мультиплексора до целого процессора. Параллельный фрагмент-визитка — пока просто чтобы увидеть синтаксис, разберём его позже:

module xor_gate(
    input  wire a,   // вход a
    input  wire b,   // вход b
    output wire y    // выход y
);
    assign y = a ^ b;   // описываем вентиль XOR: y всегда равен a XOR b
endmodule

Здесь нет «запуска». Есть описание: модуль xor_gate с двумя входами и одним выходом, внутри которого живёт вентиль XOR. После синтеза это станет настоящим элементом схемы.

Поток проектирования: от текста до железа

Чтобы Verilog превратился в работающую FPGA, текст проходит несколько этапов. Это и есть поток проектирования (design flow):

  [Verilog-код]
        |
        v
  1. СИНТЕЗ            -- перевод описания в схему из LUT и триггеров
        |
        v
  2. РАЗМЕЩЕНИЕ        -- куда положить каждый LUT/триггер на кристалле
     и ТРАССИРОВКА        и как проложить провода в матрице соединений
        |
        v
  3. ГЕНЕРАЦИЯ         -- упаковка конфигурации в файл-битстрим
     БИТСТРИМА
        |
        v
  4. ПРОШИВКА          -- загрузка битстрима в FPGA по кабелю (JTAG)
        |
        v
  [работающая схема в железе]
  1. Синтез. Инструмент читает Verilog и превращает описание в сеть из конкретных LUT, триггеров и DSP-блоков — как компилятор превращает C в инструкции, только здесь «инструкции» — это элементы схемы.
  2. Размещение и трассировка (place & route). Каждому элементу назначается физическое место на кристалле, а между ними прокладываются провода через матрицу соединений. От качества этого этапа зависит, на какой частоте схема сможет работать.
  3. Генерация битстрима. Итоговая конфигурация всех LUT и ключей упаковывается в двоичный файл.
  4. Прошивка. Битстрим загружается в FPGA (обычно по интерфейсу JTAG) — и схема оживает.

Как работает под капотом: симуляция до железа

Между написанием кода и прошивкой стоит важнейший этап — симуляция. Прежде чем тратить минуты на синтез и трассировку, разработчик прогоняет описание в симуляторе (тестбенч), который имитирует поведение схемы во времени и показывает сигналы. Это быстро и позволяет ловить логические ошибки до железа. Симуляции и тестбенчам посвящён отдельный раздел курса — но запомните уже сейчас: «сначала симулируй, потом прошивай».

Частые ошибки

  • Читать Verilog как программу сверху вниз. Строки описывают параллельное железо, а не шаги. Это источник большинства ошибок новичков.
  • Думать, что синтез — это компиляция в инструкции. Синтез строит схему из LUT и триггеров, а не последовательность команд.
  • Прошивать без симуляции. Найти ошибку в симуляторе — секунды; в железе — часы отладки осциллографом.

Итог

  • Verilog описывает схему (что соединено), а не алгоритм (что выполнять).
  • Все конструкции описывают параллельно работающее железо; порядок строк не задаёт время.
  • Поток: синтез → размещение и трассировка → битстрим → прошивка.
  • Симуляция стоит перед железом и экономит часы отладки.
Проверьте себя
1. Что описывает программа на Verilog?
AПоследовательность инструкций для процессора
BЦифровую схему: какие в ней элементы и как они соединены
CАлгоритм, выполняемый шаг за шагом
DРасположение файлов на диске
2. Почему порядок строк в Verilog-модуле обычно не задаёт порядок выполнения?
AVerilog выполняет строки в случайном порядке
BСтроки описывают элементы схемы, существующие и работающие одновременно (параллельно)
CКомпилятор сортирует строки по алфавиту
DПорядок строк всегда строго важен, как в Python
3. Какой этап потока проектирования назначает элементам физические места на кристалле и прокладывает провода?
AСинтез
BРазмещение и трассировка (place & route)
CГенерация битстрима
DПрошивка