Цикл 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 обычно используются для проверки всех комбинаций входных сигналов:
reg [3:0] 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.
Шпаргалка
Цикл for в Verilog повторяет блок кода определенное количество раз:
for (initialization; condition; increment) begin
// Код для повторения
endПример вывода чисел от 0 до 4:
integer i;
for (i = 0; i < 5; i = i + 1) begin
$display("i = %d", i);
endОсновные правила:
- Переменная цикла должна иметь тип
integerилиreg(неwire) - Используйте
begin/endдля нескольких операторов - Убедитесь, что условие в конечном итоге станет ложным, чтобы избежать бесконечных циклов
- Циклы лучше всего использовать в тестбенчах (в большинстве случаев они не синтезируемы)
Попробуйте сами
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