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

前言

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

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

问题

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

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

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

混合数组

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

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

  • 53
    点赞
  • 139
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 19
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尼德兰的喵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值