sv标准研读第五章-词法

书接上回:

sv标准研读第一章-综述

sv标准研读第二章-标准引用

sv标准研读第三章-设计和验证的building block

sv标准研读第四章-时间调度机制

5 词法

5.1前言

主要内容:

  1. 词法标记(空格/注释/操作符)
  2. interger/real/string/array/structure/time
  3. 调用内建方法
  4. 属性

5.2词法标记

词法标记(lexical token)由一个或者多个字符组成。空格和换行符在词法上是不重要的,除非用作转义字符。词法标记包括:

  1. 空格
  2. 注释
  3. 操作符
  4. 数字
  5. 字符串
  6. 标识符
  7. 关键字

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内建方法

内建方法的调用:对象.方法()

举例:

内建方法不同于系统函数和方法,它允许重新定义。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值