Verilog的数据类型、变量与运算符
1、数据类型
Verilog数据类型共有19种,但经常使用的有reg、wire、parameter等。
-
reg是寄存器数据类型的关键字,通过赋值语句能改变寄存器中的值,与触发器储存器值类似,其定义方式如下:
reg [n-1:0] 数据名1,数据名2,...,数据名i;//[n-1:0]表示数据宽度,即该数据有几位 reg [n:1] 数据名1,数据名2,...,数据名i;//一次定义多个时使用逗号分隔
reg型数据初始值是不固定的,赋值时可以赋正值也可以赋负值,但是它的值作为操作数时当作无符号数。
-
wire常用来表示指定的组合逻辑信号。Verilog程序模块中输入、输出信号均默认为wire型。定义方式与reg类型类似:
wire [n-1:0] 数据名1,数据名2,...,数据名i;//[n-1:0]表示数据宽度,即该数据有几位 wire [n:1] 数据名1,数据名2,...,数据名i;//一次定义多个时使用逗号分隔
2、常量
在程序运行过程种不能改变的量称为常量
1. 数字
在verilog中数字有整数、负数、下画线和X/Z值的区别
-
整数,表示方式有4种进制形式:B、O、D、H分别表示二进制、八进制、十进制、十六进制,对大小写不敏感。表达方式有三种
- <位宽>、<进制>和<数字>,最全面的描述形式
- <进制>、<数字>这种方式采用默认位宽,具体宽度由机器结构决定,但是不少于32位
- <数字>这种方式采用默认位宽、默认的十进制
表达式中,位宽指明了数字所占用的位数
8'b10101100 //位宽为8的二进制数表示法 8'h3a //位宽为8的十六进制表示法,因为每个十六进制占用4个而二进制位
-
负数,在位宽表达式前加上“-”,必须加在表达式的最前面
-8'd5 //表示-5的补数,八进制表示法 8d'-5 //错误格式
-
下画线,用来分隔数字表达式提高程序的可读性,只能用在具体数字之间
16'b1111_0011_110_00_101 //合法格式 8'b_1100_0011 //非法格式,只能用在具体数字之间
-
X/Z值,X代表不定值,Z代表高阻值,一般不使用
2.参数型parameter
使用parameter定义标识符代表一个常量,能提高程序的可读性和可维护性,多个定义时,使用逗号分隔,其格式如下:
parameter 参数名1 = 表达式,参数名2 = 表达式,...,参数名n = 表达式;
等号右侧的表达式必须是常数表达式,即是数字或已经定义过的参数。
parameter msb = 7, msa = 6;
parameter e = msb + 1;
3、变量
变量是一种在程序中可以改变值的量,设计时只用reg和wire两种信号类型表示变量,且仅在以下情况使用reg类型
- 可综合代码:由本模块中的always产生的信号
- 测试代码:用initial产生的信号
以上情况之外的均使用wire类型。一般来说reg类型信号是寄存器或触发器的输出,但也存在不产生寄存器的可能,夏老师的书中也强调了reg型只表示定义的信号将用到always块内。
4、运算符
赋值运算符按功能可以分为:
- 算术运算符(+、-、*、/、%)
- 赋值运算符(=、<=,时序逻辑用<=,组合逻辑用=)
- 关系运算符(>、<、=、<=)
- 逻辑运算符(&&、||、!)
- 位运算符(~、|、^、&)
- 移位运算符(<<、>>)
- 拼接运算符({})
- 条件运算符(?:)
1.算数运算符
- +加法运算符,msb + msa
- -减法运算符,msb - 3
- ×乘法运算符,msa * 2
- /除法运算符,msb / 4,整数的除法运算要舍去小数点后的值
- %求余运算符,a % 7,结果的符号采用第一个操作数的符号位
2.位运算符
- ~按位取反
- &按位与
- |按位或
- ^按位异或
- ^~按位同或