zoukankan      html  css  js  c++  java
  • 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、枚举类型

  • 相关阅读:
    BZOJ 1968: [Ahoi2005]COMMON 约数研究
    BZOJ 2463: [中山市选2009]谁能赢呢?
    BZOJ 2462: [BeiJing2011]矩阵模板
    hihoCoder 后缀自动机三·重复旋律6
    hihoCoder #1445 : 后缀自动机二·重复旋律5
    BZOJ 2179: FFT快速傅立叶
    BZOJ 3926: [Zjoi2015]诸神眷顾的幻想乡
    BZOJ 2946: [Poi2000]公共串
    BZOJ 2882: 工艺
    SPOJ LCS2
  • 原文地址:https://www.cnblogs.com/wt-seu/p/12251662.html
Copyright © 2011-2022 走看看