Verilog基础知识之常量
在程序运行过程中,其值不能被改变的量称为常量(constants),Verilog中常量主要有如下3种类型:
· 整数
· 实数
· 字符串
其中,整数型常量是可以综合的,而实数型和字符串型常量是不可综合的。
1.整数
整数(Integer)按如下方式书写:
+/-<size>'<base><value>
即
+/-<位宽>'<进制><数字>
size对应二进制数的位宽;base为进制;value为基于进制的数字序列。其中,进制有如下4种表示形式:
· 二进制(b或B)
· 十进制(d或D或默认)
· 十六进制(h或H)
· 八进制(o或O)
另外,在书写时,十六进制中的a~f与值x和z一样,不区分大小写。下面是一些合法的书写整数的例子。
下面是一些不合法的书写整数的例子。
在书写和使用整数时需要注意下面一些问题:
(1)在较长的数之间可用下划线分开,如16'b1010_1101_0010_1001。
下画线符号“_”可以随意用在整数或实数中,它们本身没有意义,只用来提高可读性;但数字的第一个字符不能是下画线“_”,下画线也不可以用在位宽和进制处,只能用在具体的数字之间。
(2)如果没有定义一个整数的位宽(unsized number),则默认为32位。如:
(3)如果定义的位宽比数值的位数长,通常在左边填0补位。但如果数的最左边一位为x或者z,就相应的用x或z,就相应的用x或z在左边补位。例如:
如果定义的位宽比数值的位数短,那么左边的位被截掉。例如:
(4)“?”是高阻态z的另外一种表示符号。在数字的表示中,字符“?”和Z(或z)是完全等价的,可互相替代。
(5)x(或z)在二进制中代表1位x(或z),在八进制中代表3位x(或z),在十六进制中代表4位x(或z),其代表的宽度取决于所用的进制。例如:
(6)整数可以有符号(正、负号),并且正、负号应写在最左边。负数通常表示为二进制补码的形式。
(7)当位宽与进制省略时,默认是十进制的数。例如:
(8)在位宽和'之间,以及进制和数值之间允许出现空格,但'和进制之间及数值之间不允许出现空格。
(9)在Verilog-2001中,扩展了有符号的整数定义。例如:
2.实数
实数(Real)有下面两种表示法。
(1)十进制表示法
例如:
(2)科学计数法
例如:
Verilog语言定义了将实数转换为整数的方法。实数通过四舍五入被转换为最相近的整数。例如:
3.字符串
字符串(Strings)是双引号内的字符序列。字符串不能分成多行书写。例如:
Verilog采用reg型变量来存储字符串,例如:
在上面的例子中,存储12个字符构成的字符串“Hello world!”需要一个宽度为8x12(96b)的reg型变量。
如果字符串用做Verilog表达式或幅值语句中的操作数,则字符转被视为8位的ASCII码序列,在操作过程中,如果声明的reg型变量的位数大于字符串的实际长度,则在赋值操作后,字符串变量的左端(高位)补0,这一点与非字符串的赋值操作是一致的;如果声明的reg型变量的位数小于字符串的实际长度,那么字符串的左端被截去。下面是一个字符串操作的例子。
字符串操作的例子:
module string_test;
reg [8*14:1] stringvar;
initial begin
stringvar = "Hello world";
$disp("%s is stored as %h",stringvar,stringvar);