Menu
Coddy logo textTech

Цикл Forever

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

Цикл forever повторяет блок кода непрерывно, бесконечно. Он никогда не останавливается сам по себе.

Цикл forever выполняется многократно без конца. Он полезен для генерации тактовых сигналов и других непрерывных сигналов в тестовых окружениях (testbench).

Синтаксис:

forever begin
  // Код, который повторяется вечно
end

Простой пример

forever begin
  $display("This prints forever");
end

Это будет выводиться бесконечно и приведет к сбою вашей симуляции. Всегда добавляйте задержку или условие остановки.

Генерация тактового сигнала (распространенный случай)

Наиболее распространенным способом использования forever является генерация тактового сигнала:

initial begin
  clk = 0;
  forever begin
    #5 clk = ~clk;   // Переключать каждые 5 единиц времени
  end
end

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

Forever с disable

Вы можете остановить цикл forever с помощью оператора disable:

initial begin : clock_gen   // Имя добавлено здесь
  clk = 0;
  forever begin
    #5 clk = ~clk;
  end
end
initial begin
  #100;
  disable clock_gen;   // Теперь это работает
end

Forever против других циклов

ЦиклОстанавливается?Когда использовать
forДа (после фиксированного числа итераций)Известное количество повторений
whileДа (когда условие ложно)Неизвестное условие остановки
repeatДа (после фиксированного числа итераций)Известное количество повторений
foreverНет (никогда)Непрерывные сигналы (тактовый сигнал)

Важные правила

ПравилоОбъяснение
Должно включать задержку#10 или @(posedge clk)
Без задержки симуляция зависаетБесконечный цикл без продвижения во времени
Используйте с disable для остановкиИначе симуляция никогда не завершится
Лучше всего использовать в тестовых окружениях (testbench)Не синтезируется
challenge icon

Задание

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

Добавьте пропущенный цикл forever, чтобы сгенерировать тактовый сигнал, переключающийся каждые 10 единиц времени.

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

module forever_challenge;
  reg clk;
  
  initial begin
    clk = 0;
    // TODO: Добавить цикл forever для переключения clk каждые 10 единиц времени
  end
endmodule
quiz iconПроверьте себя

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

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