首先 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 ]