Язык для описания схем
Большинство языков, с которыми ты сталкивался - Python, JavaScript, Go - описывают последовательность инструкций, чтобы CPU их выполнил. Verilog описывает схему. Ты прописываешь, какие wires существуют, какие регистры существуют и как сигналы между ними распространяются. Симулятор затем может проиграть поведение схемы, а инструмент синтеза может скомпилировать тот же самый текст в вентили и flip-flop реального чипа.
Это определение в одну строку. На осознание следствий уходит больше времени.
Этот фрагмент выглядит как крошечная программа: module, блок initial, системная задача $display. Нажми Run - увидишь hello from verilog. Но под капотом симулятор не исполняет функцию - он делает вид, что время идёт, и продвигает схему вперёд. Поэтому ты будешь видеть $finish повсюду: кто-то должен сказать симулятору остановиться.
Что на самом деле значит "описание аппаратуры"
Строка C выполняется, когда счётчик команд до неё доходит. Строка Verilog описывает кусочек схемы, который существует всегда. Посмотри:
assign y = a & b;
Это не "вычисли y один раз". Это "существует wire y, и в каждый момент времени он равен a AND b". Меняешь a или b - y сразу следует за ними. Несколько assign в одном модуле - это не последовательность, это параллельные описания разных частей схемы.
Это ключевая особенность Verilog и источник любого бага новичка. Большая часть того, что ты пишешь, описывает вещи, происходящие параллельно, и те немногие конструкции, которые выглядят как упорядоченные операторы (внутри блоков initial и always), выглядят так только потому, что симулятор делает вид.
Что собирают на Verilog
Verilog используют на всех уровнях цифрового стека:
- Комбинационная логика. Сумматоры, мультиплексоры, дешифраторы, кусочки ALU - всё, где выход зависит только от текущих входов.
- Последовательностная логика. Счётчики, сдвиговые регистры, конечные автоматы, всё, что тактируется по
posedge clk. - Процессорные ядра. От учебных CPU из университетских курсов до open-source ядер RISC-V, которые поставляются на реальном кремнии - RTL обычно пишут на Verilog или SystemVerilog.
- Проекты для FPGA. Логика, которая загружается в FPGA от Xilinx или Intel - сетевые задачи, обработка изображений, встраиваемое управление - пишется в подавляющем большинстве на Verilog.
- ASIC. Кастомные чипы внутри твоего телефона, роутера, машины - фронтенд-проект на HDL, и Verilog - один из двух доминирующих вариантов.
Чтобы учиться, никакое железо не нужно. Всё в этих документах работает в симуляторе прямо в браузере.
Симуляция vs синтез
Есть два способа "запустить" Verilog, и они не одно и то же:
- Симуляция проигрывает поведение схемы в программе. Симулятор (Icarus Verilog, Verilator, ModelSim, коммерческие инструменты) читает твои модули плюс testbench - код, который подаёт входы - и выдаёт результаты: текстовые логи, формы сигналов (waveforms), отчёты pass/fail.
- Синтез берёт подмножество Verilog и компилирует его в netlist из реальных вентилей. Вендорский инструмент (Vivado, Quartus, design-compiler в крупных компаниях) делает это отображение. Синтезируемый Verilog должен подчиняться дополнительным правилам - блоков
initialи вызовов$displayв кремнии не существует.
Редактор в браузере на этих страницах делает симуляцию. Этого достаточно, пока ты не отправляешь реальный чип в производство и не программируешь FPGA.
Verilog vs SystemVerilog
Если начнёшь искать, увидишь оба названия. SystemVerilog - это надмножество: он сохраняет каждую конструкцию Verilog и добавляет фичи, в основном для верификации (классы, constrained-random тестирование, assertions, интерфейсы, гораздо более богатую систему типов). Всё, что ты учишь здесь, - это валидный SystemVerilog. Эти два названия в практике сливаются; большинство инструментов принимает оба, и большинство файлов всё равно заканчивается на .v. Мы будем говорить "Verilog" во всех этих документах.
Verilog vs VHDL
Оба - языки описания аппаратуры. Оба - стандарты IEEE. Оба существуют с 80-х. Различия:
- Синтаксис. Verilog происходит от C - фигурные скобки, лаконичные ключевые слова, более свободные правила типов. VHDL происходит от Ada - более многословный, гораздо строже к типам.
- География. Verilog доминирует в коммерческом проектировании в США. VHDL по-прежнему распространён в Европе, в оборонке и в более старых кодовых базах.
- Возможности. Они примерно эквивалентны по выразительности. Выбирай по тому, что использует твоя команда.
Если ты учишь HDL впервые, у Verilog более мягкий вход - меньше синтаксиса, более снисходительный, и стандартная "библиотека" примеров онлайн больше.
Как эти документы запускают Verilog
Редактор ниже использует Icarus Verilog (iverilog) под капотом. Он компилирует твой исходник в симулятор и запускает его в песочнице. Никакой лицензии Vivado, никакой установки Quartus, никакой платы FPGA не требуется. Ты пишешь module плюс маленький testbench, нажимаешь Run и видишь вывод и waveform.
Это законченный 4-битный счётчик плюс testbench. Модуль counter - это design under test (DUT); модуль test дёргает clock, отпускает reset и печатает значение каждый такт. Запусти - увидишь, как count идёт от 0 до 15 и заворачивает обратно. Открой вкладку Waveform - увидишь то же самое в виде переходов напряжения.
Что дальше
Контекста хватает, чтобы начать писать модули. Следующий документ - Hardware vs Software - чуть подробнее разбирает смену ментальной модели, потому что это самая большая зацепка для новых программистов на Verilog. После этого - установка локального симулятора (опционально - в браузере и так работает), написание первого module с нуля и остальной язык.
Не спеши. Синтаксис маленький; работа в основном с ментальной моделью.
Часто задаваемые вопросы
Что такое Verilog простыми словами?
Verilog - это язык описания аппаратуры (HDL), который используют, чтобы описывать цифровые схемы в виде текста. Вместо того чтобы писать инструкции, которые исполняет CPU, ты описываешь wires, регистры, логические вентили и то, как сигналы между ними распространяются. Симулятор затем прогоняет это описание, чтобы ты мог проверить поведение, а инструмент синтеза может превратить то же самое описание в реальную топологию чипа.
Для чего используют Verilog?
Verilog используют, чтобы проектировать и верифицировать цифровое железо: CPU, GPU, сетевые коммутаторы, контроллеры памяти, блоки обработки сигналов, проекты для FPGA - всё, что собирается из вентилей и flip-flop. Он также работает в чистой симуляции - для обучения цифровой логике и прототипирования до того, как изготовят кремний.
Verilog - это язык программирования?
Не в привычном смысле. Код на Verilog описывает структуру и поведение железа - сигналы, вентили, хранение, тактируемое от clock - а не последовательность инструкций для CPU. Многие строки, которые ты пишешь, на чипе выполняются параллельно, а не одна за другой. Перестроить голову под это - самое сложное при переходе от софта к Verilog.
В чём разница между Verilog и SystemVerilog?
SystemVerilog - это надмножество Verilog. Он сохраняет весь синтаксис Verilog и добавляет фичи в основном для верификации: классы, рандомные стимулы с ограничениями, assertions, интерфейсы и более богатые типы данных. Инструменты, которые принимают SystemVerilog, принимают и обычный Verilog. Для большинства начального материала эти два языка выглядят идентично.
В чём разница между Verilog и VHDL?
Verilog и VHDL - оба языки описания аппаратуры, которые решают одну и ту же задачу. Синтаксис Verilog происходит от C и более лаконичный; синтаксис VHDL - от Ada, более многословный и строже относится к типам. Использование в индустрии зависит от региона и команды - оба живы, оба стандартизированы (IEEE 1364/1800 для Verilog/SystemVerilog, IEEE 1076 для VHDL).
Verilog сложно учить?
Синтаксис маленький - меньше, чем у C++. Сложная часть - отучиться от софтовых привычек. В Verilog большинство выражений описывают вещи, которые происходят одновременно, а не последовательно, и неправильно поставленный blocking вместо non-blocking может изменить, заработает ли твоя схема вообще. Будь готов, что первая неделя покажется дезориентирующей, прежде чем всё уложится.