顺序块:顺序块中的语句执行都是从上到下顺序执行,和C语言执行过程一样,关键词是begin、end。

initial begin//顺序块关键字
	tb_sel = 1'b0;
	#5 tb_in1 = 1'b1;//时刻5执行
	#10 tb_in2 = 1'b1;//时刻15执行
	#20 tb_sel = 1'b1;//时刻35执行
end

Verilog 顺序块、并行块,阻塞过程赋值、非阻塞过程赋值的区别_fpga

Verilog 顺序块、并行块,阻塞过程赋值、非阻塞过程赋值的区别_fpga_02

Verilog 顺序块、并行块,阻塞过程赋值、非阻塞过程赋值的区别_Verilog_03编辑

 上图为顺序块仿真时序图,可以看到,信号tb_in1在5ns时发生跳变,tb_in2的赋值在上一语句tb_in1执行完后延迟10ns后才发生跳变。同样的,信号tb_sel在延迟35ns后跳变。

并行块:并行块中的语句执行是同时进行,执行时间仅取决于当前语句的延迟,关键词是fork、join。

initial fork//并行块关键字
	tb_sel = 1'b0;
	#5 tb_in1 = 1'b1;//时刻5执行
	#10 tb_in2 = 1'b1;//时刻10执行
	#20 tb_sel = 1'b1;//时刻15执行
join

Verilog 顺序块、并行块,阻塞过程赋值、非阻塞过程赋值的区别_fpga_04

Verilog 顺序块、并行块,阻塞过程赋值、非阻塞过程赋值的区别_Verilog_05

Verilog 顺序块、并行块,阻塞过程赋值、非阻塞过程赋值的区别_Verilog_06编辑

 可以看到并行块中的语句在仿真开始时同时执行,每条语句的赋值时间仅取决于当前语句的延迟。

阻塞过程赋值:下调语句执行前,当前语句必须执行完成,赋值符号“=”。

initial begin//顺序块关键字
	tb_sel = 1'b0;
	#5 tb_in1 = 1'b1;//时刻5执行
	#10 tb_in2 = 1'b1;//时刻15执行
	#20 tb_sel = 1'b1;//时刻35执行
end

Verilog 顺序块、并行块,阻塞过程赋值、非阻塞过程赋值的区别_fpga_07

Verilog 顺序块、并行块,阻塞过程赋值、非阻塞过程赋值的区别_fpga_08

Verilog 顺序块、并行块,阻塞过程赋值、非阻塞过程赋值的区别_Verilog_09编辑

非阻塞过程赋值:非阻塞语句在执行时,计算右侧的值,然后在预定时间将右侧的值赋值给左值,它在计算出右值后不会阻塞下一条语句的执行,赋值符号“<=”。

initial begin//顺序块关键字
	tb_sel <= #5 1'b0;
	tb_in1 <= #5 1'b1;
	tb_in2 = #10 1'b1;
	tb_sel <= #20 1'b1;
end

Verilog 顺序块、并行块,阻塞过程赋值、非阻塞过程赋值的区别_Verilog_10

Verilog 顺序块、并行块,阻塞过程赋值、非阻塞过程赋值的区别_Verilog_11

Verilog 顺序块、并行块,阻塞过程赋值、非阻塞过程赋值的区别_Verilog_12编辑

上图的程序执行过程为:仿真开始时,仿真器读取第一条语句的右值并保存,然后继续往下执行读取第二条语句的右值,保存后继续向下执行第三条语句,与上两条语句不同的是,第三条语句读取后不会向下继续执行,而是要延迟10ns将右值赋值给左值后才继续执行第四条语句,要注意的是,第一和第二条语句的右值会在第5ns时将右值赋值给左值,第四条语句先读取右值,延迟20ns后赋值给左值,此时仿真器运行到第30ns。