欢迎来到EDA中国!
当前位置:网站首页 >资源共享 > FPGA

Verilog HDL语言教程第八章--行为建模

  • 415k
  • pdf
  •  
  •  
  • 下载
  • 2013-04-26
  • 软件简介
8.1 过程结构
下述两种语句是为一个设计的行为建模的主要机制。
1) initial 语句
2) always语句
一个模块中可以包含任意多个i n i t i a l或a l w a y s语句。这些语句相互并行执行,即这些语句
的执行顺序与其在模块中的顺序无关。一个i n i t i a l语句或a l w a y s语句的执行产生一个单独的控
制流,所有的i n i t i a l和a l w a y s语句在0时刻开始并行执行。
8.1.1 initial 语句
initial 语句只执行一次。initial 语句在模拟开始时执行,即在0时刻开始执行。initial 语句
的语法如下:
i n i t i a l
[t i m i n g c o n t r o l] p r o c e d u r a l s t a t e m e n t
p r o c e d u r a l s t a t e m e n t是下列语句之一:
p r o c e d u r a l a s s i g n m e n t(blocking or non-blockin)g / /阻塞或非阻塞性过程赋值语句/ /
p r o c e d u r a l c o n t i n u o u s a s s i g n m e n t
c o n d i t i o n a l s t a t e m e n t
c a s e s t a t e m e n t
l o o p s t a t e m e n t
w a i t s t a t e m e n t
d i s a b l e s t a t e m e n t
e v e n t t r i g g e r
s e q u e n t i a l b l o c k
p a r a l l e l b l o c k
task_enable (user or system)
顺序过程( b e g i n . . . e n d )最常使用在进程语句中。这里的时序控制可以是时延控制,即等待
一个确定的时间;或事件控制,即等待确定的事件发生或某一特定的条件为真。i n i t i a l语句的
各个进程语句仅执行一次。注意i n i t i a l语句在模拟的0时刻开始执行。i n i t i a l语句根据进程语句
中出现的时间控制在以后的某个时间完成执行。
下面是i n i t i a l语句实例。
r e g Y u r t;
. . .
i n i t i a l
Y u r t = 2;
上述i n i t i a l语句中包含无时延控制的过程赋值语句。i n i t i a l语句在0时刻执行,促使Yu rt在0
时刻被赋值为2。下例是一个带有时延控制的i n i t i a l语句。
r e g C u r t;
. . .
i n i t i a l
#2 C u r t = 1;
寄存器变量C u rt在时刻2被赋值为1。i n i t i a l语句在0时刻开始执行,在时刻2完成执行。
下例为带有顺序过程的i n i t i a l语句。
p a r a m e t e r S I Z E = 1024;
r e g [7:0] R A M [ 0 :S I Z E- 1 ] ;
r e g R i b R e g;
i n i t i a l
b e g i n: S E Q B L K A
i n t e g e r I n d e x;
R i b R e g = 0;
f o r (I n d e x = 0; I n d e x < S I Z E; I n d e x = I n d e x + 1)
R A M [I n d e x] = 0;
e n d
顺序过程由关键词b e g i n . . . e n d定界,它包含顺序执行的进程语句,与C语言等高级编程语
言相似。S E Q _ B L K _ A是顺序过程的标记;如果过程中没有局部说明部分,不要求这一标记。
例如,如果对I n d e x的说明部分在i n i t i a l语句之外,可不需要标记。整数型变量I n d e x已在过程
中声明。并且,顺序过程包含1个带循环语句的过程性赋值。这一i n i t i a l语句在执行时将所有
的内存初始化为0。
下例是另一个带有顺序过程的i n i t i a l语句。在此例中,顺序过程包含时延控制的过程性赋
值语句。
/ /波形生成:
p a r a m e t e r A P P L Y D E L A Y = 5;
r e g[ 0 : 7 ]p o r t A;
. . .
i n i t i a l
b e g i n
P o r t A = ' h 2 0 ;
#APPLY_DELAY Port_A= 'hF2;
#APPLY_DELAY Port_A= 'h41;
#APPLY_DELAY Port_A= 'h0A;
e n d
执行时,P o rt A的值如图8 - 1所示。
图8-1 使用initial语句产生的波形
如上面举例所示,I n i t i a l语句主要用于初始化和波形生成。
60 Verilog HDL 硬件描述语言
下载
8.1.2 always语句
与i n i t i a l语句相反, a l w a y s语句重复执行。与i n i t i a l语句类似, a l w a y s语句语法如下:
a l w a y s
[t i m i n g c o n t r o l] p r o c e d u r a l s t a t e m e n t
过程语句和时延控制(时序控制)的描述方式与上节相同。
例如:
always
C l k = ~ C l k;
/ /将无限循环。
此a l w a y s语句有一个过程性赋值。因为a l w a y s语句重复执行,并且在此例中没有时延控制,
过程语句将在0时刻无限循环。因此, a l w a y s语句的执行必须带有某种时序控制,如下例的
a l w a y s语句,形式上与上面的实例相同,但带有时延控制。
always
#5 C l k = ~ C l k;
/ /产生时钟周期为1 0的波形。
此a l w a y s语句执行时产生周期为1 0个时间单位的波形。
下例是由事件控制的顺序过程的a l w a y s语句。
r e g [0:5] I n s t r R e g;
r e g [3:0] A c c u m;
w i r e E x e c u t e C y c l e;
a l w a y s
@ (E c e c u t e C y c l e)
b e g i n
c a s e(I n s t r R e g[ 0 : 1 ] )
2'b00: S t o r e (Accum, InstrReg[ 2 : 5 ] ) ;
2'b11: L o a d (Accum, InstrReg[ 2 : 5 ] ) ;
2'b01: J u m p (I n s t r R e g[ 2 : 5 ] ) ;
2 ' b 1 0 : ;
e n d c a s e
e n d
/ /S t o r e、L o a d和J u m p是在别处定义的用户自定义的任务。
顺序过程( b e g i n . . . e n d )中的语句按顺序执行。这个a l w a y s语句意味着只要有事件发生,即
只要发生变化,E x e c u t e C y c l e就执行顺序过程中的语句;顺序过程的执行意味着按顺序执行过
程中的各个语句。
下例为带异步预置的负边沿触发的D触发器的行为模型。
m o d u l e D F F(Clk, D, Set, Q, Qba)r ;
i n p u t Clk, D, Set;
o u t p u t Q, Qbar;
r e g Q, Qbar;
a l w a y s
w a i t (S e t == 1)
b e g i n
#3 Q = 1;
#2 Q b a r = 0;
第8章行为建模61
下载
w a i t (S e t == 0);
e n d
a l w a y s
@ (n e g e d g e C l k)
b e g i n
if (S e t != 1)
b e g i n
#5 Q = D;
#1 Q b a r = ~ Q;
e n d
e n d
e n d m o d u l e
此模型中有2条a l w a y s语句。第一条a l w a y s语句中顺序过程的执行由电平敏感事件控制。
第二条a l w a y s语句中顺序过程的执行由边沿触发的事件控制。
8.1.3 两类语句在模块中的使用
一个模块可以包含多条a l w a y s语句和多条i n i t i a l语句。每条语句启动一个单独的控制流。
各语句在0时刻开始并行执行。
下例中含有1条i n i t i a l语句和2条a l w a y s语句。
m o d u l e T e s t X o r B e h a v i o r;
r e g Sa, Sb, Zeus;
i n i t i a l
b e g i n
S a = 0;
S b = 0;
#5 S b = 1;
#5 S a = 1;
#5 S b = 0;
e n d
a l w a y s
@ (Sa or Sb) Zeus = Sa ^ Sb;
a l w a y s
@ (Z e u s)
$d i s p l a y ( "At time %t, S a = %d, S b = %d, Z e u s = %b",
$t i m e, S a, S b, Z e u s) ;
e n d m o d u l e
模块中的3条语句并行执行,其在模块中的书写次序并不重要。i n i t i a l语句执行时促使顺
序过程中的第一条语句执行,即S a赋值为0;下一条语句在0时延后立即执行。i n i t i a l语句中的
第3行表示“等待5个时间单位”。这样S b在5个时间单位后被赋值为1,S a在另外5个时间单位
后被赋值为0。执行顺序过程最后一条语句后, i n i t i a l语句被永远挂起。
第一条a l w a y s语句等待S a或S b上的事件发生。只要有事件发生,就执行a l w a y s语句内的语
句,然后a l w a y s语句重新等待发生在S a或S b上的事件。注意根据i n i t i a l语句对S a和S b的赋值,
a l w a y s语句将在第0、5、1 0和1 5个时间单位时执行。
62 Verilog HDL 硬件描述语言
下载
同样,只要有事件发生在Z e u s上,就执行第2条a l w a y s语
句。在这种情况下,系统任务$ d i s p l a y被执行,然后a l w a y s
语句重新等待发生在Z e u s上的事件。S a、S b和Z e u s上产生的
波形如图8 - 2所示。下面是模块模拟运行产生的输出。
在时刻5, Sa = 0, Sb = 1, Zeus = 1
在时刻10, Sa = 1, Sb = 1, Zeus = 0
在时刻15, Sa = 1, Sb = 0, Zeus = 1
8.2 时序控制
时序控制与过程语句关联。有2种时序控制形式:
1) 时延控制
2) 事件控制
8.2.1 时延控制
时延控制形式如下:
#delay procedural_statement
实例如下;
#2 Tx = R x- 5 ;
时延控制定义为执行过程中首次遇到该语句与该语句的执行的时间间隔。时延控制表示
在语句执行前的“等待时延”。上面的例子中,过程赋值语句在碰到该语句后的2个时间单位
执行,然后执行赋值。
另一实例如下:
i n i t i a l
b e g i n
#3 W a v e = 'b0111;
#6 W a v e = 'b1100;
#7 W a v e = 'b0000;
e n d
i n i t i a l语句在0时刻执行。首先,等待3个时间单位执行第一个赋值,然后等待6个时间单
位,执行第2个语句;再等待7个时间单位,执行第3个语句;然后永远挂起。
时延控制也可以用另一种形式定义:
#d e l a y;
这一语句促使在下一条语句执行前等待给定的时延。下面是这种用法的实例。
parameter O N D E L A Y = 3, O F F D E L A Y = 5;
a l w a y s
b e g i n
# O N D E L A Y; //等待O N D E L A Y规定的时延。
R e f C l k = 0;
# O F F D E L A Y; //等待O F F D E L A Y规定的时延。
R e f C l k = 1;
e n d
时延控制中的时延可以是任意表达式,即不必限定为某一常量,见下面的例子。
# Strobe
Compare = TX^a s k ;
第8章行为建模63
下载
图8-2 Sa、Sb和Zeus上产生的波形
#(P E R I O D / 2)
Clock = ~C l o c k
如果时延表达式的值为0,则称之为显式零时延。
#0; //显式零时延。
显式零时延促发一个等待,等待所有其它在当前模拟时间被执行的事件执行完毕后,才
将其唤醒;模拟时间不前进。
如果时延表达式的值为x或z,其与零时延等效。如果时延表达式计算结果为负值,那么其
二进制的补码值被作为时延,这一点在使用时务请注意。
8.2.2 事件控制
在事件控制中,a l w a y s的过程语句基于事件执行。有两种类型的事件控制方式:
1) 边沿触发事件控制
2) 电平敏感事件控制
1. 边沿触发事件控制
边沿触发事件控制如下:
@ event procedural_statement
如下例所示:
@ (p o s e d g e C l o c k)
C u r r S t a t e = N e x t S t a t e;
带有事件控制的进程或过程语句的执行,须等到指定事件发生。上例中,如果C l o c k信号从低
电平变为高电平(正沿),就执行赋值语句;否则进程被挂起,直到C l o c k信号产生下一个正跳边沿。
下面是进一步的实例。
@ (n e g e d g e R e s e t) C o u n t = 0;
@C l a
Z o o = F o o;
在第一条语句中,赋值语句只在R e s e t上的负沿执行。第二条语句中,当C l a上有事件发生
时,F o o的值被赋给Z o o,即等待C l a上发生事件;当C l a的值发生变化时,F o o的值被赋给Z o o。
也可使用如下形式:
@ e v e n t ;
该语句促发一个等待,直到指定的事件发生。下面是确定时钟在周期的i n i t i a l语句中使用
的一个例子。
t i m e RiseEdge, OnDelay;
i n i t i a l
b e g i n
/ /等待,直到在时钟上发生正边沿:
@ (p o s e d g e C l o c k A) ;
R i s e E d g e = $t i m e;
/ /等待,直到在时钟上发生负边沿:
@ (n e g e d g e C l o c k A) ;
O n D e l a y = $t i m e - R i s e E d g e;
$d i s p l a y ("The on-period of clock is %t."D, e l a y) ;
e n d
事件之间也能够相或以表明“如果有任何事件发生”。下例将对此进行说明。
@ (p o s e d g e C l e a r or negedge R e s e t)
64 Verilog HDL 硬件描述语言
下载
Q = 0;
@ (Ctrl_A o r C t r l B)
D b u s = 'b z;
注意关键字o r并不意味着在1个表达式中的逻辑或。
在Verilog HDL中p o s e d g e和n e g e d g e是表示正沿和负沿的关键字。信号的负沿是下述转换
的一种:
1 -> x
1 -> z
1 -> 0
x -> 0
z -> 0
正沿是下述转换的一种:
0 -> x
0 -> z
0 -> 1
x -> 1
z -> 1
2. 电平敏感事件控制
在电平敏感事件控制中,进程语句或进程中的过程语句一直延迟到条件变为真后才执行。
电平敏感事件控制以如下形式给出:
w a i t (C o n d i t i o n)
p r o c e d u r a l s t a t e m e n t
过程语句只有在条件为真时才执行,否则过程语句一直等待到条件为真。如果执行到该
语句时条件已经为真,那么过程语句立即执行。在上面的表示形式中,过程语句是可选的。
例如:
w a i t (S u m > 22)
S u m = 0;
w a i t (D a t a R e a d y)
D a t a = B u s;
w a i t (P r e s e t) ;
在第一条语句中,只有当S u m的值大于2 2时,才对S u m清0。在第二条语句中,只有当
D a t a R e a d y为真,即D a t a R e a d y值为1时,将B u s赋给D a t a。最后一条语句表示延迟至P re s e t变
为真(值为1)时,其后续语句方可继续执行。
8.3 语句块
语句块提供将两条或更多条语句组合成语法结构上相当于一条语句的机制。在Ve r i l o g
H D L中有两类语句块,即:
1) 顺序语句块(b e g i n . . . e n d):语句块中的语句按给定次序顺序执行。
2) 并行语句块(f o r k . . . j o i n):语句块中的语句并行执行。
语句块的标识符是可选的,如果有标识符,寄存器变量可在语句块内部声明。带标识符
的语句块可被引用;例如,语句块可使用禁止语句来禁止执行。此外,语句块标识符提供唯
一标识寄存器的一种方式。但是,要注意所有的寄存器均是静态的,即它们的值在整个模拟
第8章行为建模65
下载
运行中不变。
8.3.1 顺序语句块
顺序语句块中的语句按顺序方式执行。每条语句中的时延值与其前面的语句执行的模拟
时间相关。一旦顺序语句块执行结束,跟随顺序语句块过程的下一条语句继续执行。顺序语
句块的语法如下:
b e g i n
[ :b l o c k i d{d e c l a r a t i o n s} ]
p r o c e d u r a l s t a t e m e n t ( s )
e n d
例如:
/ /产生波形:
b e g i n
#2 S t r e a m = 1;
#5 S t r e a m = 0;
#3 S t r e a m = 1;
#4 S t r e a m = 0;
#2 S t r e a m = 1;
#5 S t r e a m = 0;
e n d
假定顺序语句块在第1 0个时间单位开始执行。两个时间单位后第1条语句执行,即第1 2个
时间单位。此执行完成后,下1条语句在第1 7个时间单位执行(延迟5个时间单位)。然后下1条
语句在第2 0个时间单位执行,以此类推。该顺序语句块执行过程中产生的波形如图8 - 3所示。
图8-3 顺序语句块中的累积时延
下面是顺序过程的另一实例。
b e g i n
P a t = M a s k | M a t;
@ (n e g e d g e C l k) ;
F F = & P a t
e n d
在该例中,第1条语句首先执行,然后执行第2条语句。当然,第2条语句中的赋值只有在
C l k上出现负沿时才执行。下面是顺序过程的另一实例。
b e g i n: S E Q B L K
r e g[0:3] S a t ;
S a t = Mask & Data;
F F = ^S a t;
e n d
在这一实例中,顺序语句块带有标记S E Q B L K,并且有一个局部寄存器说明。在执行时,
首先执行第1条语句,然后执行第2条语句。
66 Verilog HDL 硬件描述语言
下载
8.3.2 并行语句块
并行语句块带有定界符f o r k和j o i n(顺序语句块带有定界符b e g i n和e n d),并行语句块中的
各语句并行执行。并行语句块内的各条语句指定的时延值都与语句块开始执行的时间相关。
当并行语句块中最后的动作执行完成时(最后的动作并不一定是最后的语句),顺序语句块的语
句继续执行。换一种说法就是并行语句块内的所有语句必须在控制转出语句块前完成执行。
并行语句块语法如下:
f o r k
[ :b l o c k i d{d e c l a r a t i o n s} ]
p r o c e d u r a l s t a t e m e n t(s) ;
j o i n
例如:
// 生成波形:
f o r k
#2 S t r e a m = 1;
#7 S t r e a m = 0;
#10 S t r e a m = 1;
#14 S t r e a m = 0;
#16 S t r e a m = 1;
#21 S t r e a m = 0;
j o i n
如果并行语句块在第1 0个时间单位开始执行,所有的语句并行执行并且所有的时延都是
相对于时刻1 0的。例如,第3个赋值在第2 0个时间单位执行,并在第2 6个时间单位执行第5个
赋值,以此类推。其产生的波形如图8 - 4所示。
图8-4 并行语句块中的相对时延
下例混合使用了顺序语句块和并行语句块,以强调两者的不同之处。
a l w a y s
b e g i n:S E Q A
#4 D r y = 5; // S1
f o r k: P A R A / / S 2
#6 C u n = 7; //P1
b e g i n: S E Q B / / P 2
E X E = B o x; //S6
#5 J a p = E x e; //S7
e n d
#2 D o p = 3; //P3
#4 G o s = 2; //P4
#8 P a s = 4; //P5
j o i n
第8章行为建模67
下载
#8 B a x = 1; //S3
#2 Z o o m = 52; //S4
#6 $s t o p; //S5
e n d
a l w a y s语句中包含顺序语句块S E Q_A,并且顺序语句块内的所有语句( S 1、S 2、S 3、S 4和
S 5 )顺序执行。因为a l w a y s语句在0时刻执行,D ry在第4个时间单位被赋值为5,并且并行语句
块PA R A在第4个时间单位开始执行。并行语句块中的所有语句( P 1、P 2、P 3、P 4和P 5 )在第4
个时间单位并行执行。这样C u n在第1 0个时间单位被赋值, D o p在第6个时间单位被赋值, G o s
在第8个时间单位被赋值, P a s在第1 2个时间单位被赋值。顺序语句块S E Q B在第4个时间单位
开始执行,并导致该顺序块中的语句S 6、S 7依次被执行; J a p在时间单位9被赋于新值。因为
并行语句块PA R A中的所有语句在第1 2个时间单位完成执行,语句S 3在第1 2个时间单位被执
行,在第2 0个时间单位B a x被赋值,然后语句S 4执行,在第2 2个时间单位Z o o m被赋值,然后
执行下一语句。最终在第2 8个时间单位执行系统任务$ s t o p。a l w a y s语句执行时发生的事件如
图8 - 5所示。
图8-5 顺序语句块和并行语句块混合使用时的时延
8.4 过程性赋值
过程性赋值是在i n i t i a l语句或a l w a y s语句内的赋值,它只能对寄存器数据类型的变量赋值。
表达式的右端可以是任何表达式。例如:
r e g[1:4] E n a b l e , A , B;
. . .
#5 E n a b l e = ~A ^ ~B;
E n a b l e为寄存器。根据时延控制,赋值语句被延迟5个时间单位执行。右端表达式被计算,
并赋值给E n a b l e。
过程性赋值与其周围的语句顺序执行。a l w a y s语句实例如下:
a l w a y s
@ (A o r B o r C o r D)
b e g i n:A O I
r e g T e m p 1 , T e m p 2;
Temp1 = A & B;
Temp2 = C & D;
Temp1 = Temp1 | T e m p 2 ;
68 Verilog HDL 硬件描述语言
下载
Z
关键字 : 行为建模 HDL Verilog 语言 
获取帮助