Цикл 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
endinitial begin
#100;
disable clock_gen; // Теперь это работает
endForever против других циклов
| Цикл | Останавливается? | Когда использовать |
|---|---|---|
for | Да (после фиксированного числа итераций) | Известное количество повторений |
while | Да (когда условие ложно) | Неизвестное условие остановки |
repeat | Да (после фиксированного числа итераций) | Известное количество повторений |
forever | Нет (никогда) | Непрерывные сигналы (тактовый сигнал) |
Важные правила
| Правило | Объяснение |
|---|---|
| Должно включать задержку | #10 или @(posedge clk) |
| Без задержки симуляция зависает | Бесконечный цикл без продвижения во времени |
Используйте с disable для остановки | Иначе симуляция никогда не завершится |
| Лучше всего использовать в тестовых окружениях (testbench) | Не синтезируется |
Задание
Что нужно сделать:
Добавьте пропущенный цикл forever, чтобы сгенерировать тактовый сигнал, переключающийся каждые 10 единиц времени.
Попробуйте сами
module forever_challenge;
reg clk;
initial begin
clk = 0;
// TODO: Добавить цикл forever для переключения clk каждые 10 единиц времени
end
endmoduleВ этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Основы
1Введение
Что такое VerilogHardware против SoftwareУровни абстракции проектированияВаш первый модульКомментарии4Операторы. Часть 1
Арифметические операторыОператор остатка от деленияОператоры сравненияПовторение: простая математикаПобитовые операторы7Оператор Assign и логические вентили
Непрерывное присваиваниеAssign с операторамиВстроенные примитивы вентилейВентили AND, OR, NOTВентили XOR, XNORИтоги: Схемы на логических вентилях10Принятие решений
Оператор ifКонструкция if - elseПовторение: простой компараторОператор caseОператоры casex и casezПовторение: проектирование ALU5Операторы. Часть 2
Логические операторыОператоры редукцииОператоры сдвигаОператор конкатенацииУсловный операторПовторение — Испытание по операторам3Системы счисления
Двоичное представлениеЧисла с заданным размеромЧисла без заданного размераОтрицательные числаСпециальные значения X и ZИтоги — форматы чисел6Модули
Структура модуляВходные и выходные портыПорты InoutИнстанцирование модуляПодключение портов по имениПодключение портов по порядкуИтоги: создание модуля9Процедурные блоки
Блок alwaysБлок initialСписок чувствительностиБлокирующее присваиваниеНеблокирующее присваиваниеИтоги: always против initial