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, а тактовый блок переносит его в регистр состояния.
Такое разделение помогает глазами увидеть, какая часть схемы является комбинационной, а какая хранит состояние.
Практическая работа и проверка
- Создайте модуль с двумя входами и одним выходом.
- Опишите простую комбинационную функцию сначала через вентильные примитивы или
assign, затем черезalways @*. - Добавьте регистр, обновляемый конструкцией
always @(posedge clk). - Создайте отдельное тестовое окружение, задайте несколько входных комбинаций и посмотрите временные диаграммы.
- Выполните синтез и сопоставьте код с получившимися логическими элементами и регистрами.
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><=</code>.
- Тестовое окружение предназначено для моделирования; синтезируемая часть должна иметь аппаратный эквивалент.