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、枚举类型

 

posted @ 2020-02-02 12:12  笑着刻印在那一张泛黄  阅读(996)  评论(0编辑  收藏  举报