学习记录2(数组和数组操作)

1.数组包括哪些?怎么定义的?
定宽数组:一般是一维数组,初始确定数组为位宽;
屏幕截图 2026-07-08 111154
多维数组:多指二维数组。
image
合并数组:将多个小bit(例如8bit、16bit)等合成一个整体来进行访问,也可以分解成更小的单元,例如32bit拆成4*8bit。
image
非合并数组:不需要把数据当成一个整体来访问,例如bit [7:0] unpack[3];定义了3bety,位宽是8bit,三个字节都只是用内存(默认32位4bety)的最低字节,其余三个字节不使用,浪费空间。
动态数组:数组大小不确定,可以用[]来留空,动态分配内存,但是调用前必须用new[]指定宽度
队列:
注:定宽,动态数组,非合并数组,结构体的初始化时需要加符号';队列不需要。
2.初始化之前,访问数组成员,会返回什么值?
四值逻辑:不定值x
二值逻辑:逻辑值0
3.for和foreach
for是经典循环语句,需要包含循环初值、循环条件、自增变量三个条件,在构建多维数组是还需要使用嵌套循环结构,sv中用过自带的可$size()来确定数组元素的数量。
foreach可大大简化for循环的结构,foreach(数组名[变量i])可自动检测数组的元素数量,并自发的执行对应数量的循环次数。
对于二维数组,直接foreach(数组名[变量i][变量j]),这能极大的简化嵌套循环,来提高开发者的效率。
简单的说foreach就是把for循环的括号里的那些直接简化成foreach。
4.sv中new()和new[]的区别?
new()为一个对象分配空间,初始化变量,并返回保存对象的地址。
new[]设定动态数组的大小。动态数组在编译时不知道元素个数,也就是数组的宽度,在运行仿真才知道。
相同点:他们都申请内存并且初始化变量。
不同点:调用new()函数仅创建了一个对象,而new[]操作则建立一个含有多个元素的数组。
例如:
new()用在systemverilog中OOP的构造函数;
构造函数除了分配内存外,还初始化变量,在默认情况下,将变量设置成默认的数值,二值变量为0, 四值变量为x, 当然也可以通过自定义的new函数将变量设置成你想要的数值;

class Transaction;
logic [31:0] addr, crc;
function new();
addr = 3;
endfunction : new
endclass
动态数组在最开始是空的,必须通过调用new[]来分配空间,同时在方括号中传递数组宽度;

int dyn[]; //声明动态数组
initial begin
dyn = new[5]; //分配5个元素
foreach (dyn[j]) dyn[j] = j; //对元素进行初始化
end
3.比较时的注意事项
比较最先确定的类型是否一致,如果不一致则会报错,其次就是比较数据类型和位宽,不一致同样会报错,在上述都没问题之后需要对数组元素进行比较,如果数组元素数量不一致,也同样会报错。
在所有的条件都满足之后才会进行逐元素对比,成立返回1,不成立返回0。
通常可以直接通过一个打印语句完成判断,因为数组的比较,直接用数组名即可。
image

posted on 2026-07-07 21:45  tuck0603  阅读(1)  评论(0)    收藏  举报

导航