下载 第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(位向量为