Оператор отключения
Часть раздела Основы путешествия по Verilog на Coddy. Урок 62 из 90.
Оператор disable останавливает выполнение named block (например, цикла forever, блока begin-end или задачи). Он полезен для выхода из циклов, которые в противном случае выполнялись бы бесконечно.
Синтаксис:
disable block_name;Блок должен быть помечен именем.
Отключение с помощью цикла forever
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.
Disable в отдельном блоке
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 немедленно останавливает выполнение | Код останавливается в этот момент |
| Можно использовать откуда угодно | Из любого block в module |
Полезно для остановки циклов forever | Иначе они никогда не остановятся |
Задание
Вам дан module со счётчиком, который работает forever.
Что нужно сделать:
Заполните пустой block, заменив каждый комментарий правильным кодом:
- Добавьте
#50;, чтобы подождать 50 time units - Добавьте
disable counter;, чтобы остановить block counter - Добавьте
$display("Counter stopped");, чтобы вывести сообщение - Добавьте
$finish;, чтобы завершить simulation
Попробуйте сами
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