SV学习笔记—数组

SV学习笔记—数组目录 0 前言 1 定宽数组 1 1 packed 数组 1 2 unpacked 数组 1 2 1 一维数组 1 2 2 多维数组 packed 和 unpacked 数组的区别 1 3 混合数组 2 动态数组及操作 附 0 前言 SV 中的数组分类可见下图 1

大家好,我是讯享网,很高兴认识大家。

目录

0.前言

1.定宽数组

1.1 packed数组

1.2 unpacked数组

1.2.1 一维数组

1.2.2 多维数组

※packed和unpacked数组的区别?

1.3 混合数组

2.动态数组及操作

附:


0.前言

SV中的数组分类可见下图:


讯享网

1.定宽数组

定宽数组也叫固定数组,即在声明数组的时候就定义好该数组可以容纳多少个元素

1.1 packed数组

packed数组相当于一个只有一个元素的数组。

有时需要把数据当作一个整体来访问,同时又可以把它分解成更小的单元,此时就要引入packed数组。如一个32bit的寄存器,有时看成4个8bit的数据,有时看成一个无符号数据:

bit [3:0][7:0] bytes;//将4个8bits的数据组装成32bit的数据 bytes=32'haabb_ccdd;//或者bytes={8'haa,8'hbb,8'hcc,8'hdd},因为是一个整体所以要合并赋值 $display ("%h",bytes);//打印整个数组,即32'haabb_ccdd; $display ("%h",bytes[3]);//最高byte,即8'haa $display ("%b",bytes[3][7]);//最高bit位,即8'haa=8'b1010_1010中的最高位1

讯享网

图形化表示该数组如下: 

可见我们定义的bytes数组内部只有一个元素,但是其内部可以被分成4个8bits的数据。 

1.2 unpacked数组

当不需要把数据当作一个整体来访问时,使用unpacked数组:

讯享网bit [7:0] b_unpack[3];//该数组有3个元素,每个元素8bits,同时该数组也是个一维数组 b_unpack='{8'hff,8'hff,8'hff};

图形化表示如下: 

 可见该数组有3个元素,每个元素被分配了32bits的空间(也可能64bits,由仿真器系统等决定),但是实际每个元素只用了8bits的空间,还有24bits未用;可见使用unpacked会造成一定的空间浪费

1.2.1 一维数组

int lo_hi[0:2];//一维数组,3个元素,每个元素32bits int c_style[3]='{0,1,2};//同上 c_style='{3{2}};//c_style={2,2,2} c_style='{1,default:2};//c_style={1,2,2} 

1.2.2 多维数组

讯享网int array[0:1][0:2]; //unpacked数组,多维数组,表示2行3列 int array[2][3]='{'{0,1,2},'{3,4,5}};//赋值方法

  

但实际上存储时是不存在行列的,都是线性存储的方式,与C语言中的多维数据存储方式一样。 

※packed和unpacked数组的区别?

1.packed数组只有一个元素,而unpacked≥1个元素

2.声明方式不同,packed数组声明时,如bit [max:min] [max:min] bytes,在数组名称右边无[ ];而unpacked数组声明时,数组名称右边有[ ],如bit [7:0] b_unpack[min:max]。

3.赋值方式不同,packed数组由于只有一个元素是一个整体,因此直接让其等于一个数(整体赋值),或者用{ }合并的方式赋值;而unpacked数组是'{xxx,xxx,xxx}这样赋值表示每个数是独立的。

4.unpacked数组操作不当会造成空间浪费,而packed数组会节省空间。

1.3 混合数组

 混合数组是将packed和unpacked组合使用的数组:

program test; bit [3:0][7:0] m_array[0:2]; initial begin m_array[0]=32'haabbccdd; m_array[1]=32'haabbccdd; m_array[2]=32'haabbccdd; $display("m_array[0]=%0h",m_array[0]); $display("m_array[1][2]=%0h",m_array[1][2]); $display("m_array[1][2][3]=%0h",m_array[1][2][3]); end endprogram

仿真结果如下: 

图形化表示如下:

可见其中有3个元素,每个元素都可以被分为4个8bits的数据。

2.动态数组及操作

如果在程序执行之前不知道数组宽度而需要等程序执行之后确定数组宽度,这时可以用[ ]留空来定义动态数组,此时数组最开始是空的,但在调用之前,必须用new[]来指定宽度

讯享网program example1; int dyn[], d2[];//声明动态数组,元素个数不知道,每个元素32bits initial begin dyn=new[5]; //为dyn数组分配5个元素 foreach(dyn[j]) dyn[j]=j;//对元素进行初始化,此时dyn={0,1,2,3,4} d2=dyn; //将dyn数组复制给d2数组,此时d2={0,1,2,3,4} d2[0]=5; //更改元素的值,此时d2={5,1,2,3,4} dyn=new[10](dyn); //分配10个整数值并进行复制, 把新的数组的开始5个数用旧的元素覆盖,此时dyn={0,1,2,3,4,0,0,0,0,0} dyn=new[10]; //分配100个新的元素, 旧值不复存在,此时dyn={0,0,0,0,0,0,0,0,0,0} dyn.delete(); //删除所有元素 end endprogram

关联数组可见:

System Verilog学习4——数据类型-关联数组

SystemVerilog动态数组与关联数组

附:

如果在初始化之前访问数组成员,或者越界访问数组成员,对于元素类型是4值的会返回x,而对于元素类型是2值的会返回0,这时绿皮书上说的;当然对于不同的仿真器来说,可能并是不一样的,博主用的VCS的仿真器,其返回值都是x。

小讯
上一篇 2025-01-24 09:14
下一篇 2025-03-10 07:55

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/28807.html