Menu
Coddy logo textTech

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Иначе они никогда не остановятся
challenge icon

Задание

Вам дан module со счётчиком, который работает forever. 

Что нужно сделать:

Заполните пустой block, заменив каждый комментарий правильным кодом:

  1. Добавьте #50;, чтобы подождать 50 time units
  2. Добавьте disable counter;, чтобы остановить block counter
  3. Добавьте $display("Counter stopped");, чтобы вывести сообщение
  4. Добавьте $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
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Основы

Потренируйтесь самостоятельно: Онлайн-компилятор Verilog