分类
按照四值逻辑和二值逻辑进行区分:
四值逻辑:integer、reg、logic、net-type(例如wire、tri)
二值逻辑:byte、shortint、int、longint、bit
按照有无符号进行区分:
有符号:byte、shortint、int、longint、integer
无符号:bit、logic、reg、net-type(例如wire、tri)
练习部分
练习1.1(主要是为区分有无符号)
module datatype_1;
logic [7:0] logic_vector = 8'b1000_0000;
bit [7:0] bit_vector = 8'b1000_0000;
byte signed_vector = 8'b1000_0000;
initial begin
$display("logic_vector = %d", logic_vector);
$display("bit_vector = %d", bit_vector);
$display("signed_vector = %d", signed_vector);
end
endmodule
结果如下
练习1.2(有符号变量和无符号变量混用的运算)
module datatype_2;
byte signed_vector = 8'b1000_0000;
bit [8:0] result_vector;
initial begin
result_vector = signed_vector;
$display("@1 result_vector = 'h%x",result_vector);
result_vector = unsigned'(signed_vector);
$display("@2 result_vector = 'h%x",result_vector);
end
endmodule
结果如下:
练习1.3(四值逻辑给二值逻辑赋值时,X会变成0,二值逻辑如果位宽大,则高位补零)
module datatype_3;
logic [3:0] x_vector = 4'b111x;
bit [2:0] bit_vector_1;
bit [3:0] bit_vector_2;
bit [4:0] bit_vector_3;
initial begin
$display("@1 x_vector = 'b%b",x_vector);
$display("-------------------------------");
bit_vector_1 = x_vector;
$display("@2 bit_vector_1 = 'b%b",bit_vector_1);
$display("-------------------------------");
bit_vector_2 = x_vector;
$display("@2 bit_vector_2 = 'b%b",bit_vector_2);
$display("-------------------------------");
bit_vector_3 = x_vector;
$display("@2 bit_vector_3 = 'b%b",bit_vector_3);
end
endmodule
结果如下:
数组
定宽数组
int lo_hi[0:15]; //16个整数[0][1][2]............[15]
int c_style[16]; //16个整数[0][1][2]............[15]
多维数组
int array[0:1][0:2]; //完整声明
int array[2][3]='{{0,1,2},{3,4,5}} //紧凑声明并初始化
注:如果在初始化钱,访问数组成员,logic会返回X值,int或bit会返回0值;
练习1.4
module array1;
int lo_hi [0:15];
int lo_style [16];
int array[0:1][0:2] = '{{0,1,2},{3,4,5}};
int array1[2][3] = '{{0,1,2},{3,4,5}};
initial begin
$display("@1----%b",lo_hi[1]);
$display("@2----",lo_style);
$display("@3----%p",array);
$display("@4----%b",array1[0][2]);
$display("@5----%0d",array1[0][2]);
end
endmodule
%p:打印聚合表达式,例如解压缩模式,例如数组、结构体等。
SystemVerilog中指定打印格式_verilog打印-CSDN博客
结果如下:
合并数组
有时需要把数据当作一个整体来访问,同时又可以把它分解成更小的单元,此时就要引入合
并数组。如一个32bit的寄存器,有时看成4个8bit的数据,有时看成一个无符号数据。
bit [3:0][7:0] bytes; // 4个字节组装成32bit
bytes=32'haabb_ccdd;
$display ("%h" ,bytes); // 所有32bit, 即 32'haabb_ccdd;
$display ("%h" ,bytes[3]); // 最高byte, 即 8'haa
$display ("%b" ,bytes[3][7]); // 最高bit位,即 8'haa=8'b1010_1010
非合并数组
不需要把数据当作一个整体来访问.
bit [7:0] b_unpack[3]; //3个字节
module array2;
bit [3:0][7:0] bytes;
bit [7:0] b_unpack [3];
initial begin
bytes = 32'haabb_ccdd;
b_unpack[0] = 32'haa;
b_unpack[1] = 8'hcc;
b_unpack[2] = 8'hbb;
$display("-------------------");
$display("%p",bytes);
$display("%h",bytes);
$display("%h",bytes[3]);
$display("%b",bytes[3][7]);
$display("-------------------");
$display("%p",b_unpack);
$display("%h",b_unpack[0]);
$display("%h",b_unpack[1]);
$display("%h",b_unpack[2]);
$display("-------------------");
$display("%h",b_unpack[0][2]);
$display("%h",b_unpack[1][4]);
$display("%h",b_unpack[2][3]);
end
endmodule
结果如下:
动态数组:
在程序执行之前不知道数组宽度,可以用[ ]留空来定义动态数组。此时数组最开始是空的,但在调用之前,必须用new[]来指定宽度。
int dyn[], d2[]; //声明动态数组
Initial begin
dyn=new[5]; // 分配5个元素
dyn='{0,1,2,3,4}; // 对元素进行初始化
d2=dyn; //复制一个动态数组
d2[0]=5; //更改元素的值
dyn=new[20](dyn); //分配20个整数值并进行复制, 把新的数组的开始5个数用旧的元素覆盖
dyn=new[100]; //分配100个新的元素, 旧值不复存在
dyn.delete(); //删除所有元素
end
队列
SV引入一个新的数据类型,它结合了链表和数组的优点,可以在队列中的任何地方添加或者删除元素;
队列的声明使用[$],元素的编号从0到$;
int j=1,
q2[$]={3,4},
q[$]={0,2,5}; //声明队列,并初始化一些元素
Initial begin
q.insert(1, j); // 在q队列的第二个元素(排列位置从0开始数)之前插入j,
// 队列q变成{0,1,2,5}
q.insert(3,q2[0]); //在q队列的第四个元素(排列位置从0开始数)之前
q.insert(4,q2[1]); // 插入队列q2的元素,队列q变成{0,1,2,3,4,5}
$display(q);
q.delete(1); //删除第1个元素(排列位置从0开始数), 队列变成{0,2,3,4,5}
q.push_front(6); //在队列前插入6, q队列变成{6,0,2,3,4,5}
j = q.pop_back; //把最后一个元素pop出来,赋值给j, j=5, q队列变成{6,0,2,3,4}
q.push_back(8); //在队列尾部插入8, q队列变成{6,0,2,3,4,8}
j = q.pop_front; //把第一个元素pop出来,赋值给j, j=6, q队列变成{0,2,3,4,8}
foreach (q[i])
$display(q[i]); //打印整个队列
q.delete(); //删除整个队列
end