Цикл 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 в тестовых окружениях (Testbench)
Циклы 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 ячеек memory.
Важные правила
| Правило | Пояснение |
|---|---|
Переменная цикла должна иметь тип integer или reg | Не может быть wire |
Используйте begin/end для нескольких операторов | Требуется, если строк больше одной |
| Избегайте бесконечных циклов | Убедитесь, что condition в конечном итоге станет false |
| Лучше всего использовать в тестбенчах | Большинство циклов не являются синтезируемыми |
Задание
Что нужно сделать:
Добавьте пропущенный цикл for, чтобы напечатать числа от 0 до 3.
Попробуйте сами
module for_challenge;
integer i;
initial begin
$display("Printing 0 to 3:");
// TODO: Добавьте цикл for
// Инициализируйте i = 0
// Цикл пока i < 4
// Инкремент i = i + 1
// Внутри выведите i
$finish;
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