Menu
CoddyTech

initial 块

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

Verilog 有两个过程块:initial(运行一次)和 always(持续运行)。现在我们来介绍 initial 块。

什么是 Initial 块?

initial 块在仿真开始时(时间 0)只运行一次。运行结束后,它不会再次运行。

它主要用于测试平台,用来:

  • 设置初始值
  • 生成测试信号
  • 显示消息
  • 启动仿真

语法

initial begin
  // 语句按顺序执行一次
end

基础示例

initial begin
  $display("Simulation started");
  $display("This runs once");
  $finish;
end

输出:

Simulation started
This runs once

使用初始块生成测试信号

initial begin
  a = 0;
  #10 a = 1;
  #10 a = 0;
  #10 $finish;
end

这会使 a 在时间点 0、10 和 20 发生变化。

初始执行与始终执行

 initialalways
运行方式一次持续运行(永远)
用途测试平台、初始化硬件(触发器、计数器)
可综合?仅用于设置初始值(FPGA)可以(需使用敏感列表)

重要说明

  • initial 块主要用于仿真。综合工具无法将 #10 这样的延迟或 $display 这样的任务转换为硬件
  • 主要在测试平台中使用 initial。在设计模块中,只有 FPGA 综合工具会使用它,而且仅用于设置寄存器或存储器的初始值
  • 如果测试平台中包含自由运行的时钟(例如 always #5 clk = ~clk;),除非调用 $finish,否则仿真会一直运行;如果只有一个 initial 块,当没有剩余事件时,仿真器会自行停止,但添加 $finish 仍是良好的做法
challenge icon

挑战

添加缺失的 initial 块,将 a 设为 0,然后在 10 个时间单位后将 a 设为 1。

要做什么:

  1. 添加 initial begin 和 end
  2. 设置 a = 0
  3. 等待 #10
  4. 设置 a = 1
  5. 添加 $finish 以结束仿真

亲手试试

module test;
  reg a;
  
  // TODO: 在这里添加 initial 块
  // 将 a 设为 0
  // 等待 #10
  // 将 a 设为 1
  // 添加 $finish; 以结束仿真
  
endmodule
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

基础知识中的所有课

自己练习: Verilog 在线编译器