Цикл While
Часть раздела Основы путешествия по Verilog на Coddy — урок 59 из 90.
Цикл while повторяет блок кода пока условие истинно. В отличие от цикла for, у него нет встроенного счётчика — вы должны обновлять переменную цикла самостоятельно.
Цикл while проверяет условие перед каждой итерацией. Если условие истинно, цикл выполняется. Если ложно, цикл останавливается.
Синтаксис:
while (condition) begin
// Код для повторения
endПростой пример
integer i = 0;
while (i < 5) begin
$display("i = %d", i);
i = i + 1;
endВывод:
i = 0
i = 1
i = 2
i = 3
i = 4Цикл выполняется до тех пор, пока i < 5.
Сравнение циклов While и For
| Цикл For | Цикл While | |
|---|---|---|
| Счетчик | Встроенный | Вы управляете им |
| Когда использовать | Известное количество итераций | Неизвестно, когда цикл остановится |
| Синтаксис | for (i=0; i<5; i=i+1) | while (i < 5) |
Цикл While в тестбенчах
Циклы while полезны, когда вы не знаете точно, сколько итераций вам потребуется:
integer i = 0;
while (i < 16) begin
$display("Testing value %d", i);
i = i + 1;
endПоиск конкретного значения
integer i = 0;
reg [7:0] data;
while (data[i] != 1) begin
i = i + 1;
end
$display("First 1 found at position %d", i);Важные правила
| Правило | Объяснение |
|---|---|
| Условие должно стать ложным | Иначе возникнет бесконечный цикл |
| Обновляйте переменную цикла внутри | Иначе цикл никогда не закончится |
Переменная цикла должна быть integer | Не может быть reg |
Используйте begin/end для нескольких операторов | Требуется для более чем одной строки |
Задание
Что нужно сделать:
Добавьте недостающий цикл while, чтобы вывести числа от 0 до 2.
Шпаргалка
Цикл while повторяет блок кода до тех пор, пока условие истинно. Вы должны обновлять переменную цикла вручную.
integer i = 0;
while (i < 5) begin
$display("i = %d", i);
i = i + 1;
endОсновные правила:
- Переменная цикла должна быть типа
integer(неreg) - Всегда обновляйте переменную цикла внутри цикла, чтобы избежать бесконечных циклов
- Используйте
begin/endдля нескольких операторов
While против For: Используйте for, когда количество итераций известно; используйте while, когда условие остановки динамическое (например, поиск значения).
// Поиск первого установленного бита
while (data[i] != 1) begin
i = i + 1;
endПопробуйте сами
module while_challenge;
integer i;
initial begin
i = 0;
$display("Printing 0 to 2:");
// TODO: Добавить цикл while
// Цикл, пока i < 3
// Внутри вывести i
// Увеличить i на 1
$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