目录
1.遍历
1.1for和foreach循环
一维数组:
program example1;
initial begin
bit [31:0] src[5], dst[5];//声明2个数组各自有5个32bits的元素
for (int i=0; i<$size(src); i++)//通过for循环遍历数组,$size是系统函数,会返回数组的个数
src[i] = i;//结果:0,1,2,3,4
foreach (dst[j]) dst[j] = src[j] * 2;//通过foreach循环遍历数组,结果:0,2,4,6,8
end
endprogram
多维数组:
//对于多维数组:
program example2;
int md[2][3]=' {'{0,1,2},'{3,4,5}};
initial begin
$display("initial value:");
foreach(md[i,j]) $display("md[%0d][%0d]=%0d",i,j,md[i][j]);//先遍历第0行所有列,再遍历第1行所有列
end
endprogram
/*结果:
initial value:
0,1,2,3,4,5 */
2.复制
对于复制,可以利用赋值符号“=”直接进行数组的复制
program example3;
bit [31:0] src[5] = '{0,1,2,3,4},dst[5];
initial begin
dst = src; // 数组复制,将src数组复制给dst数组
src[0] = 5; // 只改变一个元素的值,将第0号元素改变成5
$display(dst);//打印dst,看其是否得到了src的值,元素[0]是旧的值还是新值;
$display(src);//打印src,看是否改变了src[0]的值
end
endprogram
3.比较
在不使用循环的情况下,可以利用“==”或者“!=”来比较数组的内容,不过结果仅限于内容相同或者不相同
program example4;
bit [31:0] src[5] = '{0,1,2,3,4},dst[5] = '{5,4,3,2,1};
initial begin
if (src==dst) $display("src == dst");//比较数组,数量和各个位置的内容都相等才行
else $display("src != dst");
dst = src;//数组复制
src[0] = 5;//只改变一个元素的值
//所有元素是否相等
$display("src %s dst",(src==dst)?"==":"!=");//使用数组片段对第1-4个元素进行比较
$display("src[1:4] %s dst[1:4] ",(src[1:4]==dst[1:4])?"==":"!=");
end
endprogram
若要得到数组中的每个元素是否相等,可以用for循环遍历数组的每一个元素,并进行比较:
program example5;
bit [31:0] src[5] = '{0,1,2,3,4},dst[5] = '{5,4,3,2,1};
initial begin
dst = src;//数组复制
src[0] = 5;//只改变一个元素的值
for(int i=0; i<$size(src); i++) begin
if (dst[i]==src[i])
$display("src[%d] == dst[%d]",i,i);
else
$display("src[%d] != dst[%d] ",i,i);
end
/*也可用foreach循环来遍历
foreach(dst[i]) begin
if (dst[i]==src[i])
$display("src[%d] == dst[%d]",i,i);
else
$display("src[%d] != dst[%d] ",i,i);
end
*/
end
endprogram
4.运算
4.1 sum
4.2 product
4.3 and,or,xor
4.4 max,min,unique
program example;
int array[7]='{5,98,98,3,6,6,0};
int summ,j,a,o,x;
initial begin
$write("initial array:");
$display(array);
summ=array.sum;//求和
$write("sum array:");
$display(summ);
j=array.product;//求积
$write("product array:");
$display(j);
a=array.and;//and缩减数组,以二进制按位与
$write("and array:");
$display(a);
o=array.or;//or缩减数组,以二进制按位或
$write("or array:");
$display(o);
x=array.xor;//xor缩减数组,以二进制按位异或
$write("xor array:");
$display(x);
array.max;//数组中的最大值
$write("max array:");
$display(array.max);
array.min;//数组中的最小值
$write("min array:");
$display(array.min);
array.unique;//提取出数组中不重复的元素
$write("unique array:");
$display(array.unique);
end
endprogram
仿真结果如下:
这里需要重点注意的是:进行求和时,求和结果的位宽如果没有定义,则默认是加数中的最大位宽,如1'b1+1'b1+1'b1+1'b1=1'b0,若1'b1+1'b1+1'b1+1'b1+3'b0=3'b100=4。
5.排序
5.1 reverse翻转
5.2 shuffle乱序
5.3 sort升序
5.4 rsort降序
以上几种排序方法,通过以下代码示例:
program example;
int array[5]='{5,98,3,6,1};
initial begin
$write("initial array:");
$display(array);
array.reverse;//使整个数组调个个儿
$write("reverse array:");
$display(array);
array.shuffle;//乱序
$write("shuffle array:");
$display(array);
array.sort;//升序
$write("sort array:");
$display(array);
array.rsort;//降序
$write("rsort array:");
$display(array);
end
endprogram
运行结果:
6.定位
6.1 find
6.2 find_index
6.3 find_first/last_index
6.4 find_last/first
program example;
int array[6]='{9,1,8,3,4,4};
initial begin
$display(array.find with(item>3));//找到并列出大于3的元素
$display(array.find_index with(item>3));//找到并列出大于3的元素的位置
$display(array.find_first_index with(item>3));//找到并列出大于3的第一个元素的位置
$display(array.find_last_index with(item>3));//找到并列出大于3的最后一个元素的位置
$display(array.find_first with(item>3));找到并列出大于3的第一个元素
$display(array.find_last with(item>3));找到并列出大于3的最后一个元素
end
endprogram