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