顺序块
关键字begin-end用于将多条语句组成顺序块。
在程序中,赋值语句,有顺序,只有前面的语句执行完成之后才能执行后面的语句,但不需要执行时间;如果语句包括延迟时间或时间控制,那么延迟总是相对于前面那条语句执行完成的仿真时间。
Verilog数字系统设计教程P60 略有修改程序,仿真中可以更理解顺序块语句的特点。
程序
`timescale 1ns / 1ps
module exa59(
x,y,a,b
);
input x;
input y;
output reg[0:0] a;
output reg[1:0] b;
wire [0:0] x;
wire [0:0]y;
always@(*)
begin
b={y,x};
a=x;
end
endmodule
仿真程序
`timescale 1ns / 1ps
module tb_exa59();
//inputs
reg x;
reg y;
//outputs
wire a;
wire b;
exa59 uut(
.x (x),
.y (y),
.a (a),
.b (b)
);
initial//顺序块1
begin
x=1'b0;
y=1'b1;
end
initial//顺序块2
begin
#5 x=1'b1;
y=1'b0;
end
initial//顺序块3
begin
#10 x=1'b0;
#15 y=1'b1;
end
//reg CLK_0 = 0;
//always #10 CLK_0 = ~CLK_0;
endmodule
仿真结果分析
从仿真可以看出,不同的顺序块之间是并行的,顺序块内部是顺序执行的。
(1)赋值的开始,即顺序块1,仿真的0时刻,x,y,a,b的值位0,1,0,2;这里似乎看不出是顺序执行;
(2)在顺序块内部加上延时处理,即顺序块2中,在仿真5时刻,按照不同顺序块并行,在仿真0时刻,y应该为0,可以看出,x,y的值同时变化,是应为x的赋值在y之前,且顺序块内部顺序执行,(如果语句包括延迟时间,那么延迟总是相对于前面那条语句执行完成的仿真时间),所以在顺序块2中,x,y的值同时在仿真5时刻变化;
(3)顺序块3可以自行分析啦。