verilog中数组的定义_systemverilog中⼏种数组类型的基础知
识
在开始今天的内容之前,先来⼀个⼩玩具,⼀条⽤来删除⽂件的bat语句。我发现questasim跟vim同时对⽂本进⾏修改的时候,同⽬录下会产⽣很多很多很多的中间⽂件,所以很久不⽤的bat⼜要搬出来了。语法⾮常简单,⼏秒钟就完事了。
国际环境保护del /a /f /q C:\Urs\foxxy\Desktop\sv_test\*.un~
del /a /f /q C:\Urs\foxxy\Desktop\sv_test\*.swp
del /a /f /q C:\Urs\foxxy\Desktop\sv_test\*.mpf
del /a /f /q C:\Urs\foxxy\Desktop\sv_test\*.mti
del /a /f /q C:\Urs\foxxy\Desktop\sv_test\*.bak
del /a /f /q C:\Urs\foxxy\Desktop\sv_test\*.sv~
del /a /f /q C:\Urs\foxxy\Desktop\sv_test\*.cr.mti
del /a /f /q C:\Urs\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]
excel统计$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;
/
/ Inrt new element at begin of queue
queue = {5, queue};
$display ("new element added using concate");
print_queue;
// Inrt using method at begining
queue.push_front(6);
网络基础$display ("new element added using push_front");
print_queue;
// Inrt using method at end
queue.push_back(7);
$display ("new element added using push_back");
print_queue;
// Using inrt to inrt, here 4 is index
// and 8 is value
queue.inrt(4,8);
$display ("new element added using inrt(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;
// U 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
结果就酱,拜。