Verilog-1995中规定的数据类型有:变量(reg), 线网(wire), 32位有符号数(integer), 64位无符号数(time), 浮点数(real)。
SV扩展了reg类型为logic,除了reg类型的功能外,可以用在连续赋值,门单元和模块所驱动。但是不能用在双向总线建模,不能有多点驱动。
其他数据类型:无符号双状态 bit,
有符号双状态32位 int,
有符号双状态8位 byte, //可以用内置函数 $isunknown
有符号四状态32位 integer,
无符号四状态64位 time,
有符号双状态浮点64位 real.
$isunknown()----在操作数中存在X、Z时,返回1。
$bits(expression)----返回expression占的位宽。
对于四状态类型的数据,缺省值为X,双状态类型的数据,缺省值是0.
很多SV仿真器在存放数据元素的时候都是使用32bit的字边界。所以byte、shortint、int都是存放在一个字中,longint则存放在两个字中。
对于四状态的数据,SV仿真器通常使用两个连续的字或更多的连续的双字来存放它们的值,所以四状态的变量会消耗双倍的空间。
连续的双字,一个字存放数据的0/1值,另一个字存放x/z状态。
foreach可以进行多维数据的递归调用,foreach(A[i,j])
定宽数组:
(pack)合并数组:将数组大小的定义放在等式左边 bit [3:0][7:0] bytes; //4个字节组成一个字,储存空间一个字。
(unpack)非合并数组:将数组大小的定义放在等式右边 bit [7:0] bytes [4]; //4个字节,这个仍是合并数组,但是4个存储空间不连续,这是非合并数组
unpacked array会被认为是一个vector,packed array会被认为是一个scalar。
unpacked array的声明有两种方式:
1. int array [0:7][0:31]; array delaration using ranges
2. int array [8][32]; array delaration using size
当需要和标量进行数据交换时,使用合并数组很方便,而且@操作符的数据只能是标量和合并数组。所以推荐使用合并数组,还节省空间。
bit [3:0][7:0] barray[3]; //当使用@操作符时,只能使用@(barray[0] or barray[1] or barray[2])不能使用整个barray。
bit [31:0] src[5] = `{0,1,2,3,4}, dst[5] = `{5,4,3,2,1}; //数组的直接初始化
if(src == dst)