systemverilog中的数组操作

sv中的数组基本操作:

/*    
  Exercsise platform :     Questa Sim 10.1b
*/
class Array;
  int array[9:0] ;
  
  function new();
     for( int i = 0 ; i < 10 ; i++ )
         array[i] = i ;
      /*
          array = '{'{1,2,3},'{5{5}},default:0};
          无法使用这种基本的赋值方式,可能是编译器的版本过低了
      */
  endfunction:new
  
   function void print();
    foreach(array[i]) begin
      $display(" array[%d] = %d ",i,array[i]);
    end
    for ( int i = 0 ; i < 10 ; i++ )begin
      $write(" ** ");
    end
    $display();
  endfunction:print
  
  function void funcs();
      int pos[$] ;
    //   缩减操作 xor , or , and ,  xnor  , sum , product 等
    $display("the sum is %d ",array.sum());
    $display("the and is %d ",array.and());
    $display("the  or is %d ",array.or() );
    $display("the xor is %d ",array.xor());
    $display("the product is %d ",array.product());
    
    //   索引操作:取得相应的所需要的数组原素位置
    $display(" max value is %d ",array.max()[0]);
    $display(" min value is %d ",array.min()[0]);
    array = array.unique();
    print();       //  在类中时,调用自己类的函数,可以直接调用。这点与cpp相同
    pos = array.find with ( item == 7 ) ; 
    //  find 有多种变体: find_first   find_last  find_first_index   find_last_index
    $display(" pos : %d ? value: %d ",pos[0],array[pos[0]]);
    
    //  排序操作: sort ,  rsort  , reverse , shuffle , 
    // 其中 sort ,rsort  可以与with相结合,根据with后的条件排序
    array.shuffle();
    $display("shuffled:");
    print();
    array.sort();
    $display("Sorted:");
    print();
    array.rsort();
    $display("Resorted:");
    print();
    array.reverse();
    $display("Reversed:");
    print();  
  endfunction:funcs
endclass:Array
module top;
  Array array;
  int arr[] ;     //   动态数组的声明
  
  initial begin
    //  initial process
    array=new();
    array.print();
    array.funcs();
    arr = new[20];   //   分配内存大小
    foreach(arr[i]) $display(" arr[%2d] = %d ",i,arr[i]); 
    $display("***************");
    arr.delete();
  end
endmodule
//   所有关于定长数组的操作都可以用在动态数组上


仿真结果:

# ** Note: (vsim-3812) Design is being optimized...
# 
# Loading sv_std.std
# Loading work.array_sv_unit(fast)
# Loading work.top(fast)
>>>run
#  array[          9] =           9 
#  array[          8] =           8 
#  array[          7] =           7 
#  array[          6] =           6 
#  array[          5] =           5 
#  array[          4] =           4 
#  array[          3] =           3 
#  array[          2] =           2 
#  array[          1] =           1 
#  array[          0] =           0 
#  **  **  **  **  **  **  **  **  **  **  
# the sum is          45 
# the and is           0 
# the  or is          15 
# the xor is           1 
# the product is           0 
#  max value is           9 
#  min value is           0 
#  array[          9] =           0 
#  array[          8] =           1 
#  array[          7] =           2 
#  array[          6] =           3 
#  array[          5] =           4 
#  array[          4] =           5 
#  array[          3] =           6 
#  array[          2] =           7 
#  array[          1] =           8 
#  array[          0] =           9 
#  **  **  **  **  **  **  **  **  **  **  
#  pos :           7 ? value:           2 
# shuffled:
#  array[          9] =           2 
#  array[          8] =           8 
#  array[          7] =           0 
#  array[          6] =           4 
#  array[          5] =           7 
#  array[          4] =           1 
#  array[          3] =           9 
#  array[          2] =           5 
#  array[          1] =           6 
#  array[          0] =           3 
#  **  **  **  **  **  **  **  **  **  **  
# Sorted:
#  array[          9] =           0 
#  array[          8] =           1 
#  array[          7] =           2 
#  array[          6] =           3 
#  array[          5] =           4 
#  array[          4] =           5 
#  array[          3] =           6 
#  array[          2] =           7 
#  array[          1] =           8 
#  array[          0] =           9 
#  **  **  **  **  **  **  **  **  **  **  
# Resorted:
#  array[          9] =           9 
#  array[          8] =           8 
#  array[          7] =           7 
#  array[          6] =           6 
#  array[          5] =           5 
#  array[          4] =           4 
#  array[          3] =           3 
#  array[          2] =           2 
#  array[          1] =           1 
#  array[          0] =           0 
#  **  **  **  **  **  **  **  **  **  **  
# Reversed:
#  array[          9] =           0 
#  array[          8] =           1 
#  array[          7] =           2 
#  array[          6] =           3 
#  array[          5] =           4 
#  array[          4] =           5 
#  array[          3] =           6 
#  array[          2] =           7 
#  array[          1] =           8 
#  array[          0] =           9 
#  **  **  **  **  **  **  **  **  **  **  
#  arr[ 0] =           0 
#  arr[ 1] =           0 
#  arr[ 2] =           0 
#  arr[ 3] =           0 
#  arr[ 4] =           0 
#  arr[ 5] =           0 
#  arr[ 6] =           0 
#  arr[ 7] =           0 
#  arr[ 8] =           0 
#  arr[ 9] =           0 
#  arr[10] =           0 
#  arr[11] =           0 
#  arr[12] =           0 
#  arr[13] =           0 
#  arr[14] =           0 
#  arr[15] =           0 
#  arr[16] =           0 
#  arr[17] =           0 
#  arr[18] =           0 
#  arr[19] =           0 
# ***************

