Verilog для начинающих: первый модуль за 15 минут

Verilog — язык, на котором инженеры описывают цифровые схемы: от простого вентиля до целого процессора. Если вы собрали схемы в визуальном симуляторе, Verilog станет следующим шагом — вы научитесь описывать те же схемы текстом. И никакой установки не нужно: всё работает в браузере на уровне 30 симулятора «Компьютер Ершова».

Первый модуль Verilog в RTL-вьюере: вентиль И и соединение проводов
Первый модуль Verilog: RTL-схема

Чем Verilog отличается от обычного языка программирования

Программа на Python или C++ выполняется процессором последовательно, команда за командой. Verilog-модуль описывает схему, в которой все элементы работают одновременно. Поэтому в Verilog нет привычных циклов и «переменных» в смысле языка программирования — вместо этого провода и логические элементы.

Самое важное отличие: написанный на Verilog модуль можно синтезировать в настоящий чип или прошить в FPGA. Код превращается в железо. Почему Verilog — это не программирование, объясняет статья «Кремний вместо кода».

Первый модуль: провод

Модуль — это «кирпичик» схемы со входами и выходами. Самый простой модуль просто соединяет вход с выходом — это провод:

module wire_gate(
    input  a,
    output y
);
    assign y = a;
endmodule

Разберём по строкам: module wire_gate(...) объявляет модуль с именем wire_gate; input a — входной сигнал; output y — выходной; assign y = a — выход всегда равен входу; endmodule закрывает модуль.

Именно это — первый уровень Verilog-части курса: уровень 30 «Hello, Wire!». В редакторе справа уже открыт заготовленный модуль — осталось понять, что и как исправить, и нажать Play.

Вентиль NOT за 30 секунд

Инверсия сигнала описывается одной строкой:

module not_gate(
    input  a,
    output y
);
    assign y = ~a;
endmodule

Символ ~ — это отрицание. Если на входе 0, на выходе 1, и наоборот.

Мультиплексор: когда сигналов несколько

Мультиплексор выбирает один из входов по сигналу sel. На Verilog его можно описать через тернарный оператор:

module mux2(
    input      a, b,
    input      sel,
    output reg y
);
    always @(*) begin
        if (sel) y = b;
        else     y = a;
    end
endmodule

Блок always @(*) означает «пересчитывать при любом изменении входов», а if (sel) ... else ... выбирает, какой вход передать на выход. Именно так работает уровень 31 «Управление потоком». Подробнее о мультиплексоре без if/else — в статье «Как железо принимает решения».

Сумматор: учим кремний складывать

Арифметика в Verilog выглядит удивительно просто — символом «+»:

module adder8(
    input  [7:0] a, b,
    output [8:0] sum
);
    assign sum = a + b;
endmodule

Обозначение [7:0] говорит, что сигнал — это шина из 8 бит, а [8:0] — 9 бит (с учётом переноса). Строка assign sum = a + b синтезируется в настоящую цепочку сумматоров — именно так схема «учится» считать. За этим скрывается целая механика — см. статью «Учим кремний математике».

Иерархия: модули внутри модулей

Большие схемы собираются из маленьких. Модуль сумматора можно использовать внутри другого модуля — это называется иерархией:

module full_adder_8(
    input  [7:0] a, b,
    input        cin,
    output [7:0] sum,
    output       cout
);
    wire [8:0] t;
    adder8 u_adder(.a(a), .b(b), .sum(t));
    assign sum  = t[7:0];
    assign cout = t[8];
endmodule

Строка adder8 u_adder(...) создаёт экземпляр модуля adder8 и соединяет его порты. Из таких «матрёшек» строится процессор. Об иерархии — статья «Иерархия: как не утонуть в проводах».

Шины и память

Реальные схемы работают с байтами, а не одиночными битами. Шины [7:0] переносят 8 бит сразу — и это уже следующий шаг после одиночных проводов: уровень 34 «Переход к шинам данных». А встроенные модули RAM256 и ROM позволяют добавить процессору память: уровень 39 «Оперативная память». Всё о шинах — в статье «Шины данных: от отдельных битов к байтам».

Как тренироваться бесплатно

В симуляторе «Компьютер Ершова» Verilog-часть начинается с уровня 30 и занимает 14 уровней (30–43). Встроенный редактор подсвечивает синтаксис, парсер находит ошибки, а симулятор прогоняет схему по тестовым векторам. RTL Viewer показывает, как ваш код превращается в схему, а временные диаграммы — как меняются сигналы по тактам.

После 43-го уровня начинается самое интересное: на уровнях 44–47 вы спроектируете собственный процессор на Verilog, а на финальном уровне экспортируете проект в ZIP и прошьёте его в реальную FPGA-плату Tang Nano 9K. Всё о пути «от кода к кремнию» собрано в хабе Verilog и FPGA.

FAQ

Нужно ли знать программирование для Verilog?

Полезно, но не обязательно. Главное — понимать логику схем: вентили, шины, тактовые сигналы. Именно это даёт визуальная часть курса (уровни 1–29).

Что нужно установить?

Ничего. Уровни 30–47 работают прямо в браузере: редактор, симулятор и RTL Viewer встроены в страницу.

Можно ли прошить проект на реальную плату?

Да. На финальном уровне проект экспортируется в ZIP-архив, который открывается в среде Gowin для платы Tang Nano 9K. Это дешёвая и доступная FPGA-плата для обучения.

Написать первый модуль бесплатно →