02-SV数据类型
1、数据类型
内建数据类型:逻辑(logic)类型、双状态数据类型(bit,byte,shortint,int,longint)、四状态数据类型(integer,time,real)
SV对经典的reg数据类型进行了改进,使得它除了作为一个变量以外,还可以被连续赋值、门单元和模块所驱动,这种数据类型被称为logic。任何使用线网的地方均可以使用logic,但要求logic不能有多个结构性的驱动,例如在对双向总线建模的时候,这时需要使用线网wire类型。其实logic同时具备了wire和reg的属性,可以过程赋值、连续赋值、门驱动、模块驱动。
其他:定宽数组、动态数组、队列、关联数组、字符串、枚举类型
合理选择数据类型:
网络数据包:长度固定,顺序存取——定宽数组或者动态数组
保存期望值的计分板:仿真前长度未知,按值存取,长度经常变化——队列
有序结构:数据按照可预见的顺序输出——队列 输出顺序不确定——关联数组
超过百万个条目的特大容量存储器模型:不需要用到所有的存储空间——关联数组,可以考虑双状态的合并数据进一步减少存储量
文件的命令名或操作码:把字符串转化成固定值——关联数组
指令中的操作码或者状态机中的状态名—— 枚举类型
2、定宽数组
⑴合并数组
⑵合并数组与非合并数组的选择
使用合并数组有助于节省存储空间
1 module sv_test1( 2 ); 3 // constant array 4 int md1[2][3]='{'{1,2,3},'{4,5,6}}; 5 int md2[2][3]='{'{1,2,3},'{4,5,6}}; 6 bit [31:0] md3[5] = '{5{5}}; 7 8 // packed array 9 bit [3:0][7:0] bytes; 10 11 initial begin 12 // access array 13 foreach(md1[i,j]) begin 14 $display("md1[%0d][%0d]=%0d",i,j,md1[i][j]); 15 end 16 17 // compare arrsy 18 if(md1==md2) begin 19 $display("equal"); // equal 20 end 21 22 // Use both bit and array indices 23 $displayb(md3[0][2:0]); // 101 24 $displayb(md3[0][2:1]); // 10 25 26 // paked array 27 bytes = 32'hCafe_Dada; 28 $displayh(bytes,, // cafedada 29 bytes[3],, // ca 30 bytes[3][7]); // MSB 1 31 end 32 33 34 endmodule
3、动态数组
1 int dyn[],dyn2[]; 2 initial begin 3 $display("========= dynamic array =========="); 4 dyn = new[5]; 5 foreach(dyn[i]) dyn[i] = i; 6 dyn2 = dyn; 7 dyn2[0] = 5; 8 $display(dyn[0],dyn2[0]); // 0 5 9 dyn.delete(); 10 dyn2.delete(); 11 end
4、队列
(1)队列的声明是使用带有美元符号的下标[$],队列元素的编号从0到$,队列的常量不需要使用‘
1 int j = 1; 2 int q[$] = {0,2,5}; // {0,2,5} 3 initial begin 4 $display("========= queue ========="); 5 q.insert(1,j); // {0,1,2,5} 6 q.delete(1); // {0,2,5} 7 q.push_front(3); // {3,0,2,5} 8 j = q.pop_back; // j=5 {3,0,2} 9 $display("j=%0d",j); 10 q.push_back(4); // {3,0,2,4} 11 j = q.pop_front; // j=3 {0,2,4} 12 $display("j=%0d",j); 13 foreach(q[i]) $display(q[i]); 14 q.delete(); 15 end
5、关联数组
用于稀疏化存储,也可以像perl中的哈希一样用字符串进行索引。
1 // associative array 2 int associative_array[string]; 3 initial begin 4 $display("=========== associative array =============="); 5 associative_array["min_address"] = 2; 6 associative_array["max_address"] = 100; 7 foreach(associative_array[s]) 8 $display("associative_array[%s]",s,associative_array[s]); 9 end
6、链表
SystemVerilog的队列比链表更加高效易用。
7、枚举类型