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

顺序块:顺序块中的语句执行都是从上到下顺序执行,和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。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值