Menu
Coddy logo textTech

Инструкция 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В противном случае они никогда не остановятся
challenge icon

Задание

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

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

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

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

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

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