仿真中通常会依次执行一组Verilog语句。这些语句被放置在一个程序块中。在Verilog中主要有两种类型的程序块–initial块和always块。
initial块可以理解为一个初始化块,在initial的起始位置的语句在0时刻即开始执行,之后如果遇到延时,则延时之后执行接下来的语句。
其语法如下:
initial
[single statement]
initial begin
[multiple statements]
end
如果initial中有多条语句,则置于begin …end之间。
初始块是不可综合的,因此不能将其转化为带有数字元素的硬件原理图。因此初始块除了在仿真中使用外,并没有太大的作用。这些块主要用于初始化变量和用特定的值驱动设计端口。
注意:在芯片逻辑设计中,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
在仿真开始时,在时间0单位开始一个初始块。在整个仿真的过程中,这个代码块只执行一次。一旦initial块中的所有语句被执行,initial块的执行就结束了。
如果initial块中就一条语句,那么开始也是结束,语句执行完就结束这个initial块,如:
下图所示的代码有一条额外的语句,它给信号b分配了一些值,但是这只发生在执行前一条语句的10个时间单位之后。这意味着a首先被分配给给定的值,然后在10个时间单位之后,b被分配给0。
可以有多个(任意多)initial块。
多个initial块是同时执行的,都是从时刻0开始执行。
下图所示的代码有三个初始块,所有的初始块都在同一时间启动并并行运行。然而,根据每个初始块中的语句和延迟,完成该块所需的时间可能会有所不同。
$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?