这两种语句是对设计进行行为级建模的主要结构。
一个模块之中可以包含任意多条initial语句或者always语句,这些语句相互之间是并行执行的,其在模块之中的顺序不重要。一条initial语句或者always语句的执行会产生一个单独的控制流。所有的initial语句和always语句都是在0时刻开始并行地执行。
1.initial语句
initial语句主要用于初始化和波形的形成
一条initial语句之能执行一次,在仿真开始时(0时刻)执行,语法格式如下:
initial
[timing_control] procedural_statement #过程性语句
过程性语句包含下列语句:
阻塞性或非阻塞性过程赋值语句、过程连续赋值语句、条件语句、分支语句、循环语句、等待语句、顺序块、并行块......
顺序块(begin...end)是最常使用的过程性语句。这里的timing_control可以是延迟控制,即指定等待时间;也可为事件控制,即等待定的事件发生或指定的条件为真。执行initial语句时,各条过程性语句仅执行一次。initial语句在仿真的0时刻开始执行。根据过程性语句之中出现的时间控制,其在一定的事件之后才会完成执行。顺序块中所包含的过程语句时按照顺序执行的。
e.g.1 无时序控制的过程性赋值语句
reg intf_read;
...
initial
intf_read=2;
initial语句在0时刻执行,intf_read在0时刻被赋值为2。
e.g.2 带有时序控制的initial语句
reg fc_addr;
...
initial
#2fc_addr=1;
reg变量fc_addr在时刻2被赋值为1。initial语句在0时刻开始执行,但在时刻2才完成执行。
2.always语句
always语句总是循环执行,或者说此语句重复执行,always语句同样在0时刻开始执行。
always语句的语法格式如下:
always
[timing_control] procedural_statement #过程性语句
always语句必须总是带有某种时序控制。
e.g.1 always
clk_siob=~clk_siob //将无限循环
e.g.2 always
#5 clk_siob=~clk_siob //在 clk_siob上生成时钟周期为10个时间单位的波形
由事件控制的顺序块的always语句格式:
always @ (敏感信号)
begin
...
...
end
这条always语句意味着只要敏感信号有所变化,就执行顺序块,按顺序依次执行其中的所有语句。编写组合逻辑的 always 块时,使用 * 代替敏感信号列表是一个简单方便而且不容易出错的好办法。
e.g:下列代码中第一条always语句顺序块的执行由电平敏感事件控制,第二条中由跳变沿敏感事件控制。
module d_flipflop(clk,d,set,q,qbar)
input clk,d,set;
output reg q,qbar;
always
wait(set==1)
begin
#3q<=1;
#1qbar<=0;
wait(set==0);
end
always@(negedge clk)
begin
if(set!=1)
begin
#5q<=d;
#1qbar=~q;
end
end
endmodule