Menu
Coddy logo textTech

Блок 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.

Initial против Always

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

Важные примечания

  • Блоки initial не синтезируемы — их нельзя превратить в аппаратное обеспечение
  • Используйте initial только в тестбенчах
  • Без $finish симуляция будет длиться вечно (нет тактового сигнала, чтобы её остановить)
challenge icon

Задание

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

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

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

Шпаргалка

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

initial begin
  a = 0;       // устанавливается в момент времени 0
  #10 a = 1;   // устанавливается в момент времени 10
  #10 a = 0;   // устанавливается в момент времени 20
  $finish;     // завершение симуляции
end

Без $finish симуляция будет выполняться бесконечно.

initialalways
ВыполняетсяОдин разНепрерывно
ПрименениеТестбенчиАппаратная логика
Синтезируемый?НетДа

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

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

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

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