Бесконечный цикл
Часть раздела Основы путешествия по Verilog на Coddy. Урок 61 из 90.
Цикл forever повторяет блок кода непрерывно, forever. Он никогда не останавливается сам.
Цикл forever выполняется повторно без end. Он полезен для генерации тактовых сигналов и других непрерывных сигналов в тестовых стендах.
Синтаксис:
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 | Да (после фиксированного числа итераций) | Известное число repeats |
while | Да (когда условие ложно) | Неизвестное условие остановки |
repeat | Да (после фиксированного числа итераций) | Известное число repeats |
forever | Нет (никогда) | Непрерывные сигналы (часы) |
Важные правила
| Правило | Объяснение |
|---|---|
| Обязательно включать задержку | #10 или @(posedge clk) |
| Без задержки симуляция зависает | Бесконечный loop без продвижения time |
Использовать с disable, чтобы остановить | Иначе симуляция никогда не заканчивается |
| Лучше всего использовать в тестбенчах | Не поддерживается синтезом |
Задание
Что нужно сделать:
Добавьте отсутствующий цикл forever, чтобы создать часы, которые переключаются через каждые 10 единиц времени.
Попробуйте сами
module forever_challenge;
reg clk;
initial begin
clk = 0;
// TODO: Добавить цикл forever для переключения clk каждые 10 единиц времени
end
endmoduleВ этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Основы
1Введение
Что такое VerilogАппаратное и программное обеспечениеВаш первый модульКомментарииУровни абстракции проектирования4Операторы. Часть 1
Арифметические операторыОператор взятия остаткаОператоры сравненияПовторение — простая математикаПобитовые операторы7Присваивание и логические элементы
Непрерывное присваиваниеПрисваивание с операторамиВстроенные примитивы логических элементовЭлементы И, ИЛИ и НЕЭлементы XOR и XNORПовторение — схема на логических элементах10Принятие решений
Оператор ifif—elseПовторение — простой компараторОператор casecaseх и casezПовторение — проектирование ALU5Операторы, часть 2
Логические операторыОператоры свёрткиОператоры сдвигаОператор конкатенацииУсловный операторПовторение — задание на операторы11Циклы
Цикл forЦикл whileЦикл повторенияБесконечный циклОператор отключенияПовторение — шаблоны циклов3Система счисления
Двоичное представлениеЧисла заданной разрядностиЧисла без указания разрядностиОтрицательные числаСпециальные значения X и ZПовторение — форматы чисел6Модули
Структура модуляВходные и выходные портыДвунаправленные портыСоздание экземпляра модуляПодключение портов по имениПодключение портов по порядкуПовторение — создание модуля9Процедурные блоки
Блок AlwaysБлок InitialСписок чувствительностиБлокирующее присваиваниеНеблокирующее присваиваниеПовторение: Always и InitialПотренируйтесь самостоятельно: Онлайн-компилятор Verilog