Курс 10 • Урок 6 из 8 • 3 часа учебной нагрузки

Verilog и RTL-представление схемы

Цель: Понять Verilog HDL как язык описания аппаратуры: модуль, порты, wire/reg, комбинационную и последовательностную логику, процедурные блоки always и различие между синтезируемым описанием и тестовым окружением.

3 часа короткая теория, самостоятельная практика, проверка результата и тест.

Суть темы

Verilog HDL описывает цифровую схему, а не последовательность действий обычной программы. В пособии ИТМО модуль назван базовой единицей описания: вся логика и структура находятся между module и endmodule, а связи с внешним миром задаются портами input и output.

При структурном описании порядок записанных вентилей не задаёт порядок их выполнения: они представляют одновременно существующие аппаратные связи. Это главный переход от программного мышления к схемотехническому.

  • wire используют для соединений и комбинационной логики.
  • reg в Verilog может участвовать как в комбинационном, так и в последовательностном процедурном описании; само слово reg ещё не гарантирует наличие физического регистра.
  • always @* применяют для комбинационного процедурного блока.
  • always @(posedge clk) применяют для логики, изменяющей состояние по фронту тактового сигнала.
  • Синтезируемые конструкции должны иметь аппаратный эквивалент; тестовое окружение служит для моделирования и не обязано синтезироваться.

Ключевые связи и параметры

Комбинационная логика должна однозначно задавать выход для всех рассматриваемых сочетаний входов. Если в процедурном комбинационном блоке часть ветвей оставляет выход без нового значения, синтезатору может понадобиться элемент памяти. Поэтому перед написанием кода полезно сначала составить таблицу истинности или определить все ветви if/case.

Последовательностная часть хранит состояние. В примерах конечных автоматов из пособия ИТМО текущее состояние хранится в переменной state, следующее состояние вычисляется в always @*, а обновление выполняется в always @(posedge clk). Для присваивания регистров в тактовом блоке используется оператор <=.

Отдельно различают описание самого устройства и тестовое окружение. Тестовое окружение задаёт входные воздействия во времени и наблюдает выходы. Успешное моделирование подтверждает логику модели, но затем проект всё равно должен пройти синтез и реализацию на выбранном устройстве.

Разбор примера

Простейший комбинационный выбор можно описать так: always @* begin if (sel) y = b; else y = a; end. Здесь выход y задаётся в обеих ветвях, поэтому память не нужна.

Регистр состояния по фронту тактового сигнала: always @(posedge clk) begin if (rst) state <= S0; else state <= state_next; end. Комбинационный блок вычисляет state_next, а тактовый блок переносит его в регистр состояния.

Такое разделение помогает глазами увидеть, какая часть схемы является комбинационной, а какая хранит состояние.

Практическая работа и проверка

  1. Создайте модуль с двумя входами и одним выходом.
  2. Опишите простую комбинационную функцию сначала через вентильные примитивы или assign, затем через always @*.
  3. Добавьте регистр, обновляемый конструкцией always @(posedge clk).
  4. Создайте отдельное тестовое окружение, задайте несколько входных комбинаций и посмотрите временные диаграммы.
  5. Выполните синтез и сопоставьте код с получившимися логическими элементами и регистрами.
В этом уроке используется синтаксис Verilog HDL из предоставленного пособия: always @* и always @(posedge clk). Конструкции always_comb и always_ff относятся к SystemVerilog и здесь не используются.

Типичные ошибки и диагностика

  • Считать строки Verilog последовательными командами процессора.
  • Забывать задать выход во всех ветвях комбинационного блока и получать нежелательную память.
  • Путать wire и reg с физическими «проводом» и «регистром» без учёта контекста описания.
  • Помещать моделирующие задержки и другие конструкции тестового окружения в синтезируемую часть проекта.

При расхождении ожидаемой и полученной схемы сначала смотрят предупреждения синтезатора, затем проверяют полноту комбинационных ветвей, тактовый сигнал и сброс.

Связь с реальным устройством

После синтеза Verilog-описание превращается в аппаратную структуру. Поэтому хороший RTL-код должен быть понятен не только как текст, но и как предполагаемая схема из комбинационных элементов, регистров и связей между ними.

Что нужно запомнить

  • Модуль — базовая единица описания Verilog HDL.
  • Verilog описывает параллельно работающую аппаратуру, а не обычную последовательную программу.
  • Для комбинационного процедурного описания в пособии используется <code>always @*</code>.
  • Для регистра по фронту тактового сигнала используется <code>always @(posedge clk)</code> и неблокирующее присваивание <code>&lt;=</code>.
  • Тестовое окружение предназначено для моделирования; синтезируемая часть должна иметь аппаратный эквивалент.
Проверка знаний

Вопросы по уроку

Нужно 75%
Загрузка вопросов…