Оператор отключения
Часть раздела Основы путешествия по Verilog на Coddy. Урок 62 из 90.
Оператор disable останавливает выполнение именованного блока (например, цикла forever, блока begin-end или задачи). Он полезен для выхода из циклов, которые иначе выполнялись бы бесконечно.
Синтаксис:
disable block_name;Блоку необходимо присвоить имя.
Отключение с помощью бесконечного цикла
initial begin : counter // counter присваивает блоку имя counter.
forever begin
#10 count = count + 1;
if (count == 5) begin
disable counter; // disable counter останавливает весь блок с этим именем.
end
end
endЦикл forever находится внутри именованного блока counter. Инструкция disable counter размещена внутри цикла. Когда count достигает 5, выполняется disable counter, которая останавливает весь блок counter, тем самым немедленно останавливая и цикл forever.
Отключение в отдельном блоке
initial begin : counter
forever begin
#10 count = count + 1;
end
end
initial begin
#50;
disable counter; // Останавливает блок counter извне
endЗдесь цикл forever непрерывно выполняется внутри именованного блока counter. Инструкция disable counter размещена в отдельном блоке initial. Через 50 единиц времени выполняется disable counter и останавливает блок counter, завершая цикл forever извне.
Важные правила
| Правило | Объяснение |
|---|---|
| Блоку нужно дать имя | begin : block_name |
| Disable немедленно останавливает выполнение | Код останавливается в этот момент |
| Можно использовать откуда угодно | Из любого блока в модуле |
Полезно для остановки циклов forever | Иначе они никогда не остановятся |
Задание
Вам дан модуль со счётчиком, который работает бесконечно.
Что нужно сделать:
Заполните пустой блок, заменив каждый комментарий правильным кодом:
- Добавьте
#50;, чтобы подождать 50 единиц времени - Добавьте
disable counter;, чтобы остановить блок счётчика - Добавьте
$display("Counter stopped");, чтобы вывести сообщение - Добавьте
$finish;, чтобы завершить симуляцию
Попробуйте сами
module disable_challenge;
integer count;
initial begin
count = 0;
fork
begin : counter
forever begin
#10 count = count + 1;
$display("count = %d", count);
end
end
begin
// Шаг 1: Подождать 50 единиц времени
// Шаг 2: Отключить блок counter
// Шаг 3: Вывести "Counter stopped"
// Шаг 4: Завершить моделирование
end
join
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