Menu
CoddyTech

Бесконечный цикл

Часть раздела Основы путешествия по 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:

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

Бесконечный цикл и другие циклы

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

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

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

Задание

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

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

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

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

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

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

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