Verilog Initial 块

2025年3月17日 | 阅读 3 分钟

always 块表示一个自由运行的进程,而 initial 块表示一个只执行一次的进程。这两种结构都从模拟器时间 0 开始执行,并且都执行到块的末尾。

Initial 块可以在可综合或不可综合的块中使用。它们通常用于测试平台。

Initial 块导致在开始模拟之前执行特定指令,然后执行任何其他指令。 Initial 块仅运行一次。

可综合的 initial 块用于设置寄存器、RAMROM 在 FPGA 内的开机值。但是,initial 块不能在 ASIC 或 CPLD 中综合。

Initial 和 always 块描述独立的进程,这意味着一个进程中的语句独立地执行。

这两种类型的进程都由过程语句组成,并且都在模拟器启动时立即启动。

它们之间的主要区别在于

  • initial 进程执行一次,而 always 进程永久重复执行。
  • always 进程必须包含计时语句,这些语句偶尔会阻塞执行并允许时间推进。

语法

Verilog initial 块遵循以下语法

Initial 块使用

initial 块不可综合,不能转换为具有数字元素的硬件原理图。

initial 块除了用于模拟之外,没有其他用途。这些块主要用于初始化变量并使用特定值驱动设计端口。

Initial 块执行

initial 块在模拟开始时从时间单位 0 开始。此块仅在整个模拟过程中执行一次。当块内的所有语句都执行完毕后,initial 块的执行结束,如下图所示。

Verilog Initial Block

上图有一个名为 behave 的模块,它有 a 和 b 内部信号。

initial 块只有一个语句,因此不需要将该语句放在 begin 和 end 之间。

此语句在时间单位 0 开始时为 a 赋值 2'b10。

Initial 块延迟元素

下面所示的代码有一个额外的语句,该语句为信号 b 分配某个值。但是,这仅在执行上一个语句后的 10 个时间单位后发生。

例如,如果首先为 a 分配给定值,然后在 10 个时间单位后,将 b 分配为 0。

Verilog Initial Block

模块中的 Initial 块

可以定义在模块内部的 initial 块的数量没有限制。下面显示的代码有三个 initial 块,它们都同时启动并并行运行。

但是,根据每个 initial 块中的语句和延迟,完成该块所需的时间可能会有所不同。

Verilog Initial Block

注意:$finish 是一个 Verilog 系统任务,它告诉模拟器终止当前模拟。

在上图中,第一个块的延迟为 20 个单位,第二个块的总延迟为 50 个单位(10 + 40),最后一个块的延迟为 60 个单位。因此,模拟需要 60 个时间单位才能完成,因为至少有一个 initial 块仍在运行直到 60 个时间单位。

如果最后一个块的延迟为 30 个时间单位,如下所示,则模拟将在 30 个时间单位结束,从而终止当时活动的所有其他 initial 块。


下一个主题Verilog 块语句