关联数组:

此数组适用于进行存储量较大时的情况,存储方式不是线性的直接存储,而是使用树或者hash的结构,节省空间

module coarr;
  bit[63:0]  rom[bit[63:0]] ;   // 构建关联数组
  bit[63:0]  idx ;     //  相对应的索引
  
  function automatic void print(bit[63:0] pos, ref bit[63:0] rom[bit[63:0]]);
    $display(" rom[%d] = %d ",pos,rom[pos]);
  endfunction:print
  
  initial begin
     idx = 1 ;
     repeat(64) begin        //  对关联数组初始化,但实际上只存储了64个值
       rom[idx] = idx ;
       idx = idx << 1 ;
     end
     
     if( rom.first(idx)) begin     //  找到第一个索引的位置
       print(idx,rom);
       while( rom.next(idx) ) print(idx,rom);    //   找到之后的索引的位置
     end
      
  end
endmodule:coarr

仿真结果:

#  rom[            1] =                    1 
#  rom[           2] =                    2 
#  rom[          4] =                    4 
#  rom[           8] =                    8 
#  rom[          16] =                   16 
#  rom[          32] =                   32 
#  rom[          64] =                   64 
#  rom[          128] =                  128 
#  rom[         256] =                  256 
#  rom[          512] =                  512 
#  rom[         1024] =                 1024 
#  rom[         2048] =                 2048 
#  rom[         4096] =                 4096 
#  rom[         8192] =                 8192 
#  rom[        16384] =                16384 
#  rom[        32768] =                32768 
#  rom[         65536] =                65536 
#  rom[        131072] =               131072 
#  rom[        262144] =               262144 
#  rom[        524288] =               524288 
#  rom[       1048576] =              1048576 
#  rom[       2097152] =              2097152 
#  rom[       4194304] =              4194304 
#  rom[       8388608] =              8388608 
#  rom[       16777216] =             16777216 
#  rom[       33554432] =             33554432 
#  rom[       67108864] =             67108864 
#  rom[      134217728] =            134217728 
#  rom[      268435456] =            268435456 
#  rom[      536870912] =            536870912 
#  rom[      1073741824] =           1073741824 
#  rom[      2147483648] =           2147483648 
#  rom[      4294967296] =           4294967296 
#  rom[      8589934592] =           8589934592 
#  rom[     17179869184] =          17179869184 
#  rom[     34359738368] =          34359738368 
#  rom[     68719476736] =          68719476736 
#  rom[     137438953472] =         137438953472 
#  rom[     274877906944] =         274877906944 
#  rom[     549755813888] =         549755813888 
#  rom[     1099511627776] =        1099511627776 
#  rom[    2199023255552] =        2199023255552 
#  rom[    4398046511104] =        4398046511104 
#  rom[     8796093022208] =        8796093022208 
#  rom[    17592186044416] =       17592186044416 
#  rom[    35184372088832] =       35184372088832 
#  rom[    70368744177664] =       70368744177664 
#  rom[    140737488355328] =      140737488355328 
#  rom[   281474976710656] =      281474976710656 
#  rom[   562949953421312] =      562949953421312 
#  rom[   1125899906842624] =     1125899906842624 
#  rom[   2251799813685248] =     2251799813685248 
#  rom[   4503599627370496] =     4503599627370496 
#  rom[   9007199254740992] =     9007199254740992 
#  rom[  18014398509481984] =    18014398509481984 
#  rom[  36028797018963968] =    36028797018963968 
#  rom[  72057594037927936] =    72057594037927936 
#  rom[  144115188075855872] =   144115188075855872 
#  rom[  288230376151711744] =   288230376151711744 
#  rom[  576460752303423488] =   576460752303423488  
#  rom[ 1152921504606846976] =  1152921504606846976 
#  rom[ 2305843009213693952] =  2305843009213693952 
#  rom[ 4611686018427387904] =  4611686018427387904 
#  rom[ 9223372036854775808] =  9223372036854775808


猜你喜欢

转载自blog.51cto.com/13824643/2142030