Menu
CoddyTech

Оператор отключения

Часть раздела Основы путешествия по Verilog на Coddy. Урок 62 из 90.

Оператор disable останавливает выполнение именованного блока (например, цикла forever, блока begin-end или задачи). Он полезен для выхода из циклов, которые иначе выполнялись бы бесконечно.

Синтаксис:

disable block_name;

Блоку необходимо присвоить имя.

Отключение с помощью бесконечного цикла

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.

Отключение в отдельном блоке

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 немедленно останавливает выполнениеКод останавливается в этот момент
Можно использовать откуда угодноИз любого блока в модуле
Полезно для остановки циклов foreverИначе они никогда не остановятся
challenge icon

Задание

Вам дан модуль со счётчиком, который работает бесконечно. 

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

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

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

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

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

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