下载第 4章 表 达 式本章讲述在 Verilog HDL中编写表达式的基础。
表达式由操作数和操作符组成。表达式可以在出现数值的任何地方使用。
4.1 操作数操作数可以是以下类型中的一种:
1) 常数
2) 参数
3) 线网
4) 寄存器
5) 位选择
6) 部分选择
7) 存储器单元
8) 函数调用
4.1.1 常数前面的章节已讲述了如何书写常量。下面是一些实例。
256,7 //非定长的十进制数。
4'b10_11,8'h0A //定长的整型常量。
'b1,'hFBA //非定长的整数常量。
90.00006 //实数型常量。
"BOND" //串常量;每个字符作为 8位 A S C I I值存储。
表达式中的整数值可被解释为有符号数或无符号数。如果表达式中是十进制整数,例如,
1 2被解释为有符号数。如果整数是基数型整数(定长或非定长),那么该整数作为无符号数对待。下面举例说明。
1 2是 0 1 1 0 0的 5位向量形式(有符号)
- 1 2是 1 0 1 0 0的 5位向量形式(有符号)
5 ' b 0 1 1 0 0是十进制数 1 2(无符号)
5 ' b 1 0 1 0 0是十进制数 2 0(无符号)
4 ' d 1 2是十进制数 1 2(无符号)
更为重要的是对基数表示或非基数表示的负整数处理方式不同。非基数表示形式的负整数作为有符号数处理,而基数表示形式的负整数值作为无符号数。因此- 4 4和- 6'o54 (十进制的 4 4等于八进制的 5 4)在下例中处理不同。
i n t e g e r C o n e;
.,,
C o n e = -44/4
C o n e = -6'o54/ 4;
注意- 4 4和- 6 ' o 5 4以相同的位模式求值;但是- 4 4作为有符号数处理,而- 6 ' o 5 4作为无符号数处理。因此第一个字符中 C o n e的值为- 11,而在第二个赋值中 C o n e的值为 1 0 7 3 7 4 1 8 1 3 。
4.1.2 参数前一章中已对参数作了介绍。参数类似于常量,并且使用参数声明进行说明。下面是参数说明实例。
p a r a m e t e r L O A D = 4'd12,S T O R E = 4'd10;
L O A D 和 S TO R E为参数的例子,值分别被声明为 1 2和 1 0。
4.1.3 线网可在表达式中使用标量线网( 1位)和向量线网(多位) 。下面是线网说明实例。
w i r e [0:3] P r t; //P r t 为 4位向量线网。
w i r e B d q; //B b q 是标量线网。
线网中的值被解释为无符号数。在连续赋值语句中,
a s s i g n P r t = -3;
P rt被赋于位向量 11 0 1,实际上为十进制的 1 3。在下面的连续赋值中,
a s s i g n P r t = 4'HA;
P rt被赋于位向量 1 0 1 0,即为十进制的 1 0。
4.1.4 寄存器标量和向量寄存器可在表达式中使用。寄存器变量使用寄存器声明进行说明。例如,
i n t e g e r TemA,TemB;
r e g [1:5] S t a t e;
t i m e Q u e [ 1,5 ] ;
整型寄存器中的值被解释为有符号的二进制补码数,而 r e g寄存器或时间寄存器中的值被解释为无符号数。实数和实数时间类型寄存器中的值被解释为有符号浮点数。
TemA = -10; //T e m A值为位向量 1 0 1 1 0,是 1 0的二进制补码。
TemA = 'b1011; //T e m A值为十进制数 1 1。
State = -10; //S t a t e值为位向量 1 0 1 1 0,即十进制数 2 2。
State = 'b1011; //S t a t e值为位向量 0 1 0 1 1,是十进制值 1 1。
4.1.5 位选择位选择从向量中抽取特定的位。形式如下:
n e t _ o r _ r e g _ v e c t o r [b i t _ s e l e c t _ e x p r]
下面是表达式中应用位选择的例子。
S t a t e [1] && S t a t e [4] //寄存器位选择。
P r t [0] | Bbq //线网位选择。
如果选择表达式的值为 x,z,或越界,则位选择的值为 x。例如 S t a t e [x]值为 x。
4.1.6 部分选择在部分选择中,向量的连续序列被选择。形式如下:
第 4章 表 达 式 29下载因为 C o n e 为非定长整型变量,基数表示形式的负数在机内以补码形式出现。 — 译者注
n e t _ o r _ r e g _ v e c t o r [m s b _ c o n s t _ e x p r:1 s b _ c o n s t _ e x p r]
其中范围表达式必须为常数表达式。例如。
S t a t e [1:4] //寄存器部分选择。
P r t [1:3] //线网部分选择。
选择范围越界或为 x,z时,部分选择的值为 x。
4.1.7 存储器单元存储器单元从存储器中选择一个字。形式如下:
m e m o r y [w o r d _ a d d r e s s]
例如:
r e g [1:8] A c k,D r a m [ 0,6 3 ] ;
.,,
A c k = D r a m [60]; //存储器的第 6 0个单元。
不允许对存储器变量值部分选择或位选择。例如,
D r a m [60] [2] 不允许。
D r a m [60] [2:4] 也不允许。
在存储器中读取一个位或部分选择一个字的方法如下:将存储器单元赋值给寄存器变量,然后对该寄存器变量采用部分选择或位选择操作。例如,A c k [2] 和 Ack [ 2,4 ]是合法的表达式。
4.1.8 函数调用表达式中可使用函数调用。函数调用可以是系统函数调用(以 $字符开始)或用户定义的函数调用。例如:
$t i m e + S u m O f E v e n t s (A,B)
/ * $t i m e是系统函数,并且 S u m O f E v e n t s是在别处定义的用户自定义函数。 * /
第 1 0章将详细介绍函数。
4.2 操作符
Verilog HDL中的操作符可以分为下述类型:
1) 算术操作符
2) 关系操作符
3) 相等操作符
4) 逻辑操作符
5) 按位操作符
6) 归约操作符
7) 移位操作符
8) 条件操作符
9) 连接和复制操作符下表显示了所有操作符的优先级和名称。操作符从最高优先级(顶行)到最低优先级
(底行)排列。同一行中的操作符优先级相同。
30 Verilog HDL 硬件描述语言 下载归约操作符为一元操作符,对操作数的各位进行逻辑操作,结果为二进制数。 — 译者除条件操作符从右向左关联外,其余所有操作符自左向右关联。下面的表达式:
A + B - C
等价于:
(A + B ) - C / /自左向右而表达式:
A? B,C? D,F
等价于:
A? B,(C? D,F) //从右向左圆扩号能够用于改变优先级的顺序,如以下表达式:
(A? B,C)? D,F
4.2.1 算术操作符算术操作符有:
+(一元加和二元加)
-(一元减和二元减)
*(乘)
/(除)
%(取模)
整数除法截断任何小数部分。例如:
7/4 结果为 1
取模操作符求出与第一个操作符符号相同的余数。
7%4 结果为 3
而,
- 7%4 结果为 - 3
如果算术操作符中的任意操作数是 X或 Z,那么整个结果为 X。例如:
'b10x1 + 'b01111 结果为不确定数 ' bx x x x x
第 4章 表 达 式 31下载
+ 一元加
- 一元减
! 一元逻辑非
~ 一元按位求反
& 归约与
~ & 归约与非
^ 归约异或
^~ 或 ~ ^ 归约异或非
| 归约或
~ | 归约或非
* 乘
/ 除
% 取模
+ 二元加
_ 二元减
< < 左移
> > 右移
< 小于
< = 小于等于
> 大于
> = 大于等于
= = 逻辑相等
! = 逻辑不等
= = = 全等
! = = 非全等
& 按位与
^ 按位异或
^~ or ~ ^ 按位异或非
| 按位或
& & 逻辑与
| | 逻辑或
,条件操作符
32 Verilog HDL 硬件描述语言 下载
1,算术操作结果的长度算术表达式结果的长度由最长的操作数决定。在赋值语句下,算术操作结果的长度由操作符左端目标长度决定。考虑如下实例:
reg [0:3] Arc,Bar,Crt;
reg [0:5] F r x;
.,,
Arc = B a r + C r t;
F r x = B a r + C r t;
第一个加的结果长度由 B a r,C rt和 A rc长度决定,长度为 4位。第二个加法操作的长度同样由 F rx的长度决定( F rx,B a t和 C rt中的最长长度),长度为 6位。在第一个赋值中,加法操作的溢出部分被丢弃;而在第二个赋值中,任何溢出的位存储在结果位 F r x [ 1 ]中。
在较大的表达式中,中间结果的长度如何确定?在 Verilog HDL中定义了如下规则:表达式中的所有中间结果应取最大操作数的长度(赋值时,此规则也包括左端目标) 。考虑另一个实例:
w i r e [4:1] Box,Drt;
w i r e [1:5] C f g;
w i r e [1:6] P e g;
w i r e [1:8] A d t;
.,,
a s s i g n A d t = (B o x + C f g) + (D r t + P e g) ;
表达式左端的操作数最长为 6,但是将左端包含在内时,最大长度为 8。所以所有的加操作使用 8位进行。例如,B o x和 C f g相加的结果长度为 8位。
2,无符号数和有符号数执行算术操作和赋值时,注意哪些操作数为无符号数、哪些操作数为有符号数非常重要。
无符号数存储在:
线网
一般寄存器
基数格式表示形式的整数有符号数存储在:
整数寄存器
十进制形式的整数下面是一些赋值语句的实例:
r e g [0:5] B a r;
i n t e g e r T a b;
.,,
B a r = -4'd12; //寄存器变量 B a r的十进制数为 5 2,向量值为 1 1 0 1 0 0。
T a b = -4'd12; //整数 T a b的十进制数为 - 1 2,位形式为 1 1 0 1 0 0。
-4'd12 / 4 //结果是 1 0 7 3 7 4 1 8 2 1。
-12 / 4 //结果是 - 3
因为 B a r是普通寄存器类型变量,只存储无符号数。右端表达式的值为 ' b 11 0 1 0 0( 1 2的二进制补码) 。因此在赋值后,B a r存储十进制值 5 2。在第二个赋值中,右端表达式相同,值为
' b 11 0 1 0 0,但此时被赋值为存储有符号数的整数寄存器。 Ta b存储十进制值- 1 2(位向量为
11 0 1 0 0) 。注意在两种情况下,位向量存储内容都相同;但是在第一种情况下,向量被解释为无符号数,而在第二种情况下,向量被解释为有符号数。
下面为具体实例:
B a r = - 4'd12/4;
T a b = - 4'd12 /4;
B a r = - 12/4
T a b = - 12/4
在第一次赋值中,B a r被赋于十进制值 6 1(位向量为 1111 0 1) 。而在第二个赋值中,Ta b被赋于与十进制 1 0 7 3 7 4 1 8 2 1(位值为 0 0 11,,,111 0 1) 。 B a r在第三个赋值中赋于与第一个赋值相同的值。这是因为 B a r只存储无符号数。在第四个赋值中,B a r被赋于十进制值- 3。
下面是另一些例子:
B a r = 4 - 6;
T a b = 4 - 6;
B a r被赋于十进制值 6 2(- 2的二进制补码),而 Ta b被赋于十进制值- 2(位向量为 11111 0) 。
下面为另一个实例:
B a r = -2 + (-4);
T a b = -2 + (-4);
B a r被赋于十进制值 5 8(位向量为 111 0 1 0),而 Ta b被赋于十进制值- 6(位向量为 111 0 1 0) 。
4.2.2 关系操作符关系操作符有:
>(大于)
<(小于)
>=(不小于)
<=(不大于)
关系操作符的结果为真( 1)或假( 0) 。如果操作数中有一位为 X或 Z,那么结果为 X。例如:
23 > 45
结果为假( 0),而:
52< 8'hxFF
结果为 x。如果操作数长度不同,长度较短的操作数在最重要的位方向(左方)添 0补齐。例如:
'b1000 > = 'b01110
等价于:
'b01000 > = 'b01110
结果为假( 0) 。
4.2.3 相等关系操作符相等关系操作符有,
= =(逻辑相等)
!=(逻辑不等)
第 4章 表 达 式 33下载
= = =(全等)
!= =(非全等)
如果比较结果为假,则结果为 0;否则结果为 1。在全等比较中,值 x和 z严格按位比较。
也就是说,不进行解释,并且结果一定可知。而在逻辑比较中,值 x和 z具有通常的意义,且结果可以不为 x。也就是说,在逻辑比较中,如果两个操作数之一包含 x或 z,结果为未知的值( x) 。
如下例,假定:
D a t a = 'b11x0;
A d d r = 'b11x0;
那么:
D a t a = = A d d r
不定,也就是说值为 x,但:
D a t a = = = A d d r
为真,也就是说值为 1。
如果操作数的长度不相等,长度较小的操作数在左侧添 0补位,例如:
2'b10 = = 4'b0010
与下面的表达式相同:
4'b0010 = = 4'b0010
结果为真( 1) 。
4.2.4 逻辑操作符逻辑操作符有,
&& (逻辑与 )
|| (逻辑或 )
! (逻辑非 )
这些操作符在逻辑值 0或 1上操作。逻辑操作的结构为 0或 1。例如,假定,
C r d = 'b0; //0为假
Dgs = 'b1; //1为真那么,
C r d && D g s 结果为 0 (假 )
C r d || D g s 结果为 1 (真 )
! D g s 结果为 0 (假 )
对于向量操作,非0向量作为1处理。例如,假定:
A _ B u s = 'b0110;
B _ B u s = 'b0100;
那么,
A _ B u s || B _ B u s 结果为 1
A _ B u s && B _ B u s 结果为 1
并且,
! A _ B u s 与 ! B _ B u s的结果相同。
结果为0。
如果任意一个操作数包含 x,结果也为 x。
34 Verilog HDL 硬件描述语言 下载
!x 结果为 x
4.2.5 按位操作符按位操作符有,
~(一元非)
&(二元与)
|(二元或)
^(二元异或)
~^,^~(二元异或非)
这些操作符在输入操作数的对应位上按位操作,并产生向量结果。下表显示对于不同操作符按步操作的结果。
例如,假定,
A = 'b0110;
B = 'b0100;
那么,
A | B 结果为 0 1 1 0
A & B 结果为 0 1 0 0
如果操作数长度不相等,长度较小的操作数在最左侧添 0补位。例如,
'b0110 ^ 'b10000
与如下式的操作相同,
'b00110 ^ 'b10000
结果为 ' b 1 0 11 0。
第 4章 表 达 式 35下载与 或异或 异或非非
4.2.6 归约操作符归约操作符在单一操作数的所有位上操作,并产生 1位结果。归约操作符有,
& (归约与 )
如果存在位值为0,那么结果为0;若如果存在位值为 x或 z,结果为 x;否则结果为1。
~& (归约与非 )
与归约操作符 &相反。
| (归约或 )
如果存在位值为1,那么结果为1;如果存在位 x或 z,结果为 x;否则结果为0。
~| (归约或非 )
与归约操作符 |相反。
^ (归约异或 )
如果存在位值为 x或 z,那么结果为 x;否则如果操作数中有偶数个 1,结果为 0;否则结果为 1。
~^ (归约异或非 )
与归约操作符 ^正好相反。
如下所示。假定,
A = 'b0110;
B = 'b0100;
那么,
|B 结果为 1
& B 结果为 0
~ A 结果为 1
归约异或操作符用于决定向量中是否有位为 x。假定,
M y R e g = 4'b01x0;
那么,
^M y R e g 结果为 x
上述功能使用如下的 i f语句检测,
i f ( ^M y R e g = = = 1'bx)
$ d i s p l a y ("There is an unknown in the vector MyReg !")
注意逻辑相等 ( = = )操作符不能用于比较;逻辑相等操作符比较将只会产生结果 x。全等操作符期望的结果为值1。
4.2.7 移位操作符移位操作符有,
<< (左移 )
>> (右移 )
移位操作符左侧操作数移动右侧操作数表示的次数,它是一个逻辑移位。空闲位添 0补位。
如果右侧操作数的值为 x或 z,移位操作的结果为 x。假定,
r e g [ 0,7] Q r e g;
.,,
Q r e g = 4'b0111;
36 Verilog HDL 硬件描述语言 下载那么,
Q r e g >> 2 是 8 ' b 0 0 0 0 _ 0 0 0 1
Verilog HDL中没有指数操作符。但是,移位操作符可用于支持部分指数操作。例如,如果要计算Z N u m B i t s的值,可以使用移位操作实现,例如:
32'b1 << N u m B i t s / /N u m B i t s必须小于 3 2。
同理,可使用移位操作为 2 - 4解码器建模,如
w i r e [0:3] D e c o d e O u t = 4'b1 << A d d r e s s [ 0,1 ] ;
A d d re s s[0:1] 可取值 0,1,2和 3。与之相应,D e c o d e O u t可以取值 4 ' b 0 0 0 1,4 ' b 0 0 1 0,4 ' b 0 1 0 0
和 4 ' b 1 0 0 0,从而为解码器建模。
4.2.8 条件操作符条件操作符根据条件表达式的值选择表达式,形式如下,
c o n d_e x p r? e x p r 1,e x p r 2
如果 c o n d _ e x p r 为真 (即值为 1 ),选择 e x p r 1;如果 c o n d _ e x p r为假 (值为 0 ),选择 e x p r 2。 如果 c o n d _ e x p r 为 x或 z,结果将是按以下逻辑 e x p r 1和 e x p r 2按位操作的值,0与 0得 0,1与 1得 1,
其余情况为 x。
如下所示,
w i r e [0:2] S t u d e n t = M a r k s > 18? G r a d e _ A,G r a d e _ C;
计算表达式 M a r k s > 18; 如果真,G r a d e _ A 赋值为 S t u d e n t; 如果 M a r k s < =18,G r a d e _ C 赋值为 S t u d e n t。下面为另一实例:
a l w a y s
#5 C t r = (C t r != 25)? (C t r + 1),5;
过程赋值中的表达式表明如果 C t r不等于 25,则加 1;否则如果 C t r值为 2 5时,将 C t r值重新置为 5。
4.2.9 连接和复制操作连接操作是将小表达式合并形成大表达式的操作。形式如下,
{e x p r 1,e x p r 2,.,,,e x p r N}
实例如下所示,
w i r e [7:0] D b u s;
w i r e [11:0] A b u s;
a s s i g n D b u s [7:4] = {D b u s [0],D b u s [1],D b u s[2],D b u s[ 3 ] } ;
/ /以反转的顺序将低端 4位赋给高端 4位。
a s s i g n D b u s = {Dbus [3:0],D b u s [ 7,4 ] } ;
/ /高 4位与低 4位交换。
由于非定长常数的长度未知,不允许连接非定长常数。例如,下列式子非法:
{D b u s,5} / /不允许连接操作非定长常数。
复制通过指定重复次数来执行操作。形式如下,
{r e p e t i t i o n _ n u m b e r {expr1,expr2,...,exprN} }
以下是一些实例:
A b u s = {3{4'b1011}}; //位向量 1 2 ' b 1 0 1 1 _ 1 0 1 1 _ 1 0 1 1)
A b u s = {{4{D b u s[7]}},D b u s}; /*符号扩展 */
第 4章 表 达 式 37下载
{3{1'b1}} 结果为 1 1 1
{3{Ack}} 结果与 {A c k,A c k,A c k}相同。
4.3 表达式种类常量表达式是在编译时就计算出常数值的表达式。通常,常量表达式可由下列要素构成,
1) 表示常量文字,如 ' b 1 0和 3 2 6。
2) 参数名,如 R E D的参数表明,
p a r a m e t e r R E D = 4'b1110;
标量表达式是计算结果为 1位的表达式。如果希望产生标量结果,但是表达式产生的结果为向量,则最终结果为向量最右侧的位值。
习题
1,说明参数 G AT E _ D E L AY,参数值为 5。
2,假定长度为 6 4个字的存储器,每个字 8位,编写 Verilog 代码,按逆序交换存储器的内容。即将第 0个字与第 6 3个字交换,第 1个字与第 6 2个字交换,依此类推。
3,假定 3 2位总线 A d d re s s _ B u s,编写一个表达式,计算从第 11位到第 2 0位的归约与非。
4,假定一条总线 C o n t ro l _ B u s [ 1 5,0 ],编写赋值语句将总线分为两条总线,A b u s [ 0,9 ]和 B b u s
[ 6,1 ]。
5,编写一个表达式,执行算术移位,将 Qparity 中包含的 8位有符号数算术移位。
6,使用条件操作符,编写赋值语句选择 N e x t S t a t e的值。如果 C u rre n t S t a t e的值为 R E S E T,那么
N e x t S t a t e的值为 G O;如果 C u rre n t S t a t e的值为 G O,则 N e x t S t a t e 的值为 B U S Y;如果
C u rre n t S t a t e的值为 B U S Y;则 N e x t S t a t e的值为 R E S E T。
7,使用单一连续赋值语句为图 2 - 2所示的 2 - 4解码器电路的行为建模。 [提示:使用移位操作符、
条件操作符和连接操作符。 ]
8,如何从标量变量 A,B,C和 D中产生总线 B u s Q[0:3]? 如何从两条总线 B u s A [ 0,3 ]和 B u s Y
[ 2 0,1 5 ]形成新的总线 B u s R [ 1 0,1 ]?
38 Verilog HDL 硬件描述语言 下载
表达式由操作数和操作符组成。表达式可以在出现数值的任何地方使用。
4.1 操作数操作数可以是以下类型中的一种:
1) 常数
2) 参数
3) 线网
4) 寄存器
5) 位选择
6) 部分选择
7) 存储器单元
8) 函数调用
4.1.1 常数前面的章节已讲述了如何书写常量。下面是一些实例。
256,7 //非定长的十进制数。
4'b10_11,8'h0A //定长的整型常量。
'b1,'hFBA //非定长的整数常量。
90.00006 //实数型常量。
"BOND" //串常量;每个字符作为 8位 A S C I I值存储。
表达式中的整数值可被解释为有符号数或无符号数。如果表达式中是十进制整数,例如,
1 2被解释为有符号数。如果整数是基数型整数(定长或非定长),那么该整数作为无符号数对待。下面举例说明。
1 2是 0 1 1 0 0的 5位向量形式(有符号)
- 1 2是 1 0 1 0 0的 5位向量形式(有符号)
5 ' b 0 1 1 0 0是十进制数 1 2(无符号)
5 ' b 1 0 1 0 0是十进制数 2 0(无符号)
4 ' d 1 2是十进制数 1 2(无符号)
更为重要的是对基数表示或非基数表示的负整数处理方式不同。非基数表示形式的负整数作为有符号数处理,而基数表示形式的负整数值作为无符号数。因此- 4 4和- 6'o54 (十进制的 4 4等于八进制的 5 4)在下例中处理不同。
i n t e g e r C o n e;
.,,
C o n e = -44/4
C o n e = -6'o54/ 4;
注意- 4 4和- 6 ' o 5 4以相同的位模式求值;但是- 4 4作为有符号数处理,而- 6 ' o 5 4作为无符号数处理。因此第一个字符中 C o n e的值为- 11,而在第二个赋值中 C o n e的值为 1 0 7 3 7 4 1 8 1 3 。
4.1.2 参数前一章中已对参数作了介绍。参数类似于常量,并且使用参数声明进行说明。下面是参数说明实例。
p a r a m e t e r L O A D = 4'd12,S T O R E = 4'd10;
L O A D 和 S TO R E为参数的例子,值分别被声明为 1 2和 1 0。
4.1.3 线网可在表达式中使用标量线网( 1位)和向量线网(多位) 。下面是线网说明实例。
w i r e [0:3] P r t; //P r t 为 4位向量线网。
w i r e B d q; //B b q 是标量线网。
线网中的值被解释为无符号数。在连续赋值语句中,
a s s i g n P r t = -3;
P rt被赋于位向量 11 0 1,实际上为十进制的 1 3。在下面的连续赋值中,
a s s i g n P r t = 4'HA;
P rt被赋于位向量 1 0 1 0,即为十进制的 1 0。
4.1.4 寄存器标量和向量寄存器可在表达式中使用。寄存器变量使用寄存器声明进行说明。例如,
i n t e g e r TemA,TemB;
r e g [1:5] S t a t e;
t i m e Q u e [ 1,5 ] ;
整型寄存器中的值被解释为有符号的二进制补码数,而 r e g寄存器或时间寄存器中的值被解释为无符号数。实数和实数时间类型寄存器中的值被解释为有符号浮点数。
TemA = -10; //T e m A值为位向量 1 0 1 1 0,是 1 0的二进制补码。
TemA = 'b1011; //T e m A值为十进制数 1 1。
State = -10; //S t a t e值为位向量 1 0 1 1 0,即十进制数 2 2。
State = 'b1011; //S t a t e值为位向量 0 1 0 1 1,是十进制值 1 1。
4.1.5 位选择位选择从向量中抽取特定的位。形式如下:
n e t _ o r _ r e g _ v e c t o r [b i t _ s e l e c t _ e x p r]
下面是表达式中应用位选择的例子。
S t a t e [1] && S t a t e [4] //寄存器位选择。
P r t [0] | Bbq //线网位选择。
如果选择表达式的值为 x,z,或越界,则位选择的值为 x。例如 S t a t e [x]值为 x。
4.1.6 部分选择在部分选择中,向量的连续序列被选择。形式如下:
第 4章 表 达 式 29下载因为 C o n e 为非定长整型变量,基数表示形式的负数在机内以补码形式出现。 — 译者注
n e t _ o r _ r e g _ v e c t o r [m s b _ c o n s t _ e x p r:1 s b _ c o n s t _ e x p r]
其中范围表达式必须为常数表达式。例如。
S t a t e [1:4] //寄存器部分选择。
P r t [1:3] //线网部分选择。
选择范围越界或为 x,z时,部分选择的值为 x。
4.1.7 存储器单元存储器单元从存储器中选择一个字。形式如下:
m e m o r y [w o r d _ a d d r e s s]
例如:
r e g [1:8] A c k,D r a m [ 0,6 3 ] ;
.,,
A c k = D r a m [60]; //存储器的第 6 0个单元。
不允许对存储器变量值部分选择或位选择。例如,
D r a m [60] [2] 不允许。
D r a m [60] [2:4] 也不允许。
在存储器中读取一个位或部分选择一个字的方法如下:将存储器单元赋值给寄存器变量,然后对该寄存器变量采用部分选择或位选择操作。例如,A c k [2] 和 Ack [ 2,4 ]是合法的表达式。
4.1.8 函数调用表达式中可使用函数调用。函数调用可以是系统函数调用(以 $字符开始)或用户定义的函数调用。例如:
$t i m e + S u m O f E v e n t s (A,B)
/ * $t i m e是系统函数,并且 S u m O f E v e n t s是在别处定义的用户自定义函数。 * /
第 1 0章将详细介绍函数。
4.2 操作符
Verilog HDL中的操作符可以分为下述类型:
1) 算术操作符
2) 关系操作符
3) 相等操作符
4) 逻辑操作符
5) 按位操作符
6) 归约操作符
7) 移位操作符
8) 条件操作符
9) 连接和复制操作符下表显示了所有操作符的优先级和名称。操作符从最高优先级(顶行)到最低优先级
(底行)排列。同一行中的操作符优先级相同。
30 Verilog HDL 硬件描述语言 下载归约操作符为一元操作符,对操作数的各位进行逻辑操作,结果为二进制数。 — 译者除条件操作符从右向左关联外,其余所有操作符自左向右关联。下面的表达式:
A + B - C
等价于:
(A + B ) - C / /自左向右而表达式:
A? B,C? D,F
等价于:
A? B,(C? D,F) //从右向左圆扩号能够用于改变优先级的顺序,如以下表达式:
(A? B,C)? D,F
4.2.1 算术操作符算术操作符有:
+(一元加和二元加)
-(一元减和二元减)
*(乘)
/(除)
%(取模)
整数除法截断任何小数部分。例如:
7/4 结果为 1
取模操作符求出与第一个操作符符号相同的余数。
7%4 结果为 3
而,
- 7%4 结果为 - 3
如果算术操作符中的任意操作数是 X或 Z,那么整个结果为 X。例如:
'b10x1 + 'b01111 结果为不确定数 ' bx x x x x
第 4章 表 达 式 31下载
+ 一元加
- 一元减
! 一元逻辑非
~ 一元按位求反
& 归约与
~ & 归约与非
^ 归约异或
^~ 或 ~ ^ 归约异或非
| 归约或
~ | 归约或非
* 乘
/ 除
% 取模
+ 二元加
_ 二元减
< < 左移
> > 右移
< 小于
< = 小于等于
> 大于
> = 大于等于
= = 逻辑相等
! = 逻辑不等
= = = 全等
! = = 非全等
& 按位与
^ 按位异或
^~ or ~ ^ 按位异或非
| 按位或
& & 逻辑与
| | 逻辑或
,条件操作符
32 Verilog HDL 硬件描述语言 下载
1,算术操作结果的长度算术表达式结果的长度由最长的操作数决定。在赋值语句下,算术操作结果的长度由操作符左端目标长度决定。考虑如下实例:
reg [0:3] Arc,Bar,Crt;
reg [0:5] F r x;
.,,
Arc = B a r + C r t;
F r x = B a r + C r t;
第一个加的结果长度由 B a r,C rt和 A rc长度决定,长度为 4位。第二个加法操作的长度同样由 F rx的长度决定( F rx,B a t和 C rt中的最长长度),长度为 6位。在第一个赋值中,加法操作的溢出部分被丢弃;而在第二个赋值中,任何溢出的位存储在结果位 F r x [ 1 ]中。
在较大的表达式中,中间结果的长度如何确定?在 Verilog HDL中定义了如下规则:表达式中的所有中间结果应取最大操作数的长度(赋值时,此规则也包括左端目标) 。考虑另一个实例:
w i r e [4:1] Box,Drt;
w i r e [1:5] C f g;
w i r e [1:6] P e g;
w i r e [1:8] A d t;
.,,
a s s i g n A d t = (B o x + C f g) + (D r t + P e g) ;
表达式左端的操作数最长为 6,但是将左端包含在内时,最大长度为 8。所以所有的加操作使用 8位进行。例如,B o x和 C f g相加的结果长度为 8位。
2,无符号数和有符号数执行算术操作和赋值时,注意哪些操作数为无符号数、哪些操作数为有符号数非常重要。
无符号数存储在:
线网
一般寄存器
基数格式表示形式的整数有符号数存储在:
整数寄存器
十进制形式的整数下面是一些赋值语句的实例:
r e g [0:5] B a r;
i n t e g e r T a b;
.,,
B a r = -4'd12; //寄存器变量 B a r的十进制数为 5 2,向量值为 1 1 0 1 0 0。
T a b = -4'd12; //整数 T a b的十进制数为 - 1 2,位形式为 1 1 0 1 0 0。
-4'd12 / 4 //结果是 1 0 7 3 7 4 1 8 2 1。
-12 / 4 //结果是 - 3
因为 B a r是普通寄存器类型变量,只存储无符号数。右端表达式的值为 ' b 11 0 1 0 0( 1 2的二进制补码) 。因此在赋值后,B a r存储十进制值 5 2。在第二个赋值中,右端表达式相同,值为
' b 11 0 1 0 0,但此时被赋值为存储有符号数的整数寄存器。 Ta b存储十进制值- 1 2(位向量为
11 0 1 0 0) 。注意在两种情况下,位向量存储内容都相同;但是在第一种情况下,向量被解释为无符号数,而在第二种情况下,向量被解释为有符号数。
下面为具体实例:
B a r = - 4'd12/4;
T a b = - 4'd12 /4;
B a r = - 12/4
T a b = - 12/4
在第一次赋值中,B a r被赋于十进制值 6 1(位向量为 1111 0 1) 。而在第二个赋值中,Ta b被赋于与十进制 1 0 7 3 7 4 1 8 2 1(位值为 0 0 11,,,111 0 1) 。 B a r在第三个赋值中赋于与第一个赋值相同的值。这是因为 B a r只存储无符号数。在第四个赋值中,B a r被赋于十进制值- 3。
下面是另一些例子:
B a r = 4 - 6;
T a b = 4 - 6;
B a r被赋于十进制值 6 2(- 2的二进制补码),而 Ta b被赋于十进制值- 2(位向量为 11111 0) 。
下面为另一个实例:
B a r = -2 + (-4);
T a b = -2 + (-4);
B a r被赋于十进制值 5 8(位向量为 111 0 1 0),而 Ta b被赋于十进制值- 6(位向量为 111 0 1 0) 。
4.2.2 关系操作符关系操作符有:
>(大于)
<(小于)
>=(不小于)
<=(不大于)
关系操作符的结果为真( 1)或假( 0) 。如果操作数中有一位为 X或 Z,那么结果为 X。例如:
23 > 45
结果为假( 0),而:
52< 8'hxFF
结果为 x。如果操作数长度不同,长度较短的操作数在最重要的位方向(左方)添 0补齐。例如:
'b1000 > = 'b01110
等价于:
'b01000 > = 'b01110
结果为假( 0) 。
4.2.3 相等关系操作符相等关系操作符有,
= =(逻辑相等)
!=(逻辑不等)
第 4章 表 达 式 33下载
= = =(全等)
!= =(非全等)
如果比较结果为假,则结果为 0;否则结果为 1。在全等比较中,值 x和 z严格按位比较。
也就是说,不进行解释,并且结果一定可知。而在逻辑比较中,值 x和 z具有通常的意义,且结果可以不为 x。也就是说,在逻辑比较中,如果两个操作数之一包含 x或 z,结果为未知的值( x) 。
如下例,假定:
D a t a = 'b11x0;
A d d r = 'b11x0;
那么:
D a t a = = A d d r
不定,也就是说值为 x,但:
D a t a = = = A d d r
为真,也就是说值为 1。
如果操作数的长度不相等,长度较小的操作数在左侧添 0补位,例如:
2'b10 = = 4'b0010
与下面的表达式相同:
4'b0010 = = 4'b0010
结果为真( 1) 。
4.2.4 逻辑操作符逻辑操作符有,
&& (逻辑与 )
|| (逻辑或 )
! (逻辑非 )
这些操作符在逻辑值 0或 1上操作。逻辑操作的结构为 0或 1。例如,假定,
C r d = 'b0; //0为假
Dgs = 'b1; //1为真那么,
C r d && D g s 结果为 0 (假 )
C r d || D g s 结果为 1 (真 )
! D g s 结果为 0 (假 )
对于向量操作,非0向量作为1处理。例如,假定:
A _ B u s = 'b0110;
B _ B u s = 'b0100;
那么,
A _ B u s || B _ B u s 结果为 1
A _ B u s && B _ B u s 结果为 1
并且,
! A _ B u s 与 ! B _ B u s的结果相同。
结果为0。
如果任意一个操作数包含 x,结果也为 x。
34 Verilog HDL 硬件描述语言 下载
!x 结果为 x
4.2.5 按位操作符按位操作符有,
~(一元非)
&(二元与)
|(二元或)
^(二元异或)
~^,^~(二元异或非)
这些操作符在输入操作数的对应位上按位操作,并产生向量结果。下表显示对于不同操作符按步操作的结果。
例如,假定,
A = 'b0110;
B = 'b0100;
那么,
A | B 结果为 0 1 1 0
A & B 结果为 0 1 0 0
如果操作数长度不相等,长度较小的操作数在最左侧添 0补位。例如,
'b0110 ^ 'b10000
与如下式的操作相同,
'b00110 ^ 'b10000
结果为 ' b 1 0 11 0。
第 4章 表 达 式 35下载与 或异或 异或非非
4.2.6 归约操作符归约操作符在单一操作数的所有位上操作,并产生 1位结果。归约操作符有,
& (归约与 )
如果存在位值为0,那么结果为0;若如果存在位值为 x或 z,结果为 x;否则结果为1。
~& (归约与非 )
与归约操作符 &相反。
| (归约或 )
如果存在位值为1,那么结果为1;如果存在位 x或 z,结果为 x;否则结果为0。
~| (归约或非 )
与归约操作符 |相反。
^ (归约异或 )
如果存在位值为 x或 z,那么结果为 x;否则如果操作数中有偶数个 1,结果为 0;否则结果为 1。
~^ (归约异或非 )
与归约操作符 ^正好相反。
如下所示。假定,
A = 'b0110;
B = 'b0100;
那么,
|B 结果为 1
& B 结果为 0
~ A 结果为 1
归约异或操作符用于决定向量中是否有位为 x。假定,
M y R e g = 4'b01x0;
那么,
^M y R e g 结果为 x
上述功能使用如下的 i f语句检测,
i f ( ^M y R e g = = = 1'bx)
$ d i s p l a y ("There is an unknown in the vector MyReg !")
注意逻辑相等 ( = = )操作符不能用于比较;逻辑相等操作符比较将只会产生结果 x。全等操作符期望的结果为值1。
4.2.7 移位操作符移位操作符有,
<< (左移 )
>> (右移 )
移位操作符左侧操作数移动右侧操作数表示的次数,它是一个逻辑移位。空闲位添 0补位。
如果右侧操作数的值为 x或 z,移位操作的结果为 x。假定,
r e g [ 0,7] Q r e g;
.,,
Q r e g = 4'b0111;
36 Verilog HDL 硬件描述语言 下载那么,
Q r e g >> 2 是 8 ' b 0 0 0 0 _ 0 0 0 1
Verilog HDL中没有指数操作符。但是,移位操作符可用于支持部分指数操作。例如,如果要计算Z N u m B i t s的值,可以使用移位操作实现,例如:
32'b1 << N u m B i t s / /N u m B i t s必须小于 3 2。
同理,可使用移位操作为 2 - 4解码器建模,如
w i r e [0:3] D e c o d e O u t = 4'b1 << A d d r e s s [ 0,1 ] ;
A d d re s s[0:1] 可取值 0,1,2和 3。与之相应,D e c o d e O u t可以取值 4 ' b 0 0 0 1,4 ' b 0 0 1 0,4 ' b 0 1 0 0
和 4 ' b 1 0 0 0,从而为解码器建模。
4.2.8 条件操作符条件操作符根据条件表达式的值选择表达式,形式如下,
c o n d_e x p r? e x p r 1,e x p r 2
如果 c o n d _ e x p r 为真 (即值为 1 ),选择 e x p r 1;如果 c o n d _ e x p r为假 (值为 0 ),选择 e x p r 2。 如果 c o n d _ e x p r 为 x或 z,结果将是按以下逻辑 e x p r 1和 e x p r 2按位操作的值,0与 0得 0,1与 1得 1,
其余情况为 x。
如下所示,
w i r e [0:2] S t u d e n t = M a r k s > 18? G r a d e _ A,G r a d e _ C;
计算表达式 M a r k s > 18; 如果真,G r a d e _ A 赋值为 S t u d e n t; 如果 M a r k s < =18,G r a d e _ C 赋值为 S t u d e n t。下面为另一实例:
a l w a y s
#5 C t r = (C t r != 25)? (C t r + 1),5;
过程赋值中的表达式表明如果 C t r不等于 25,则加 1;否则如果 C t r值为 2 5时,将 C t r值重新置为 5。
4.2.9 连接和复制操作连接操作是将小表达式合并形成大表达式的操作。形式如下,
{e x p r 1,e x p r 2,.,,,e x p r N}
实例如下所示,
w i r e [7:0] D b u s;
w i r e [11:0] A b u s;
a s s i g n D b u s [7:4] = {D b u s [0],D b u s [1],D b u s[2],D b u s[ 3 ] } ;
/ /以反转的顺序将低端 4位赋给高端 4位。
a s s i g n D b u s = {Dbus [3:0],D b u s [ 7,4 ] } ;
/ /高 4位与低 4位交换。
由于非定长常数的长度未知,不允许连接非定长常数。例如,下列式子非法:
{D b u s,5} / /不允许连接操作非定长常数。
复制通过指定重复次数来执行操作。形式如下,
{r e p e t i t i o n _ n u m b e r {expr1,expr2,...,exprN} }
以下是一些实例:
A b u s = {3{4'b1011}}; //位向量 1 2 ' b 1 0 1 1 _ 1 0 1 1 _ 1 0 1 1)
A b u s = {{4{D b u s[7]}},D b u s}; /*符号扩展 */
第 4章 表 达 式 37下载
{3{1'b1}} 结果为 1 1 1
{3{Ack}} 结果与 {A c k,A c k,A c k}相同。
4.3 表达式种类常量表达式是在编译时就计算出常数值的表达式。通常,常量表达式可由下列要素构成,
1) 表示常量文字,如 ' b 1 0和 3 2 6。
2) 参数名,如 R E D的参数表明,
p a r a m e t e r R E D = 4'b1110;
标量表达式是计算结果为 1位的表达式。如果希望产生标量结果,但是表达式产生的结果为向量,则最终结果为向量最右侧的位值。
习题
1,说明参数 G AT E _ D E L AY,参数值为 5。
2,假定长度为 6 4个字的存储器,每个字 8位,编写 Verilog 代码,按逆序交换存储器的内容。即将第 0个字与第 6 3个字交换,第 1个字与第 6 2个字交换,依此类推。
3,假定 3 2位总线 A d d re s s _ B u s,编写一个表达式,计算从第 11位到第 2 0位的归约与非。
4,假定一条总线 C o n t ro l _ B u s [ 1 5,0 ],编写赋值语句将总线分为两条总线,A b u s [ 0,9 ]和 B b u s
[ 6,1 ]。
5,编写一个表达式,执行算术移位,将 Qparity 中包含的 8位有符号数算术移位。
6,使用条件操作符,编写赋值语句选择 N e x t S t a t e的值。如果 C u rre n t S t a t e的值为 R E S E T,那么
N e x t S t a t e的值为 G O;如果 C u rre n t S t a t e的值为 G O,则 N e x t S t a t e 的值为 B U S Y;如果
C u rre n t S t a t e的值为 B U S Y;则 N e x t S t a t e的值为 R E S E T。
7,使用单一连续赋值语句为图 2 - 2所示的 2 - 4解码器电路的行为建模。 [提示:使用移位操作符、
条件操作符和连接操作符。 ]
8,如何从标量变量 A,B,C和 D中产生总线 B u s Q[0:3]? 如何从两条总线 B u s A [ 0,3 ]和 B u s Y
[ 2 0,1 5 ]形成新的总线 B u s R [ 1 0,1 ]?
38 Verilog HDL 硬件描述语言 下载