Menu
Coddy logo textTech

Цикл Forever

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

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

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

Синтаксис:

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 для остановкиИначе симуляция никогда не закончится
Лучше всего использовать в тестбенчахНе синтезируется
challenge icon

Задание

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

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

Шпаргалка

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

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

Остановите цикл forever, используя disable с именованным блоком:

initial begin : clock_gen
  clk = 0;
  forever begin
    #5 clk = ~clk;
  end
end

initial begin
  #100;
  disable clock_gen;
end

Основные правила:

  • Должен включать задержку (#10 или @(posedge clk)), иначе симуляция зависнет
  • Используйте disable для остановки, иначе симуляция никогда не закончится
  • Не синтезируется — только для использования в тестбенчах

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

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

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

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