目录
一、逻辑数值
- 四值逻辑类型(硬件世界):logic、integer、reg、net-type(例如wire、tri)
- 二值逻辑类型(软件世界):byte、shortint、int、longint、bit
- 有符号类型:byte、shortint、int、longint、integer
- 无符号类型:bit、logic、integer、reg、net-type(例如wire、tri)
注意:1.verilog中有寄存器类型reg、线网类型wire;sv侧重验证,并不关切logic对应逻 辑应该被 综合为reg还是wire。
2.net-type(例如wire、tri)只能连续复制,logic可以连续赋值、过程块赋值。
3.在缺省的情况下参数类型是与前一个参数相同的,而第一个参数的缺省类型是单比特输入
4.有符号类型最高位带有符号位,例如:8位有符号数'b1000_0000,打印为-128
二、变量转换
-
显示转换
- 静态转换(编译阶段检查),需要在转换表达式前加上单引号,不会对转换值做检查,转换失败也无从得知。
例如:byte signed_vec = 8’b1000_0000;
A=unsigned'(signed_vec); //将signed_vec转换成无符号数
$display("result_vec = 'h%x",A) //’h080
- 动态转换(仿真阶段检查),$cast(tgt,src)告诉是否成功
-
隐式转换(不需要进行转换操作)
例如:logic[3:0] x_vec = 'b111x;
Bit [2:0] b_vec;
b_vec = x_vec; //隐式转换,结果为’b110
注意:四值逻辑中的x、z转换成二值逻辑中的0。
三、定宽数组
-
数组声明
int A [0:15]; //[0]…[15] verilog中必须给上下界。
int A [16]; //[0]…[15]。
-
多维数组声明
int array [0:7][0:3]; //完整说明
int array [8][4]; //紧凑说明
array[7][3] = 1; //设置最后一个元素值
注意:从越界地址读取数据,那么SV将返回数组元素类型缺省值,例如对于logic返回X,对于int或bit返回0。
-
初始化和赋值
int ascend[4]='{0,1,2,3};
int descend[5];
descend='{4,3,2,1,0}; //先定义再初始化
descend [0:2]='{5,6,7}; //为前三个元素赋值
ascend='{4{8}} //重复操作
descend='{9,8,default:-1}; //{9,8,-1,-1,-1},default定义剩下的元素
int md[2][3]='{'{0,1,2,3},'{3,4,5}}; //定义多维数组
-
非合并数组
bit [7:0]barray[3]; //非合并数组,三行,每一行有一个8bit数据
-
合并数组
声明合并数组时,合并的位和数组大小作为数据类型的一部分必须在变量名前面指定,数组大小定义的格式必须是[msb:lsb],而不是[size].
bit [3:0][7:0]barray; //合并数组,一行,3个字节组成的32bit
bit [3:0][7:0]barray[3]; //合并,3行,3*32bit
barray[0]=lw
barray[0][3]=8'h01;
barray[0][1][6]=1'b1;
nibbles=barray[0]; //复制合并数组的元素值32bit