systemverilog(⼆)数据类型
⾸先 verilog-1995 中有两种基本数据类型:变量和线⽹(有四种取值,0,1,z,x)
变量可以是(所有存储都是静态的)
单⽐特或多⽐特的⽆符号数(reg [7:0] m)
32bit的有符号数(integer)
64bit的⽆符号数(time)
浮点数(real)
线⽹可以⽤来连接设计中不同的部分,例如门和模块实例(wire)
逻辑(logic)类型:任何使⽤线⽹的地⽅均可使⽤logic,但要求logic只能有⼀个驱动,不能有多个结构性的驱动(例如双向总线时,信号就需要被定义成线⽹类型,wire)
相⽐四状态数据类型,system verilog引⼊的双状态数据类型有利于提⾼仿真器的性能并减少内存的使⽤量
双状态变量连接到被测设计时,产⽣的X和Z的值会转换成双状态值(即随时检查未知值的传播,$i sunknown操作符,可以在表达式的任意位出现X或Z时返回1)
定宽数组
1、定宽数组的声明和初始化
verilog要求在声明中必须给出数组的上下界,⽽systemverilog允许只给出数组宽度的声明⽅式
可以通过在变量名后⾯指定维度的⽅式来创建多维定宽数组
如果代码试图从⼀个越界的地址中读取数据,那么systemverilog将返回数组元素的缺省值(对于四状态类型的数组,返回X;对于双状态类型,则返回0;适⽤于所有的数组类型,线⽹在没有驱动的时候输出是Z)
很多systemverilog仿真器在存放数组元素时使⽤32bit的字边界,所以byte,shortint和int都是存放在⼀个字中,⽽longint则存放到两个字中。(通常使⽤两个或两个以上连续的字来存放logic和integer等四状态类型)
例如:字节数组b_unpack存放到三个字的空间中
常量数组:使⽤⼀个单引号加⼤括号来初始化数组,可以部分或全部赋值,在⼤括号前标上重复次数可以对多个元素重复赋值,还可以为没有显式赋值的元素指定⼀个缺省值default
for 与 foreach
systemverilog的$size函数返回数组的宽度,在foreach循环中,只需要指定数组名并在后⾯的⽅括号中给出索引变量,systemverilog会⾃动遍历数组中的元素。
在多维数组中使⽤foreach并不是像[ i ][ j ]这样把每个下标分别列在不同的⽅括号中,⽽是⽤逗号隔开放在同⼀个⽅括号中,像[ i,j ]
打印多维数组的输出结果:
foreach循环会遍历原始声明中的数组范围,数组f[5]等同于f[0:4],⽽foreach(f[i])等同于for(int i=0;i<=4;i++);对于数组f[6:2]来说,foreach(f[i])语句等同于for(int i=6;i>=2;i–)
复制和⽐较:
⽐较只限于等于⽐较或不等于⽐较
同时使⽤位下标和数组下标
verilog 2001中改进,⽽在verilog 1995中不可以:
合并数组
合并数组enum类型如何使用
对某些数据类型,希望既可以把它作为⼀个整体来访问,也可以把它分解成更⼩的单元
声明合并数组时,合并的位和数组⼤⼩作为数据类型的⼀部分必须在变量名前⾯指定,数组⼤⼩定义的格式必须是[msb:lsb],⽽不是[size]
合并和⾮合并数组可以混合使⽤,可以使⽤数组来表⽰存储单元,这些单元可以按⽐特、字节或字的⽅式进⾏存储
使⽤⼀个下标,可以得到⼀个字的数据barray[2] ; 使⽤两个下标,可以得到⼀个字节的数据barray[0][3] ; 使⽤三个下标,可以访问单个⽐特位barray[0][1][6];注意,barray[3],这个维度是⾮合并的,所以使⽤该数组时⾄少有⼀个下标。对于@操作符,只能⽤于标量或者合并数组;可以把barray[0]⽤作敏感信号,但不能⽤整个barray数组,除⾮扩展成:@(barray[0] or barray[1] or barray[2])

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。