下载 第4章表达式 本章讲述在Ⅴ erilog hdl中编写表达式的基础 表达式由操作数和操作符组成。表达式可以在出现数值的任何地方使用 4.1操作数 操作数可以是以下类型中的一种: 1)常数 2)参数 3)线网 4)寄存器 5)位选择 6)部分选择 7)存储器单元 8)函数调用 4.11常数 前面的章节已讲述了如何书写常量。下面是一些实例 256,7 岸定长的十进制数。 4"b1011,g"h0A 腚长的整型常量 hfBA 芈定长的整数常量 90.00006 数型常量 W BON D /常量:每个字符作为8位 ASCII值存储 表达式中的整数值可被解释为有符号数或无符号数。如果表达式中是十进制整数,例如, 12被解释为有符号数。如果整数是基数型整数(定长或非定长),那么该整数作为无符号数对 待。下面举例说明 2是01100的5位向量形式(有符号) 12是10100的5位向量形式(有符号) 5"b01100是十进制数12(无符号) 5"b10100是十进制数20(无符号) 4d12是十进制数12(无符号) 更为重要的是对基数表示或非基数表示的负整数处理方式不同。非基数表示形式的负整 数作为有符号数处理,而基数表示形式的负整数值作为无符号数。因此-44和-6054(十进制 的44等于八进制的54)在下例中处理不同 integer cone. cone=-44/4 6。54/4; 注意-44和-6o54以相同的位模式求值:但是-44作为有符号数处理,而一6054作为无符
下载 第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作为无符
第4章表达式 29 下载 号数处理。因此第一个字符中Cone的值为-11,而在第二个赋值中Cone的值为1073741813°。 4.1.2参数 前一章中已对参数作了介绍。参数类似于常量,并且使用参数声明进行说明。下面是参 数说明实例 parameter load =4 d12, STore =4d10 LOAD和 STORE为参数的例子,值分别被声明为12和10 4.13线网 可在表达式中使用标量线网(1位)和向量线网(多位)。下面是线网说明实例 wre[0:3]Pt;//Prt为4位向量线网 wire Bag: Bbq是标量线网 线网中的值被解释为无符号数。在连续赋值语句中, assign Prt =-3 Pr被赋于位向量1101,实际上为十进制的13。在下面的连续赋值中, assign Prt =4 HA Prt被赋于位向量1010,即为十进制的10 4.14寄存器 标量和向量寄存器可在表达式中使用。寄存器变量使用寄存器声明进行说明。例如 integer TemA, TemB reg [1: 5] state time Que [1: 5]i 整型寄存器中的值被解释为有符号的二进制补码数,而reg寄存器或时间寄存器中的值被 解释为无符号数。实数和实数时间类型寄存器中的值被解释为有符号浮点数 /remA值为位向量10110,是10的二进制补码 TemA=b1011;/mA值为十进制数11 /9tate值为位向量10110,即十进制数22 state="b1011;/ state值为位向量01011,是十进制值11。 4.1.5位选择 位选择从向量中抽取特定的位。形式如下: net or reg vector [bit select expr] 下面是表达式中应用位选择的例子 State [1]&& State [4 /裔存器位选择 Prt [o] I Bbq 线网位选择 如果选择表达式的值为x、z,或越界,则位选择的值为x。例如Sare【x]值为 4.16部分选择 部分选择中,向量的连续序列被选择。形式如下: 白因为Cone为非定长整型变量,基数表示形式的负数在机内以补码形式出现。—译者注
号数处理。因此第一个字符中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 为非定长整型变量,基数表示形式的负数在机内以补码形式出现。—译者注
30mimD硬件述语言 Chinapub. coM 下载 net or reg vector [msb const expr: isb const expr 其中范围表达式必须为常数表达式。例如 State [1: 4] 寄存器部分选择 Prt[1:3] /网部分选择。 选择范围越界或为κ、z时,部分选择的值为x。 4.1.7存储器单元 存储器单元从存储器中选择一个字。形式如下: memory word address 例如: reg [1: 8] Ack, Dram [0: 63] Ack=Dram[60];/存储器的第60个单元。 不允许对存储器变量值部分选择或位选择。例如, Dram[60][2:4] 也不允许。 在存储器中读取一个位或部分选择一个字的方法如下:将存储器单元赋值给寄存器变 量,然后对该寄存器变量釆用部分选择或位选择操作。例如,Ack[2]和Ack[2:4]是合法的 表达式 4.1.8函数调用 表达式中可使用函数调用。函数调用可以是系统函数调用(以$字符开始)或用户定义的 函数调用。例如 /+St⊥me是系统函数,并且 Sumofevents是在别处定义的用户自定义函数。+/ 第10章将详细介绍函数。 4.2操作符 Verilog hdl中的操作符可以分为下述类型 1)算术操作符 2)关系操作符 3)相等操作符 4)逻辑操作符 5)按位操作符 6)归约操作符e 7)移位操作符 8)条件操作符 9)连接和复制操作符 下表显示了所有操作符的优先级和名称。操作符从最高优先级(顶行)到最低优先 (底行)排列。同一行中的操作符优先级相同 ⊙归约操作符为一元操作符,对操作数的各位进行逻辑操作,结果为二进制数。——译者
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 硬件描述语言 下载 归约操作符为一元操作符,对操作数的各位进行逻辑操作,结果为二进制数。—译者
Chinaopub.com 第4章表达式 31 载 右移 一元减 元逻辑非 小于等于 元按位求反 大于 归约与 大于等于 归约与非 逻辑相等 归约异或 归约异或非 归约或 非全等 归约或非 按位与 乘 按位异或 除 取模 按位或 二元加 && 逻辑与 二元减 逻辑或 左移 条件操作符 除条件操作符从右向左关联外,其余所有 操作符自左向右关联。下面的表达 等价于 //自左向右 而表达式 等价于 ?D:F)//从右向左 圆扩号能够用于改变优先级的顺序,如以下表达式 421算术操作符 算术操作符有: +(一元加和二元加) (一元减和二元减) (乘) ·/(除) %(取模) 整数除法截断任何小数部分。例如: /4结果为1 取模操作符求出与第一个操作符符号相同的余数。 果为3 结果为-3 如果算术操作符中的任意操作数是x或z,那么整个结果为x。例如 b10x1+"b01111结果为不确定数" xxxxx
除条件操作符从右向左关联外,其余所有 操作符自左向右关联。下面的表达式: 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硬件描述语言 下载 算术操作结果的长度 算术表达式结果的长度由最长的操作数决定。在赋值语句下,算术操作结果的长度由操 作符左端目标长度决定。考虑如下实例 reg [0: 3] Arc, Bar, crt reg [0: 5] Frx Arc Bar Crti Frx Bar crt 第一个加的结果长度由Bar,Crt和Arc长度决定,长度为4位。第二个加法操作的长度同 样由Frx的长度决定(Frx、Bat和Cr中的最长长度),长度为6位。在第一个赋值中,加法操 作的溢出部分被丢弃;而在第二个赋值中,任何溢出的位存储在结果位Frx[中 在较大的表达式中,中间结果的长度如何确定?在 Verilog HDL中定义了如下规则:表达 式中的所有中间结果应取最大操作数的长度(赋值时,此规则也包括左端目标)。考虑另一个 实例: w⊥re[4:1]Box,Drt wire [1: 6] Peg wire [l: 8 Adt assign Adt =(Box Cfg)+(Drt Peg)i 表达式左端的操作数最长为6,但是将左端包含在内时,最大长度为8。所以所有的加操 作使用8位进行。例如:Box和Cg相加的结果长度为8位 2.无符号数和有符号数 执行算术操作和赋值时,注意哪些操作数为无符号数、哪些操作数为有符号数非常重要。 无符号数存储在 线网 ·一般寄存器 基数格式表示形式的整数 有符号数存储在 整数寄存器 ·十进制形式的整数 下面是一些赋值语句的实 reg [0: 5] Bari integer Tab. Bar=-4d12;/寄存器变量Bar的十进制数为52,向量值为110100 rab=-4d12;/整数Tab的十进制数为-12,位形式为110100 4d12/4/结果是1073741821 /结果是-3 因为Bar是普通寄存器类型变量,只存储无符号数。右端表达式的值为"b110100(12的二 进制补码)。因此在赋值后,Bar存储十进制值52。在第二个赋值中,右端表达式相同,值为 bl10100,但此时被赋值为存储有符号数的整数寄存器。Tab存储十进制值-12(位向量为
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(位向量为
Chinaopub.com 第4章表达式 33 下载 l10100)。注意在两种情况下,位向量存储内容都相同;但是在第一种情况下,向量被解释为 无符号数,而在第二种情况下,向量被解释为有符号数 下面为具体实例 4·d12/4 4'd12/4 12/4 在第一次赋值中,Bar被赋于十进制值61(位向量为1l1101)。而在第二个赋值中,Tab被 赋于与十进制1073741821(位值为0011.1101)。Bar在第三个赋值中赋于与第一个赋值相同 的值。这是因为Bar只存储无符号数。在第四个赋值中,Bar被赋于十进制值一3。 下面是另一些例子: Ba被赋于十进制值62(-2的二进制补码),而Tb被赋于十进制值-2(位向量为l110 下面为另一个实例: Bar被赋于十进制值58(位向量为l11010),而ab被赋于十进制值-6(位向量为111010) 422关系操作符 关系操作符有: >(大于) =(不小于) 45 结果为假(0),而: 结果为x。如果操作数长度不同,长度较短的操作数在最重要的位方向(左方)添0补齐。例 b1000>="b01110 等价于: >=b01110 结果为假(0)。 4.23相等关系操作符 相等关系操作符有 ==(逻辑相等) !=(逻辑不等)
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 关系操作符 关系操作符有: • >(大于) • =(不小于) • 45 结果为假(0),而: 52 = 'b01110 等价于: 'b01000 > = 'b01110 结果为假(0)。 4.2.3 相等关系操作符 相等关系操作符有: • = =(逻辑相等) • !=(逻辑不等) 第4章 表 达 式 33 下载
34 Verilog hdl硬件描述语言 Chinapub.com 下载 ===(全等) !==(非全等) 如果比较结果为假,则结果为0:否则结果为1。在全等比较中,值x和z严格按位比较 也就是说,不进行解释,并且结果一定可知。而在逻辑比较中,值x和z具有通常的意义,且 结果可以不为x。也就是说,在逻辑比较中,如果两个操作数之一包含x或z,结果为未知的 值(x) 如下例,假定: Data b11x0 那么 不定,也就是说值为x,但 为真,也就是说值为1。 如果操作数的长度不相等,长度较小的操作数在左侧添0补位,例如: 与下面的表达式相同: 4"b0010 4b0010 结果为真(1) 4.24逻辑操作符 逻辑操作符有 &&(逻辑与) ‖(逻辑或) (逻辑非) 这些操作符在逻辑值0或1上操作。逻辑操作的结构为0或1。例如,假定 b0;//假 Dgs="b1;//为真 那么 Cra & Dgs 结果为0 Crd i Dgs 结果为1 Dgs 结果为0(假) 对于向量操作,非0向量作为1处理。例如,假定 A Bus ='b0110 Bus="b0100; 那么 A Bus II B Bu 结果为1 Bus&BBus结果为1 并且 ABus与!BBus的结果相同 结果为0 如果任意一个操作数包含x,结果也为
• = = =(全等) • != =(非全等) 如果比较结果为假,则结果为 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 硬件描述语言 下载
Chinaopub.com 第4章表达式 35 载 x结果为x 425按位操作符 按位操作符有 ~(一元非) ·&(二元与) |(二元或 ^(二元异或) ·~^,个~(二元异或非) 这些操作符在输入操作数的对应位上按位操作,并产生向量结果。下表显示对于不同操 作符按步操作的结果。 或01 0000 0 ^异或01x ^异或非01 例如,假定, A="b0 B="b0100 AI B 结果为0110 结果为0100 如果操作数长度不相等,长度较小的操作数在最左侧添0补位。例如 b0110b10000 与如下式的操作相同 b00110^"b10000 结果为b10110
!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 下载 与 或 异或 异或非 非
36 Verilog HDl bg件描述语言 下载 4.26归约操作符 归约操作符在单一操作数的所有位上操作,并产生1位结果。归约操作符有: &(归约与) 如果存在位值为0,那么结果为0;若如果存在位值为x或z,结果为x;否则结果为1 &(归约与非) 与归约操作符&相反。 |(归约或) 如果存在位值为1,那么结果为1:如果存在位x或z,结果为x:否则结果为0 (归约或非) 与归约操作符|相反。 ^(归约异或) 如果存在位值为κ或z,那么结果为κ:否则如果操作数中有偶数个1,结果为0:否则结果 ~^(归约异或非 与归约操作符^正好相反。 如下所示。假定 b010 那么 B 结果为1 结果为0 结果为1 归约异或操作符用于决定向量中是否有位为x。假定, MyReg=4"b01x自 那么 MyReg结果为x 上述功能使用如下的主£语句检测 if (MyReg===1'bx s display ("There is an unknown in the vector MyReg " 注意逻辑相等白=)操作符不能用于比较:逻辑相等操作符比较将只会产生结果κ。全等操 作符期望的结果为值1。 427移位操作符 移位操作符有 (右移) 移位操作符左侧操作数移动右侧操作数表示的次数,它是一个逻辑移位。空闲位添0补位, 如果右侧操作数的值为x或z,移位操作的结果为x。假定 reg
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 硬件描述语言 下载
Chinaopub.com 37 下载 第4章表达式 那么 Qreg>2是8"b000 Verilog Hdl中没有指数操作符。但是,移位操作符可用于支持部分指数操作。例如,如 果要计算Z的值,可以使用移位操作实现,例如 32"b118? Grade A Grade C; 计算表达式 Marks>18;如果真, Grade A赋值为 Student,如果 Marks<=18, Grade C赋值 为 Student。下面为另一实例 5ctr=(ctr!=25)?ctr+1):5; 过程赋值中的表达式表明如果Cm不等于25,则加1:否则如果Cmr值为25时,将Cmr值重新置 429连接和复制操作 连接操作是将小表达式合并形成大表达式的操作。形式如下 (expr, expr2, 例如下所示 w⊥re[7:0]Dbu wire [11: 0] Abus assign Dbus [7:4]=pbus [0], Dbus [1], Dbus [2], Dbus[3]] /以反转的顺序将低端4位赋给高端4位 assign Dbus = Dbus [3: 0], Dbus [7: 4]] //高4位与低4位交换 由于非定长常数的长度未知,不允许连接非定长常数。例如,下列式子非法 (Dbus,5)∥不允许连接操作非定长常数 复制通过指定重复次数来执行操作。形式如下 (repetition number (expr, expr2 以下是一些实例 Abus=(3(4"b10111;位向量12b101110111011) Abus=((4(Dbus[7]),Dbus};/*符号扩展*/
那么: 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 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 下载