Menu
CoddyTech

Блок Initial

Часть раздела Основы путешествия по Verilog на Coddy. Урок 47 из 90.

В Verilog есть два процедурных блока: initial (выполняется один раз) и always (выполняется непрерывно). Теперь рассмотрим блок initial.

Что такое блок Initial?

Блок initial выполняется только один раз в начале симуляции (в момент времени 0). После завершения он больше не выполняется.

В основном используется в тестовых стендах для:

  • Задания начальных значений
  • Генерации тестовых сигналов
  • Отображения сообщений
  • Запуска симуляции

Синтаксис

initial begin
  // Операторы выполняются один раз, последовательно
end

Базовый пример

initial begin
  $display("Simulation started");
  $display("This runs once");
  $finish;
end

Вывод:

Simulation started
This runs once

Использование блока initial для тестовых сигналов

initial begin
  a = 0;
  #10 a = 1;
  #10 a = 0;
  #10 $finish;
end

Значение a изменяется в моменты времени: 0, 10 и 20.

Начальный блок и всегда выполняющийся блок

 initialalways
ВыполнениеОдин разНепрерывно (бесконечно)
ИспользованиеТестовые стенды, инициализацияАппаратное обеспечение (триггеры, счётчики)
Поддаётся синтезу?Только для начальных значений (FPGA)Да (со списком чувствительности)

Важные замечания

  • Блоки initial предназначены в основном для моделирования. Инструменты синтеза не могут преобразовать задержки, такие как #10, или задачи, такие как $display, в аппаратные средства
  • Используй initial главным образом в тестовых стендах. В модуле проекта его используют только инструменты синтеза FPGA и только для задания начального значения регистра или памяти
  • Если тестовый стенд содержит свободно работающий тактовый сигнал (например, always #5 clk = ~clk;), моделирование будет выполняться бесконечно, если не вызвать $finish; если есть только блок initial, симулятор остановится самостоятельно, когда не останется событий, но добавить $finish всё равно считается хорошей практикой
challenge icon

Задание

Добавь отсутствующий блок initial, который устанавливает a в 0, а затем через 10 единиц времени устанавливает a в 1.

Что нужно сделать:

  1. Добавь initial begin и end
  2. Установи a = 0
  3. Подожди #10
  4. Установи a = 1
  5. Добавь $finish, чтобы завершить симуляцию

Попробуйте сами

module test;
  reg a;
  
  // TODO: Добавьте здесь блок initial
  // Установите a = 0
  // Подождите #10
  // Установите a = 1
  // Добавьте $finish; для завершения моделирования
  
endmodule
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Основы

Потренируйтесь самостоятельно: Онлайн-компилятор Verilog