Verilog_HDL中阻塞赋值与非阻塞赋值的区别与应用

巡山小妖精
963次浏览
2021年02月11日 16:45
最佳经验
本文由作者推荐

-

2021年2月11日发(作者:艾派国历)




Verilog HDL


中阻塞赋值与非阻塞赋值的区别与应用



张文波



摘要:


Verilog


HDL


语言是世界上应用最广泛的硬件描述语言之一。在


Verilog < /p>


HDL


语言中最容易混


淆的概念之一就是 阻塞赋值与非阻塞赋值,


甚至一些非常有经验的


Verilog


HDL


设计师也不能完全理


解为什么和 什么时候使用阻塞赋值和非阻塞赋值。本文详细阐述了阻塞赋值与非阻塞赋值的概念和


区 别,通过仿真和举例进一步解释了阻塞赋值与非阻塞赋值在工程中的典型应用和技巧。本文中的

< br>所有程序代码,在


ISE10.1


应用软件中均测试通过 ,可以直接引用。



关键词:



阻塞赋值;非阻塞赋值;仿真



中图分类号:


TP368

















文献标识码


:



The Difference and Application of Blocking assignment and Nonblocking assignment in Verilog HDL


ZHANG Wen-bo


(China Airboren Missile Academy, Henan Luoyang 471000, China)


ABSTRACT


:


In the world,one of the most extensive hardware description language is Verilog


of the most misunderstood constructs in the Verilog language is the blocking assignment and nonblocking


assignment,even very experienced Verilog designers do not understand when and why blocking assignment


and


nonblocking


assignment


should


be



paper


details


the


difference


and


the


constructs


of


the


blocking


assignment


and


nonblocking


assignment,and


makes


a


further


explanation


about


the


typical


application


and


skills


whit


the


simulation


and



this


paper,all


of


the


code


were


validated


by


ISE10.1.


KEYWORDS


:


blocking assignment; nonblocking assignment; simulation



1


引言



Verilog HDL


语言是目前世界上最流行的硬件描述语 言之一,


被广泛的应用于基于可编程逻辑器


件的项目开发。在< /p>


Verilog HDL


语言中,信号有两种赋值方式:阻塞赋值 方式和非阻塞赋值方式。



2


功能定义



赋值语句的功能是用赋值语 句右端的表达式所定义的逻辑来驱动该赋值语句左端表达式的变


量。


2.1


阻塞赋值语句



阻塞赋值用符号“


=


”表示。阻塞赋值表示在 当前的赋值完成前阻塞其他的赋值任务。即在赋值


时,


先计算< /p>


“


=


”


右边的值 ,


此时赋值语句不允许任何别的赋值任务的干扰,


直到现行的赋 值完成时,


才允许别的赋值语句的执行。也就是说,在同一个块语句中,其后面的赋值语 句是在前一句赋值语


句结束后再开始赋值的。



比如下面的程序:



initial


begin



a=0;


//


阻塞赋值语句


S1



a=1;


//


阻塞赋值语句


S2


end


中包含了两条阻塞赋值语句


S 1


和


S2


,我们假设

< br>initial


块是在仿真时刻


0


得到执行的。由于


S1


和


S2


都是阻塞赋值语句,所以在执行


S1


时,


S2


被“阻塞”而不能得到执行;只有在


S 1


执行完毕,


a


被赋值


为


0


之后,


S2


才开始执行。而


S2


的执行将使变量


a


重新被赋值为


1


。



2.2


非阻塞赋值语句



非阻塞赋值用符号


“<=”


表示。

< br>非阻塞赋值表示在当前的赋值未完成前不阻塞其他的赋值任


务。即在赋值操作开始 时计算“<=”右边的表达式,在赋值操作结束时更新“<=”左边的变量,



1


并且在赋值操作的过程中,允许其他赋值语句同时执行。也 就是说,在同一个块语句中,其后面的


赋值语句是在前一句非阻塞赋值语句开始时,同时 开始赋值的,并且是在块语句结束时,同时更新


左边的变量后一起结束的。



比如下面的程序:



initial


begin



A=1;


//


非阻塞赋值语句


S3



B=1;


//


非阻塞赋值语句


S4


end


中包含了两条非阻塞赋值语句


S3


和


S4


,我们假设


initial


块是在仿真时刻


0

得到执行的。语句


S3


首先得


到执 行,但是对被赋值对象


A


的赋值操作要等到当前时间步结束时(


initial


块结束时)才执行,同时


因为


S3


是一条非阻塞赋值语句,所以


S3


不会阻塞


S4


的执行,于是


S4


也随即开始执行,但对被赋值变


量


B


的赋值操作也要等到当前时间步结束时(


initial


块结束时)才执行。所以,在当前时间步结束时


(


initial


块结束时)被赋值变量


A


和


B


同时被赋值为


1


。



3.


阻塞赋值与非阻塞赋值的仿真




利用内部时间控制方式,可以对阻塞赋值和非阻塞赋值进行延 时,这样就可以从程序执行的时


间上清楚的看到阻塞赋值与非阻塞赋值的执行过程。



3.1


带有内延时的阻塞赋值语句执行过 程




module block_test;



reg a;



initial begin



a=0;



//


语句


1



a= #5 1;



//


语句


2



a= #10 0;


//


语句


3



a= #15 1;


//


语句


4



end



endmodule



在这个程序中,使用了带有内部延时的阻塞赋值语句,该模块 的仿真输出波形如图


1


所示。



1ns


5ns


10ns


15ns


20ns


25ns


30ns


35ns


40ns


45ns

< p>
50ns


a


1


0



图


1



带内延时的阻塞赋值仿真输出波形




该程序模块内的阻塞赋值语句将依次得到执行,并且在前一条语句所指定的赋值操作没有 完成


之前,下一条语句被阻塞而不能得到执行。如图


1


所示:语句


1


在


t=0 ns


时刻开始执行,


a


被赋值为


0


;


语句


2


也是在


t=0ns


时刻开始执行(前一条赋值语 句执行时所需要的时间可以忽略不计)


,延时


5ns

< p>
后,


即


t=5ns


时,< /p>


a


被赋值为


1


; 语句


3


在


t=5ns

< br>时刻开始执行,延时


10ns


后,即

t=15ns


时,


a


被赋值为


0


;语句


4


在


t=15ns


时刻开始执行,延时


15ns


后,即


t=30ns


时,


a


被赋值为


1


。由此得出, 阻塞赋值语句的执行,


是从前一条阻塞赋值语句执行完成后才开始的。

< br>


3.1


带有内延时的非阻塞赋值语句执行过程




module block_test;



reg a;



initial begin



a<=0;




//


语句


1



a<= #5 1;



//


语句


2



2

-


-


-


-


-


-


-


-