顺序块:顺序块中的语句执行都是从上到下顺序执行,和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
上图为顺序块仿真时序图,可以看到,信号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
可以看到并行块中的语句在仿真开始时同时执行,每条语句的赋值时间仅取决于当前语句的延迟。
阻塞过程赋值:下调语句执行前,当前语句必须执行完成,赋值符号“=”。
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
非阻塞过程赋值:非阻塞语句在执行时,计算右侧的值,然后在预定时间将右侧的值赋值给左值,它在计算出右值后不会阻塞下一条语句的执行,赋值符号“<=”。
initial begin//顺序块关键字 tb_sel <= #5 1'b0; tb_in1 <= #5 1'b1; tb_in2 = #10 1'b1; tb_sel <= #20 1'b1; end
上图的程序执行过程为:仿真开始时,仿真器读取第一条语句的右值并保存,然后继续往下执行读取第二条语句的右值,保存后继续向下执行第三条语句,与上两条语句不同的是,第三条语句读取后不会向下继续执行,而是要延迟10ns将右值赋值给左值后才继续执行第四条语句,要注意的是,第一和第二条语句的右值会在第5ns时将右值赋值给左值,第四条语句先读取右值,延迟20ns后赋值给左值,此时仿真器运行到第30ns。