Verilog初级教程(11)Verilog中的initial块

前言

仿真中通常会依次执行一组Verilog语句。这些语句被放置在一个程序块中。在Verilog中主要有两种类型的程序块–initial块和always块。

正文

语法格式

initial块可以理解为一个初始化块,在initial的起始位置的语句在0时刻即开始执行,之后如果遇到延时,则延时之后执行接下来的语句。
其语法如下:

initial
	[single statement]

initial begin
	[multiple statements]
end

如果initial中有多条语句,则置于begin …end之间。

initial块是用来干什么的?

初始块是不可综合的,因此不能将其转化为带有数字元素的硬件原理图。因此初始块除了在仿真中使用外,并没有太大的作用。这些块主要用于初始化变量和用特定的值驱动设计端口。

注意:在芯片逻辑设计中,initial块确实只能用于行为仿真,但是在FPGA设计中,简单的使用initial进行变量的初始化是可以综合的。
例如:

reg a, b, c;

initial begin
a = 0;
b = 0;
c = 0;
end

但我们更多地在变量定义时刻就进行了初始化,这是推荐的用法。
例如:

reg a = 0;

或者使用复位信号进行初始化,但这会增加综合布线的负担,可以有意识的减少,除非不得不。
例如:

reg a;

always@(posedge i_clk) begin
	if(i_rst) begin
		a <= 0;
	end

end

initial块何时开始又何时结束?

在仿真开始时,在时间0单位开始一个初始块。在整个仿真的过程中,这个代码块只执行一次。一旦initial块中的所有语句被执行,initial块的执行就结束了。

如果initial块中就一条语句,那么开始也是结束,语句执行完就结束这个initial块,如:

一条语句的initial 块

下图所示的代码有一条额外的语句,它给信号b分配了一些值,但是这只发生在执行前一条语句的10个时间单位之后。这意味着a首先被分配给给定的值,然后在10个时间单位之后,b被分配给0。

一个initial块中的多条语句的initial块

一个模块中允许有多少个initial块?

可以有多个(任意多)initial块。
多个initial块是同时执行的,都是从时刻0开始执行。

下图所示的代码有三个初始块,所有的初始块都在同一时间启动并并行运行。然而,根据每个初始块中的语句和延迟,完成该块所需的时间可能会有所不同。

多个initial块

$finish是一个Verilog系统任务,它告诉仿真器终止当前的仿真。

如果最后一个块有30个时间单位的延迟,如下图所示,仿真将在30个时间单位结束,从而杀死了当时处于活动状态的所有其他initial块。

initial begin
	#30 $finish;
end

参考资料

参考资料1

参考资料2

写在最后

Verilog初级教程(10)Verilog的always块

Verilog初级教程(9)Verilog的运算符

Verilog初级教程(8)Verilog中的assign语句

Verilog初级教程(7)Verilog模块例化以及悬空端口的处理

Verilog初级教程(6)Verilog模块与端口

Verilog初级教程(5)Verilog中的多维数组和存储器

Verilog初级教程(4)Verilog中的标量与向量

Verilog初级教程(3)Verilog 数据类型

Verilog初级教程(2)Verilog HDL的初级语法

Verilog初级教程(1)认识 Verilog HDL

芯片设计抽象层及其设计风格

Verilog以及VHDL所倡导的的代码准则

FPGA/ASIC初学者应该学习Verilog还是VHDL?

  • 个人微信公众号: FPGA LAB

猜你喜欢

转载自blog.csdn.net/Reborn_Lee/article/details/107307958