verilog中数组的定义_systemverilog中几种数组类型的基础知识

在开始今天的内容之前,先来一个小玩具,一条用来删除文件的bat语句。我发现questasim跟vim同时对文本进行修改的时候,同目录下会产生很多很多很多的中间文件,所以很久不用的bat又要搬出来了。语法非常简单,几秒钟就完事了。

del /a /f /q C:\Users\foxxy\Desktop\sv_test\*.un~

del /a /f /q C:\Users\foxxy\Desktop\sv_test\*.swp

del /a /f /q C:\Users\foxxy\Desktop\sv_test\*.mpf

del /a /f /q C:\Users\foxxy\Desktop\sv_test\*.mti

del /a /f /q C:\Users\foxxy\Desktop\sv_test\*.bak

del /a /f /q C:\Users\foxxy\Desktop\sv_test\*.sv~

del /a /f /q C:\Users\foxxy\Desktop\sv_test\*.cr.mti

del /a /f /q C:\Users\foxxy\Desktop\sv_test\*.wlf

bat常用的词缀倒是值得记录一下:

/p

提示您确认是否删除指定的文件。

/f

强制删除只读文件

/s

从当前目录及其所有子目录中删除指定文件。显示正在被删除的文件名。

/q

指定静音状态。不提示您确认删除。

/a

根据指定的属性删除文件。

接下来是今天的正戏:

今儿复习一下systemverilog的几种数组类型的使用,分别是1固定数组:填充和非填充,2多维数组,3动态数组,4联合数组,5队列。具体语法解释网上大把,我这里就纯当提供一个现成的代码供小伙伴们快速跑一跑,我觉得是重点的地方也在代码里注释出来了。

module packed_unpacked_multi_dynamic_queue();

//可以这么理解[数字:数字]总是跟着修饰它前面的东西的。所以在中间的[数字]是修饰元素占了几位空间的。最后的[数字]是修饰名字的,所以是表示这个名字代表由几个元素组成的数组。

//固定数组:packed和unpacked两种

// 1.packed array

bit [7:0] packed_array = 8'h01; //一个元素叫packed_array

bit [0:7] packed_array_1 = 8'h01;

// 2-1.unpacked array,有了[数组修饰]之后,就会带来空间浪费

reg unpacked_array [7:0] = '{0,0,0,0,0,0,0,1}; //一个数组,分别为unpacked_array[0]-[7]

reg unpacked_array_1 [0:7] = '{4{0,1}};

reg unpacked_array_2 [0:7] = '{0,0,0,0,0,0,0,1};

//2-2sv允许[数组修饰]简便表达一样的,下面俩等效。

int i[0:15];

int i_1[16];

//3.同理,多维数组也能简便表达。

int multi_unpack[3][2] = '{ '{0,1}, '{2,3}, '{4,5}};//这是比较推荐的

//4.混合数组,通过在[元素修饰]中多填充一个描述来让内存的占用紧凑起来,实质还是元素修饰加数组修饰

bit [3:0][7:0] mixed_array[0:2];//为了让看起来好区分,一般[元素修饰]从大到小[数组修饰]从小到大,这样也比较符合习惯

//5.动态数组

int dynamic_array[]; //no space assign now

//6.联合数组

bit [7:0]age[string];

string tom = "tom";

//7.队列

integer queue[$] = { 0, 1, 2, 3, 4 };//注意队列的赋值不需要在前面加'了,这是与固定数组区别的地方

integer container;

task print_queue;

integer i;

$write("Queue contains ");

for (i = 0; i < queue.size(); i ++) begin

$write (" %g", queue[i]);

end

$write("\n");

endtask

initial begin

//1.2.两种固定数组

$display ("print_packed_unpacked:");

$display ("packed array = %b", packed_array);//整体

$display ("packed array_1 = %b", packed_array);//[元素修饰]从大到小和从小到大没区别,都是默认最右边是第0位

$display ("packed array[0] = %b", packed_array[0]);//显示某个位数

$display ("unpacked array[0] = %b", unpacked_array[0]);

$display ("unpacked array[7] = %b", unpacked_array[7]);

$display ("unpacked array_1[0] = %b", unpacked_array[0]);

$display ("unpacked array_1[7] = %b", unpacked_array[7]);//[数组修饰]从大到小和从小到大没区别,都是默认最右边是第0个。

//3.多维数组:两种用循环来赋值的方式

//3-1.for赋值

$display ("array_assignment_in_FOR_method:");

for (int i=0;i

begin

for (int j=0;j

begin

multi_unpack[i][j]=i+j;

$display ("multi_unpack[i][j] = %b", multi_unpack[i][j]);

end

end

//3-2.foreach赋值,跟tcl里面的foreach一样的,唯一要注意的是这里用的是[i,j],而不是[i][j]

$display ("array_assignment_in_FOREACH_method");

//automatic int i = 2;

foreach (multi_unpack[i,j])

begin

multi_unpack[i][j]=1;

$display("multi_unpack[i,j]:%0d", multi_unpack[i][j]);

end

//4.混合数组,就是把packed和unpacked组合了起来,这样可以达到解决unpacked数组浪费内存空间的情况,但代价是写起下标来麻烦一丢丢

$display ("mixed_array:");

mixed_array[2][7][3]=1;//注意混合数组的赋值是先[数组修饰],再[元素修饰],而在这两个部分内部都是从左到右的

$display ("mixed_array[2][7][3] = %b", mixed_array[2][7][3]);

//5.联合数组,就类似python中的dict

$display ("associate_array:");

age[tom] = 21;

age["joe"] = 32;

$display("%s is %d years of age ",tom, age[tom]);

$display("%s is %d years of age ","joe", age["joe"]);

//6.动态数组赋值

$display ("dynamic_array:");

dynamic_array = new[10];

foreach(dynamic_array[i])

begin

dynamic_array[i]=i;

$display ("dynamic_array[i] = %b", dynamic_array[i]);

end

dynamic_array.delete();//跟C一样,new的东西要自己delete

//7.队列操作

$display ("Initial value of queue:");

print_queue;

// Insert new element at begin of queue

queue = {5, queue};

$display ("new element added using concate");

print_queue;

// Insert using method at begining

queue.push_front(6);

$display ("new element added using push_front");

print_queue;

// Insert using method at end

queue.push_back(7);

$display ("new element added using push_back");

print_queue;

// Using insert to insert, here 4 is index

// and 8 is value

queue.insert(4,8);

$display ("new element added using insert(index,value)");

print_queue;

// get first queue element method at begining

container = queue.pop_front();

$display ("element poped using pop_front");

print_queue;

// get last queue element method at end

container = queue.pop_back();

$display ("element poped using pop_end");

print_queue;

// Use delete method to delete element at index 4 in queue

queue.delete(4);

$display ("deleted element at index 4");

print_queue;

#1 $finish;

end

endmodule

结果

就酱,拜。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值