首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

SystemVerilog中非合并数组、合并数组、混合数组和多维数组的小探讨

前言

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

问题

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

那么当我们写下

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

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

因此可以得到结论:

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

非合并数组

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

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

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

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

多维的非合并数组

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

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

合并数组

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

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

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

来看一个简单的例子:

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

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

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

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

混合数组

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

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

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20230207A087FX00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券