Цикл for
Часть раздела Основы путешествия по Verilog на Coddy. Урок 58 из 90.
Циклы в Verilog позволяют выполнять блок кода несколько раз. Они особенно полезны в тестовых стендах для создания повторяющихся тестовых шаблонов, инициализации памяти и перебора массивов. В отличие от описаний аппаратуры, которые выполняются параллельно, циклы выполняются последовательно, что делает их идеальными для моделирования и тестирования.
Наиболее часто используемый цикл — это цикл for, который повторяется заданное количество раз. Цикл for многократно выполняет блок кода, при этом значение переменной цикла меняется на каждой итерации. Ты точно задаёшь количество повторений.
Синтаксис:
for (initialization; condition; increment) begin
// Код для повторения
end| Часть | Что делает | Пример |
|---|---|---|
initialization | Задаёт начальное значение | i = 0 |
condition | Когда остановиться | i < 10 |
increment | Изменяется на каждой итерации цикла | i = i + 1 |
Простой пример
integer i;
for (i = 0; i < 5; i = i + 1) begin
$display("i = %d", i);
endВывод:
i = 0
i = 1
i = 2
i = 3
i = 4Цикл выполняется 5 раз (i = 0, 1, 2, 3, 4).
Цикл for в тестовых стендах
Циклы for обычно используются для проверки всех комбинаций входных данных:
integer test_value;
for (test_value = 0; test_value < 16; test_value = test_value + 1) begin
$display("test_value = %d", test_value);
endТак проверяются все 16 возможных значений 4-битного сигнала.
Цикл for с массивами
reg [7:0] memory [0:9];
integer i;
initial begin
for (i = 0; i < 10; i = i + 1) begin
memory[i] = i * 8;
end
endЭто инициализирует 10 ячеек памяти.
Важные правила
| Правило | Объяснение |
|---|---|
Переменная цикла должна иметь тип integer или reg | Не может иметь тип wire |
Используйте begin/end для нескольких операторов | Обязательно, если строк больше одной |
| Избегайте бесконечных циклов | Убедитесь, что условие в конечном счёте станет ложным |
| Используйте постоянные границы в синтезируемом коде | Синтез разворачивает цикл, создавая отдельную копию логики для каждой итерации |
Задание
Что нужно сделать:
Добавь недостающий цикл for, чтобы вывести числа от 0 до 3.
Попробуйте сами
module for_challenge;
integer i;
initial begin
$display("Printing 0 to 3:");
// TODO: Добавьте цикл for
// Инициализируйте i = 0
// Повторяйте цикл, пока i < 4
// Увеличивайте i = i + 1
// Внутри цикла выводите с помощью: $display("i = %d", i);
$finish;
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