Disable Statement
Часть раздела Основы путешествия по 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Аппаратное обеспечение и программное обеспечениеВаш первый модульКомментарииУровни абстракции проектирования4Operators Part 1
Arithmetic OperatorsModulo OperatorComparison OperatorsRecap - Simple MathBitwise Operators7Assign And Gates
Continuous AssignmentAssign With OperatorsBuilt In Gate PrimitivesAND OR NOT GatesXOR XNOR GatesRecap - Logic Gate Circuit10Decision Making
If StatementIf - ElseRecap - Simple ComparatorCase StatementCasex And CasezRecap - ALU Design5Operators Part 2
Logical OperatorsReduction OperatorsShift OperatorsConcatenation OperatorConditional OperatorRecap - Operator Challenge3Number System
Binary RepresentationSized NumbersUnsized NumbersNegative NumbersSpecial Values X And ZRecap - Number Formats6Modules
Module StructureInput And Output PortsInout PortsModule InstantiationPort Mapping By NamePort Mapping By OrderRecap - Build A Module9Procedural Blocks
Always BlockInitial BlockSensitivity ListBlocking AssignmentNon Blocking AssignmentRecap - Always vs Initial15Traffic Light Controller
Defining The StatesState Machine LogicПотренируйтесь самостоятельно: Онлайн-компилятор Verilog