Инструкция Disable
Часть раздела Основы путешествия по Verilog на Coddy — урок 62 из 90.
Оператор disable останавливает выполнение именованного блока (такого как цикл forever, блок begin-end или task). Это полезно для прерывания циклов, которые в противном случае выполнялись бы бесконечно.
Синтаксис:
disable block_name;Блок должен быть помечен именем.
Прерывание с помощью цикла forever
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.
Отключение в отдельном блоке
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;, чтобы остановить блок counter - Добавьте
$display("Counter stopped");, чтобы вывести сообщение - Добавьте
$finish;, чтобы завершить симуляцию
Шпаргалка
Оператор disable останавливает выполнение именованного блока (например, цикла forever). Блок должен быть помечен с помощью begin : block_name.
Отключение изнутри блока:
begin : counter
forever begin
#10 count = count + 1;
if (count == 5) disable counter;
end
endОтключение из отдельного блока:
begin : counter
forever begin
#10 count = count + 1;
end
end
initial begin
#50;
disable counter; // останавливает именованный блок извне
endПопробуйте сами
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Введение
Что такое 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