Verilog HDL文字规则
1.关键词与标识符
关键词是Verilog HDL中预先定义的单词,它们在程序中有特别的使用目的。已经被用作关键词的单词不可以在程序中另作他用,见表3-1。不同版本的Verilog HDL硬件描述语言中定义的关键词数目略有变化,Verilog 1995的关键词有97个,Verilog 2001共102个。
标识符是用户编程时给对象定义的名称,对象包括:常量、变量、模块、寄存器、端口、连线、示例和beginend块等元素。定义标识符时应遵循如下规则:
只能由26个大小写英文字母、数字和下划线组成。
标识符的第一个字符必须是英文字母或下划线。
字符中的英文字母区分大小写。
【例3-7】判断下面标识符是否合法。
2.注释
与C语言一样,硬件描述语言中的注释也不会被编译。在Verilog HDL中有两种形式的注释方式:
采用/* */,多用于多行注释。
采用//,用于单行注释。
【例3-8】注释举例。
在实际使用中,很多公司的编程规范明确表明,注释行中不提倡采用第一种/**/的注释方式,不允许使用中文注释。
3.常数的表示
在Verilog HDL中,常数用来表示在程序中不随意变化的量,常数分为整数、实数及字符串三大类型。
(1)整数型常数
是数字电路中最常用到的类型,在Verilog HDL中有两种表示方法:
简单的十进制格式,例如-50、6等。
基数格式,其表达方式一般如下:
〈位宽〉是十进制数值表示的常数化成二进制时对应的宽度,〈进制符号〉用进制符号b或B(二进制)、o或O(八进制)、d或D(十进制)、h或H(十六进制)表示常数的进制格式,即二进制、八进制、十进制、十六进制这4种进制表示。数字的位宽可以默认,如果没有定义长度,数的长度由具体机器系统决定(至少是32位)。
【例3-9】常数表示方法举例。
(2)实数型常数
通常用来表示带小数点的常数。实数也有两种表示方法:一种是十进制计数法;另一种是科学计数法。注意小数点两侧必须有数字,否则是错误的表示。
【例3-10】实数表示方法举例。
(3)字符串型常数
字符串是双引号内的字符序列。它必须写在同一行中。例如:
"Hi kitty"。在表达式和赋值语句中,字符串要转换成无符号整数,每一个8位ASCII码代表一个字符。例如:字符串"ab"等价于16'h5758。因此字符串是8位ASCII值的序列。例如,存储字符串"Hi kitty",需要定义8×8位的变量。
数据对象
在Verilog HDL中,凡是可以被赋值的对象就称为数据对象,它类似于一种容器,可以接受不同类型的赋值,在Verilog HDL中,数据对象有两种:常量和变量。
1.常量
常量就是在设计过程中不会发生变化的数据对象,Verilog HDL允许用参数定义语句定义一个标识符来代表一个常量,称为符号常量。符号常量的定义和设置通常是为了设计中的常数更容易阅读和修改。
符号常量定义的格式为:
【例3-11】符号常量定义举例。
2.变量
变量是在设计过程中数值可以改变的数据对象。在Verilog HDL中,变量有两大数据类型:线网类型(nets type)和寄存器型(register type)。
(1)线网类型变量
线网类型变量可以看做硬件电路中元件之间实际连线。它不能存储值,必须受到驱动器或者连续赋值语句的驱动,它是输出值始终根据输入变化而更新的变量,如果没有驱动,那么它将会是高阻态。Verilog HDL提供的常见线网类型变量如表3-2所示。
在表3-2所列若干线网类型中,常用的是wire类型。对于wire类型的变量,其定义的格式如下:
[n-1:0]表示信号的位宽为n位,若没有特别的说明,被定义的信号往往被默认为1位宽度的wire类型变量。
【例3-12】线网类型变量定义举例。
(2)寄存器类型
寄存器类型表示一个抽象的数据存储单元,不与具体硬件对应。它具有状态保持作用,通过赋值语句可以改变寄存器存储的值。寄存器变量的初始值为不确定态。寄存器类型变量共有4种数据类型,见表3-3所示。
在表3-3所列若干寄存器型中,reg型变量是数字系统中存储设备的抽象,常用于具体的硬件描述,因此是最常用的寄存器型变量。对于被定义的reg类型变量,其定义的格式如下:
[n-1:0]表示信号的位宽为n位,若没有特别的说明,被定义的信号往往被默认为1位宽度的reg类型的变量。
【例3-13】寄存器变量类型举例。
若把一个变量定义成integer、real和time等寄存器类型,其方法同定义reg类型一样。integer型变量通常用于对整型常数进行存储和运算。必须注意,integer、real和time等寄存器类型宽度是固定的,因此在定义时不能加入位宽。
【例3-14】
数组类型并不是一种新的数据类型,它是寄存器类型二维数组的形式,是将reg变量进行地址扩展而得到的,它常用来对存储器ROM、RAM进行建模。
数组类型变量的定义格式如下:
【例3-15】数组类型定义及赋值举例。
数据对象被定义后,无论定义成哪种类型,都可以采用如下多种赋值形式:
【例3-16】赋值举例。
运算符
Verilog HDL中定义了多种运算符,按照类别共分为9类,分别是算术运算符、关系运算符、等式运算符、逻辑运算符、位运算符、缩位运算符、移位运算符、条件运算符、位拼接运算符。
1.算术运算符
算术运算符包括+(加)、-(减)、*(乘)、/(除)、%(求模)这5种。
需要注意的是,两个整数做相除运算,商的整数部分作为结果,小数部分截掉。两个整数做求模运算,商的余数部分作为结果,整数部分截去。如果任意一个操作数中含有X或Z,那么整个结果为X。例如:'b001 x+'b0101结果为不确定数'bxxxxx。
【例3-17】算术运算举例。
2.关系运算符
关系运算符包括>(大于)、<(小于)、>=(大于等于)、<=(小于等于)4种。
在关系运算中,如果表达式成立,关系结果为真(逻辑1),否则关系结果为假(逻辑0)。如果操作数中有一位为X或Z,那么结果为X。
【例3-18】关系运算举例。
3.等式运算符
等式运算符包括==(逻辑相等)、!=(逻辑不等)、===(全等)、!==(非全等)4种。
相等运算对两个操作数进行逐位比较,当两个数完全相等时,结果为真(逻辑1),否则结果为假(逻辑0)。若任意一个操作数中含有X或Z,那么结果为X。在全等运算中,允许操作数的某些位为X或Z,只要被比较的两个数对应位完全相同,则全等运算结果就为真。
【例3-19】相等运算举例。
4.逻辑运算符
逻辑运算符包括!(逻辑非)、&&(逻辑与)、||(逻辑或)3种。
在逻辑运算中,将操作数看成一个整体,当操作数不为0时,把它作为逻辑1,否则作为逻辑0,若任意一个操作数中含有X或Z,那么结果为X。
【例3-20】逻辑运算举例。
5.位运算符
位运算符包括~(按位取反)、&(按位与)、|(按位或)、^(按位异或)、^~或~^(按位同或)5种。位运算用于对两个操作数对应位进行运算。
【例3-21】位运算举例。
6.缩位运算符
缩位运算符包括&(与缩位)、~&(与非缩位)、|(或缩位)、~|(或非缩位)、^~或~^(同或缩位)5种。
位运算和缩位运算虽然运算符相同,但是运算过程不同。位运算的操作数有两个,操作数是几位,运算结果也是几位。而缩位运算只有一个操作数,运算时对一个操作数由左向右进行运算,运算结果为1位。
【例3-22】缩位运算举例。
7.移位运算符
移位运算符包括<<(向左移位)、>>(向右移位)。移位操作符将操作数向左、向右移动指定的位数,空出的位置用“0”补充。
【例3-23】移位运算举例。
8.条件运算符
条件运算符为?:(条件运算)。
其格式是:条件表达式?表达式1:表达式2
该运算符的运算过程为:如果条件表达式为真,结果为表达式1的值,否则为表达式2的值。
【例3-24】条件运算举例。
9.位拼接运算符
位拼接运算符为{}。位拼接运算是将小表达式合并形成大表达式的操作。形式如下:
{expr1,expr2,……,exp N}
【例3-25】拼接运算举例。10.运算符的优先等级
Verilog HDL运算符的优先等级见表3-4,若想改变运算的优先等级,可以加圆括号。