Цикл 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
endinitial begin
#100;
disable clock_gen; // Теперь это работает
endForever против других циклов
| Цикл | Останавливается? | Когда использовать |
|---|---|---|
for | Да (после фиксированного количества итераций) | Известное количество повторений |
while | Да (когда условие ложно) | Неизвестное условие остановки |
repeat | Да (после фиксированного количества итераций) | Известное количество повторений |
forever | Нет (никогда) | Непрерывные сигналы (тактовый сигнал) |
Важные правила
| Правило | Объяснение |
|---|---|
| Должно включать задержку | #10 или @(posedge clk) |
| Без задержки симуляция зависает | Бесконечный цикл без продвижения времени |
Используйте с disable для остановки | Иначе симуляция никогда не закончится |
| Лучше всего использовать в тестбенчах | Не синтезируется |
Задание
Что нужно сделать:
Добавьте недостающий цикл 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В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Основы
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