1.数据类型-----内建数据类型
内建数据类型:
相比于verilog中的reg和wire之外,sv中新推出了logic类型:
在sv中与logic相对应的是bit类型,他们均可以构建矢量类型(vector),他们的区别在于:
logic为四值逻辑,既可以表示0、1、x、z。
bit为二值逻辑,只可以表示1、0。
为什么sv在一开始做设计的时候有4值了还要引入二值呢?
:::因为sv在一开始设计的时候就期望将硬件的世界与软件的世界分离开。
四值逻辑类型:integer,logic,reg,net-type(例如wire,tri)
二值逻辑类型:byte,shortint,int,longint,bit
如果按照有符号数和无符号的类型进行划分:
有符号类型:byte,shortint,int,longint,integer
无符号类型:bit,logic,reg,net-type(例如wire,tri)
注:这里有符号数的负数需要用补码的方式储存,补码的计算方法:
:::忽略符号位,对剩下的位数1取反再加1
如-127:因为是负数,所以符号位为-1,绝对值为127,所以低7位全部为1,取反后全部为0,再加1,就是000 0001,所以最终结果是1000 0001。
由于一个字节中最高位是符号位,所以,计算机中+0和-0的编码是不一样的,+0的编码是:0000 0000;-0的编码是:1000 0000。于是将1000 0000规定为-128,这样就可以让有符号数多一个有用的数据点。这个值不能用普通的取反加1来计算。
在sv中有多种转换数据的方式:
1.静态转换:即在需要转化的表达式前加上一个单引号即可:比如此处有一个有符号数a,
我要将它转化为无符号数b,可以这样:b = unsigned'(a);(在编译时就会告诉你是否成功)
2.动态转换:$cast(tgt,src)(仿真时才告诉你是否转化成功)
上面两个转换方式均需要操作符号或者系统函数介入,统称为显示转换。
而不需要操作符或者函数进行转换的一些操作,我们称之为隐式转换
ps:如果一个带x的四位数111x隐式转换(直接赋值)给一个三位的bit类型数据,答案一定会是110
因为四值里面的XZ转换为2值一定是0!!!
所以在做不同数据类型操作的时候一定要注意:
1.逻辑数值类型
2.符号类型
3.矢量位宽