第6章 Verilog HDL语法与要素
标识符(Identifiers) 标识符(Identifiers)
Verilog中的标识符可以是任意一组字母、数字以及符号“$”和“_”(下划线)的组合,但标识符的第一个字符必须是字母或者下划线。另外,标识符是区分大小写的。 Examples: count
COUNT //COUNT与count是不同的 _A1_d2 //以下划线开头 R56_68 FIVE p41 ◆ 整数 ◆ 实数 ◆ 字符串 6.2 常量
程序运行中,值不能被改变的量称为常量(constants),Verilog中的常量主要有如下3种类型: p42
整数按如下方式书写: +/-
即 +/-<位宽>'<进制><数字>
size 为对应二进制数的宽度;base为进制;value是基于进制的数字序列。 进制有如下4种表示形式: ◆ 二进制(b或B)
◆ 十进制(d或D或缺省) ◆ 十六进制(h或H) ◆ 八进制(o或O) 整数(integer) p43
Examples:
8'b11000101 //位宽为八位的二进制数11000101 8'hd5 //位宽为八位的十六进制数d5; 5'O27 //5位八进制数 4'D2 //4位十进制数2 4'B1x_01 //4位二进制数1x01 5'Hx //5位x(扩展的x),即xxxxx 4'hZ //4位z,即zzzz
8□'h□2A /*在位宽和'之间,以及进制和数值之间允许出现空格,但'和进制之间,数值间是不允许出现空格的,比如8'□h2A、8'h2□A等形式都是不合法的写法 */ 整数(integer) p44
实数(Real)有下面两种表示法。
◆ 十进制表示法。例如: 2.0
0.1 //以上2例是合法的实数表示形式 2. //非法:小数点两侧都必须有数字 ◆ 科学计数法。例如:
43_5.1e2 //其值为43510.0
9.6E2 //960.0 (e与E相同) 5E-4 //0.0005 实数(Real) p45
6.3 数据类型
Verilog有下面四种基本的逻辑状态。 ◆ 0:低电平、逻辑0或逻辑非 ◆ 1:高电平、逻辑1或“真” ◆ x或X:不确定或未知的逻辑状态 ◆ z或Z:高阻态
Verilog中的所有数据类型都在上述4类逻辑状态中取值,其中x和z都不区分大小写,也就是说,值0x1z与值0X1Z是等同的。
数据类型(Data Type)是用来表示数字电路中的物理连线、数据存储和传输单元等物理量的。 p46 net型
Net型数据相当于硬件电路中的各种物理连接,其特点是输出的值紧跟输入值的变化而变化。对连线型有两种驱动方式,一种方式是在结构描述中将其连接到一个门元件或模块的输出端;另一种方式是用持续赋值语句assign对其进行赋值。 wire是最常用的Net型变量。 wire型变量的定义格式如下:
wire 数据名1,数据名2,??数据名n;
例如: wire a,b; //定义了两个wire型变量a和b Examples:
wire[7:0] databus; //databus的宽度是8位 wire[19:0] addrbus; //addrbus的宽度是20位 p47
Variable型
variable型变量必须放在过程语句(如initial、always)中,通过过程赋值语句赋值;在always、initial等过程块内被赋值的信号也必须定义成variable型。
注意:variable型变量并不意味着一定对应着硬件上的一个触发器或寄存器等存储元件,在综合器进行综合时,variable型变量会根据具体情况来确定是映射成连线还是映射为触发器或寄存器。
reg型变量是最常用的一种variable型变量。定义格式如下: reg 数据名1,数据名2,??数据名n;
例如:reg a,b; //定义了两个reg型变量a,b Examples:
reg[7:0] qout; //定义qout为8位宽的reg型向量 reg[8:1] qout; p48
6.4 参数(parameter) 在Verilog语言中,用参数parameter来定义符号常量,即用parameter来定义一个标志符代表一个常量。参数常用来定义时延和变量的宽度。 其定义格式如下:
parameter 参数名1=表达式1,参数名2=表达式2,参数名3=表达式3, ?? ; 例如:
parameter sel=8,code=8'ha3;
//分别定义参数sel代表常数8(10进制),参数code代表常量a3(16进制) p49
6.5 向量 1.标量与向量
宽度为1位的变量称为标量,如果在变量声明中没有指定位宽,则默认为标量(1位)。举例如下:
wire a; //a为标量
reg clk; //clk为标量reg型变量
线宽大于1位的变量(包括net型和variable型)称为向量(vector)。向量的宽度用下面的形式定义: [msb : lsb] 比如:
wire[3:0] bus; //4位的总线 p50
6.6 运算符(Operators)
1.算术运算符(Arithmetic operators) 常用的算术运算符包括: + 加 - 减 * 乘 / 除 % 求模 p51
2.逻辑运算符(Logical operators) && 逻辑与 || 逻辑或 ! 逻辑非 p52
3.位运算符(Bitwise operators)
位运算,即将两个操作数按对应位分别进行逻辑运算。 ~ 按位取反 & 按位与 | 按位或 ^ 按位异或
^~,~^ 按位同或(符号^~与~^是等价的) p53
4.关系运算符(Relational operators) < 小于 <= 小于或等于 > 大于 >= 大于或等于 p54
5.等式运算符(Equality Operators) == 等于 != 不等于 === 全等
!== 不全等
6.缩位运算符(Reduction operators) & 与 ~& 与非 | 或 ~| 或非 ^ 异或 ^~,~^ 同或
7.移位运算符(shift operators) >> 右移 << 左移 p57
8.条件运算符(conditional operators) ?:
三目运算符,其定义方式如下:
signal=condition?true_expression:false_expression; 即:信号=条件?表达式1:表达式2;
当条件成立时,信号取表达式1的值,反之取表达式2的值。 p58
9.位拼接运算符(concatenation operators) { }
该运算符将两个或多个信号的某些位拼接起来。使用如下: {信号1的某几位,信号2的某几位,??,信号n的某几位} p59
习 题
6.1 下列标识符哪些是合法的,哪些是错误的?
Cout, 8sum, \\a*b, _data, \\wait, initial, $latch