Verilog_HDL中阻塞赋值与非阻塞赋值的区别与应用
-
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
时,
p>
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
的执行,于是
p>
S4
也随即开始执行,但对被赋值变
量
p>
B
的赋值操作也要等到当前时间步结束时(
initial
块结束时)才执行。所以,在当前时间步结束时
(
initial
块结束时)被赋值变量
A
和
B
同时被赋值为
1
。
3.
阻塞赋值与非阻塞赋值的仿真
利用内部时间控制方式,可以对阻塞赋值和非阻塞赋值进行延
时,这样就可以从程序执行的时
间上清楚的看到阻塞赋值与非阻塞赋值的执行过程。
p>
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
50ns
a
1
0
图
1
带内延时的阻塞赋值仿真输出波形
该程序模块内的阻塞赋值语句将依次得到执行,并且在前一条语句所指定的赋值操作没有
完成
之前,下一条语句被阻塞而不能得到执行。如图
1
所示:语句
1
在
t=0
ns
时刻开始执行,
a
被赋值为
0
;
语句
2
也是在
t=0ns
时刻开始执行(前一条赋值语
句执行时所需要的时间可以忽略不计)
,延时
5ns
后,
即
t=5ns
时,<
/p>
a
被赋值为
1
;
语句
3
在
t=5ns
< br>时刻开始执行,延时
10ns
后,即
t=15ns
时,
a
被赋值为
p>
0
;语句
4
在
p>
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