Menu
Coddy logo textTech

Инструкция 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 должен быть namedbegin : block_name
Disable stops выполнение немедленноКод stops в that момент
Можно использовать откуда угодноИз любого block в module
Полезно для остановки циклов foreverИначе они никогда не остановятся
challenge icon

Задание

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

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

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

  1. Добавьте #50;, чтобы подождать 50 единиц времени
  2. Добавьте disable counter;, чтобы остановить блок 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Проверьте себя

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

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