书接上回:
sv标准研读第三章-设计和验证的building block
第5章 词法
5.1前言
主要内容:
- 词法标记(空格/注释/操作符)
- interger/real/string/array/structure/time
- 调用内建方法
- 属性
5.2词法标记
词法标记(lexical token)由一个或者多个字符组成。空格和换行符在词法上是不重要的,除非用作转义字符。词法标记包括:
- 空格
- 注释
- 操作符
- 数字
- 字符串
- 标识符
- 关键字
5.3空格
空格(White space)包含了:空格(space)、制表符(tab)、换行符(newline)、换页符(formfeeds)。这些空格都是不重要的,除非用于分隔其他lexical token。但是在字符串变量里,blank和tab是很重要的(见5.9)。
5.4注释
两种注释方式:
单行注释://
多行注释:/**/
5.5操作符
主要分为三种:一元操作符、二元操作符、三元操作符
5.6标识符、关键字和系统名称
标识符:分为两种:简单标识符和转义标识符。
简单标识符:由字母、数字、$、_组成;第一个字符不能是$和数字;标识符长度限定在1024个字符以内,超过报错;标识符区分大小写。
5.6.1转义标识符
转义标识符:由\开头,以空格(空格、制表符、换行符)结束。
5.6.2关键字
sv的关键字参考附录B。
5.6.3系统函数和方法
系统函数和方法:$+名字。
sv所有的系统函数和方法参见第20/21章。第36章还可以通过PLI调用其他语言的系统函数和方法。
5.6.4编译器指令
编译器指令:`+名字。
编译器指令在读取后立即生效,仅作用于一个编译单元。
sv所有的编译器指令参见第22章。
5.7数字
常量数字包括:整数常量和real常量。
5.7.1整数常量
整数常量的指定格式:2/8/10/16进制格式。
整数常量的书写格式有两种:简单的数字、based literal constant。
(1)简单的数字:[+/-]number;数字会被解析为signed数字。
(2)based literal constant:[+/-][size]’[base]number
【size】:必须是一个非零无符号十进制整数。
【base】:指定后面数字的基数,包括:d/D/h/H/o/O/b/B,不区分大小写;前面还可以加上s/S,表示这是一个有符号数,不加时会被解析为unsigned数字;【base】和’之间不能有空格。
【number】:必须是一个无符号数字或者x/z;如果是十六进制数字,不区分大小写;【number】和【base】之间可以有空格。
整数常量如果是负数,则会用补码表示。
如果【number】的真实size小于指定的【size】,那么【number】左边会填充0;如果【number】最左边bit是x/z,那么左边填充的是x/z;如果【number】的真实size大于指定的【size】,那么【number】左边会被截断。
当没有指定【size】时,数字的最小bit位是32;unsigned unsized数字如果最左边bit是x/z,那么左边会填充x/z。
这样的写法会把所有位都填充为0/1/x/z
?可以代替z
在十六进制中,1个?代表4bit z
在八进制中,1个?代表3bit z
在二进制中,1个?代表1bit z
在十进制中,unsigned数字不能包含x/z,除非只有1个数字,此时所有bit都是x/z。
多bit数字之间可以使用下划线_来提升可读性,但是第一个数字不能是下划线。
当给一个logic变量赋值时,无论这个logic变量是不是signed,只要赋的值是:sized负数或者sized signed数字,那么就会进行符号位扩展。
看几个例子:
注意:4’shf这里的s表示这是一个有符号数,但是并不会对后面的数字做补码操作,f这个数字应该是怎样就是怎样,所以打印出来还是“1111”。下面的-4’sd15一个一个分析,首先看4’sd15,同样s表示这是一个有符号数,但并不会对15这个数字做补码操作,所以15=1111,然后前面还有一个负号,负号需要对后面的数字做补码操作,那么1111的补码就是0001,所以打印出来就是0001。
5.7.2 real常量
real是双精度浮点数。
real数字有两种表示方式:十进制(例如:8.88)和科学计数法(例如:8e8)
real常量可以强制转换为shortreal(例如:shortreal’(8.88))
real数字转化为整数时是四舍五入到最近的整数,不是截断。如果距离相等,那么会四舍五入到远离0的数。例如:35.5会变成36;-3.5会变成-4
5.8 time常量
time常量:整数/浮点数+时间单位(s/ms/us/ns/ps/fs)
time常量的类型是realtime,并且和环境当前的时间单位和时间精度匹配。
5.9字符串常量
字符串常量:由双引号“”包裹字符串。数据类型是packed arrarys【宽度是8bit的整数倍】。当字符串常量被赋值给string类型的数据时,会进行隐式转换。
特殊字符前面要加反斜杠。
字符串如果需要书写在多行,在换行符前加上反斜杠\即可。
一个字符串常量被解析为8bit unsigned整型常量。
字符串常量可以被赋值为一个整型数据,一个字符占据8bit。如果整型数据的位宽大于字符数*8,那么左边会填充0;反之,左边会被截断。
5.9.1字符串常量中的特殊字符
指的是一些转义字符,包括:
\n:换行符
\t:水平制表符
\\:\
\”:”
\v:垂直制表符
\f:换页符
\a:响铃。【系统自带的扬声器会发出“叮”的一声】
\ddd:ddd对应1-3位八进制数;例如:\101,101是八进制数,对应十进制数是65,65对应的ASCII码是字符“A”,所以\101就是“A”
\xdd:dd对应1-2位十六进制数;例如:\x2A,2A是十六进制数,对应十进制数是42,42对应ASCII码是字符“*”,所以\x2A就是“*”
5.10结构体常量
结构体常量:举例:
还可以内嵌:
还可以带上成员名:
还可以赋默认值:
还可以带上数据类型:
还可以进行成员复制:
5.11数组
数组:用{{}}包裹起来
举例:
可以使用复制操作符:
可以赋默认值,还可以加上索引:
5.12属性
属性:用(* *)包裹起来,多个属性用逗号隔开
属性可以作为附加内容放在:声明/module/statement/port connection的前面;表达式操作数/函数名的后面。
属性如果没有写值,默认类型是bit,值是1。
重复定义了多次同名的属性,那么只会使用最后一次的属性,且会给出警告。
属性不允许嵌套。
举例:
5.13内建方法
内建方法的调用:对象.方法()
举例:
内建方法不同于系统函数和方法,它允许重新定义。