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