提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
相应于verilog将变量类型(如reg)和线网类型(如wire)区分得如此清楚,在SV中新引入了一个数据类型logic。它们的区别和联系在于:
Verliog作为硬件描述语言,倾向于认为设计人员自身懂得所描述的电路中哪些变量应被实现为寄存器,哪些变量应被实现为线网类型。这不但有利于后端综合工具,更便于阅读和理解。
SV作为侧重于验证的语言,并不十分关心logic类型对应的逻辑应被综合为寄存器还是综合为线网,因为如果logic类型被使用的场景是验证环境,那么他只是作为单纯的变量进行赋值操作,而这些变量只属于软件环境构建。
推出logic类型的另一个原因是方便验证人员驱动和连接硬件模块而省去考虑使用reg还是wire的精力。这既节省时间,也避免了出错的可能。
与logic类型对应的数据类型是bit类型,它们均可用来构建矢量类型,区别在于:
logic为四值逻辑,即可以表示0、1、x、z
bit为二值逻辑,只可表示0和1
SV为什么在已有四值逻辑的基础上再引入二值逻辑呢?这是因为,SV在一开始设计时就期待将硬件和软件的世界分离开。在这里,硬件的世界指的就是硬件设计,所以四值逻辑属于这个世界;而软件的世界即验证环境,这里更多的是二值逻辑。所以,有了二值逻辑,验证环境在进行数据运算时不但能提高效率,还能省去其他不必要思考的问题。
在这里,我们将四值逻辑的类型和二值逻辑的类型分离列出来:
四值逻辑类型:integer、reg 、logic 、net_type(如wire、tri)
二值逻辑:byte、shortint、int、longint、bit
如果按照有符号和无符号的划分,那么可以将常见的变量类型划分为:
有符号类型:byte、shortint、int、longint、interer
无符号类型:bit、logic、reg、net_type(如wire、tri)
遇到这些变量类型时,要注意它们的逻辑类型和符号类型。在变量 运算中,应尽量避免对两种不一致的变量进行操作而导致意外的错误。比如,从下面的例子中可以看到有符号变量和无符号变量混用的运算结果会出乎意料:
我们这里分析一下:
对于转换方式,我们在上面展示了一种转换方式——静态转换,即在转换的表达式前加上单引号即可,而该方式并不对转换值做检查。如果发生转换失败,我们无从得知,所以与之对应的动态转化$cast(tgt,src)也经常运用到转换操作中。静态转换和动态转换均需要操作符合或者介入系统函数,统称为显示转换。
不需要进行转换的一些操作我们称之为隐式转换。
在操作不同的数据类型时,应该注意变量的