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);