Разработчик Оскар Грималь представил Pulse — новый симулятор VHDL с открытым исходным кодом. Проект написан на C++ и распространяется под лицензией MIT. Важная деталь: это не очередная модификация GHDL, а самостоятельная разработка. Pulse пока далёк от завершения, но уже охватывает весь цикл работы — от компилятора до вывода временных диаграмм.

Схема архитектуры симулятора Pulse: исходные VHDL-файлы проходят через парсер и движок симуляции и выводятся в терминальный интерфейс

Что такое VHDL и зачем нужен симулятор

VHDL — один из двух основных языков описания аппаратуры наряду с Verilog. Он появился в 1980-х годах по заказу Министерства обороны США и стандартизирован как IEEE 1076. На VHDL описывают цифровые схемы для ПЛИС (FPGA) и специализированных микросхем. Прежде чем проект отправится на синтез, его проверяют в симуляторе: тот показывает, как меняются сигналы схемы во времени, и помогает найти ошибки ещё до прошивки кристалла.

реклама кормит Уточку 🦆

Многие разработчики считают VHDL более детерминированным и надёжным, чем Verilog. Язык строго типизирован, а благодаря модели сигналов и дельта-циклов результат симуляции не зависит от порядка выполнения процессов — в Verilog же при неаккуратном использовании блокирующих присваиваний возможны гонки. Обратная сторона строгости — многословность и объёмность языка, особенно с учётом сопутствующих стандартных библиотек.

Как устроен Pulse

Pulse преобразует исходный код VHDL в модель из логических компонентов, которую можно симулировать и отлаживать. Сначала код проходит через конвейер разбора: лексический анализатор, построитель синтаксического дерева (AST), семантический анализатор с проверкой типов и компоновщик. Затем генератор «чертежей» строит граф схемы, а движок симуляции моделирует распространение сигналов по этому графу.

Движок построен по принципу потока данных (dataflow) и, по описанию автора, поддерживает многозначную логику стандарта IEEE 1164 и асинхронные процессы. Стандарт IEEE 1164 определяет тип std_logic с девятью состояниями: помимо привычных 0 и 1 это, например, неинициализированное значение U, неопределённое X и высокоимпедансное Z.

реклама кормит Уточку 🦆

Временные диаграммы прямо в терминале

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

Для сравнения: GHDL собственного средства просмотра не имеет — он записывает результаты в файлы форматов VCD, FST или GHW, которые затем открывают во внешней программе, чаще всего в GTKWave.

Требования к сборке минимальны: нужны только компилятор с поддержкой C++20 и CMake версии 3.14 или новее. Симулятор запускается из командной строки: ему передают папку проекта, а параметрами можно задать верхнюю сущность (entity), время окончания симуляции (по умолчанию — 1000 фемтосекунд) и архитектуру.

реклама кормит Уточку 🦆

Что уже поддерживается

VHDL — язык объёмный, поэтому набор поддерживаемых возможностей пока ограничен базовыми пакетами и типами IEEE. На текущем этапе Pulse умеет работать со следующими конструкциями:

  • типы std_logic и std_logic_vector с диапазонами to и downto;
  • архитектуры, объявления сигналов и портов;
  • процессы со списками чувствительности и операторы wait;
  • условные конструкции if/elsif/else;
  • создание экземпляров компонентов с сопоставлением портов по именам;
  • преобразования signed() и unsigned();
  • логические, арифметические и сдвиговые операторы, операторы сравнения и конкатенацию.

При этом значения по умолчанию пока не поддерживаются, как и дженерики (generics), циклы и операторы case — последние два автор обещает добавить в будущем.

реклама кормит Уточку 🦆

Планы развития

Согласно дорожной карте в описании проекта на GitHub, в Pulse появятся дженерики, дополнительные типы и более сложная логика, будет ускорен движок симуляции для крупных проектов и доработан терминальный интерфейс. Среди планов также опциональный веб-интерфейс и поддержка Verilog, в том числе смешанных проектов на VHDL и Verilog. SystemVerilog, как это часто бывает с открытыми инструментами, в дорожной карте не упоминается.

Главный ориентир для нового проекта — GHDL, самый известный открытый симулятор VHDL. Он компилирует код в машинный с помощью бэкендов mcode, GCC или LLVM и поддерживает стандарты VHDL-87, VHDL-93, VHDL-2002 и большую часть VHDL-2008. Сравнить Pulse с GHDL будет особенно интересно, когда новый симулятор обрастёт недостающими возможностями языка.