在开始今天的内容之前,先来一个小玩具,一条用来删除文件的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
结果
就酱,拜。