Menu
CoddyTech

禁用语句

本课属于 Coddy Verilog 学习旅程的“基础知识”单元。第 62 课,共 90 课。

disable 语句会停止执行命名代码块(例如 forever 循环、begin-end 代码块或任务)。它适合用于跳出原本会一直运行的循环。

语法:

disable block_name;

必须为代码块指定名称。

使用 Forever Loop 禁用

initial begin : counter // counter 将这个代码块命名为 counter。
  forever begin
    #10 count = count + 1;
    if (count == 5) begin
      disable counter;   // disable counter 会停止整个名为 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 在线编译器