【system verilog】非合并数组、合并数组、混合数组和多维数组的小探讨

您所在的位置:网站首页 verilog中非怎么表示 【system verilog】非合并数组、合并数组、混合数组和多维数组的小探讨

【system verilog】非合并数组、合并数组、混合数组和多维数组的小探讨

2023-08-24 20:14| 来源: 网络整理| 查看: 265

前言

来了的话点个赞吱一声在走呀~~~

因为需要解决一个问题,所以决定对合并数组/非合并数组以及混合场景进行进行一下探索。

问题

已知一个多维混合数组的定义为:

bit [3:0][7:0][15:0] Array [3:0][7][6];

那么当我们写下

Array[2][3][2][2] = xxxx;

的时候,到底是对哪个位置赋值了??

话不多说,直接看解答好啦~最后的答案其实很简单,因为有一个简单的图示估计很多人知道,就是逆时针索引法:

因此可以得到结论:

好的,接下来进入学习时间,拿出书搞一搞。

非合并数组

当索引位于数组名称后方时候,我们定义的就是非合并数组:

bit [7:0] array1 [3];

其实我觉得上面这个数组可以认为是混合数组了,毕竟左侧也有索引,所以不妨用这个方式做示例,二者在内部存储上是等价的:

byte array1[3];

非合并数组在数据存储中,一般以字为边界(即32bit)来存储数据,典型的byte/int/shortint都是存储在一个字中,longint因为超出了一个字的边界因此存储在两个字当中(64bit空间)。如果数组元素位宽不足一个字,则使用低位存放数据,高位闲置不用。

 

 

非合并数组由于存储空间并不连续,因此无法对整体赋值只能够分开赋值,比如下面这种写法会报编译错误:

bit [7:0] array1[4]; array1 = '1;

多维的非合并数组

由于非合并数组是独立空间存储的,那么多维的也很好理解,牢记上面的逆时针索引规则,对于:

byte array[4][5][6];

可以直接理解为:独立的4个(独立的5个(独立的6个位宽为1byte的数据)),那么也就是4*5*6个byte独立数据。

合并数组

如果想能够整体进行赋值的话,那么就必须使用合并数组来进行定义,把数组名称右边的索引移到左边最前面去就可以了:

bit [3:0][7:0] array2;

此时合并数组的存储方式为:

 

那么更多维的合并数组也就很好理解了,就是在二维合并数组的基础上继续拼接,索引的时候按照逆时针原则从左往右看。

来看一个简单的例子:  

bit [1:0][1:0][1:0]array3; array3 = 8'h6B;

先预期以下,array3是被定义的8bit合并数组(2*2*2),整体赋值之后应该被赋值为下图形式:

此时我们如果取值array3[1]则会取到6,取值array3[1][1]则会取到1;

那么我们上机跑一下遍历打印看看:

bit [1:0][1:0][1:0]array3; array3 = 8'h6B; foreach(array3[i]) begin $display("array3[%0d] = 'h%0h", i, array3[i]); foreach(array3[i][j]) begin $display(" array3[%0d][%0d] = 'h%0h", i, j, array3[i][j]); foreach(array3[i][j][k]) begin $display(" array3[%0d][%0d][%0d] = 'h%0h", i, j, k, array3[i][j][k]); end end end

 跟我们的预测是一摸一样的:

混合数组

合并和非合并数组都研究的差不多了,最后就可以看下混合数组。其实看混合数组时候就是先看右侧的非合并数组,再看左侧的合并数组,看数组时都是从左往右看,那么总结起来就是逆时针规则了。

因此我认为前面理解清楚后,就没必要继续写了~~~



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3