sv中的数组基本操作:/*
Exercsise platform : Questa Sim 10.1b
*/
class Array;
int array[9:0] ;
function new();
for( int i = 0 ; 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
$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 <
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