Forever Loop
Часть раздела Основы путешествия по 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Аппаратное обеспечение и программное обеспечениеВаш первый модульКомментарииУровни абстракции проектирования4Operators Part 1
Arithmetic OperatorsModulo OperatorComparison OperatorsRecap - Simple MathBitwise Operators7Assign And Gates
Continuous AssignmentAssign With OperatorsBuilt In Gate PrimitivesAND OR NOT GatesXOR XNOR GatesRecap - Logic Gate Circuit10Decision Making
If StatementIf - ElseRecap - Simple ComparatorCase StatementCasex And CasezRecap - ALU Design5Operators Part 2
Logical OperatorsReduction OperatorsShift OperatorsConcatenation OperatorConditional OperatorRecap - Operator Challenge3Number System
Binary RepresentationSized NumbersUnsized NumbersNegative NumbersSpecial Values X And ZRecap - Number Formats6Modules
Module StructureInput And Output PortsInout PortsModule InstantiationPort Mapping By NamePort Mapping By OrderRecap - Build A Module9Procedural Blocks
Always BlockInitial BlockSensitivity ListBlocking AssignmentNon Blocking AssignmentRecap - Always vs Initial15Traffic Light Controller
Defining The StatesState Machine LogicПотренируйтесь самостоятельно: Онлайн-компилятор Verilog