【IEEE_SV-7.8】关联数组用法

7.8 Associative arrays

动态数组对于处理数量动态变化的连续变量集合很有用。当集合的大小未知或数据空间稀疏时,关联数组是更好的选择。关联数组在被使用之前不会分配任何存储空间,并且索引表达式不限于整数表达式,而可以是任何类型。
关联数组实现其声明类型的元素的查询表。要用作索引的数据类型用作查找键并强制排序。
明关联数组的语法如下:
data_type array_id [ index_type ];
这里
data_type是数组元素的数据类型。可以是适用于固定大小数组的任何类型
array_id 是要声明的数组的名称。
index_type 是作为索引的数据类型或是*。如果指定了*,则数组由任意大小的任意整数表达式索引。索引类型将索引表达式限制为特定类型。index_type声明类型是非法的。
关联数组声明的例子如下:

integer i_array[*]; // 整数关联数组 (未指定索引)
bit [20:0] array_b[string]; // 21位向量的关联数组,字符串索引
event ev_array[myClass]; // 按类myClass索引的event类型的关联数组

关联数组中的数组元素是动态分配的。一个不存在的关联数组元素的项,当它被用作赋值的目标或实际的引用传递的参数时,应该被分配。关联数组维护已赋值的项以及它们根据索引数据类型的相对顺序。关联数组元素是非合并。换句话说,除了复制或比较数组之外,必须从数组中选择一个单独的元素,然后才能在大多数表达式中使用它。

7.8.1 Wildcard index type

例子:
int array_name [*];
指定通配符索引类型的关联数组有以下属性:
— 数组可以被任何整数表达式索引。因为索引表达式的大小可能不同,所以相同的数值可以有多个表示,每个表示的大小都不同。通过删除前导零、计算最小长度并使用该值的表示来解决这种不确定性。
— 非整型索引值是非法的,会导致错误。
— 包含X或Z的4状态索引值无效。
— 索引表达式是自主确定的,并被视为无符号的。
— 字符串字面值索引会自动转换为大小相等的位向量。
— 顺序是数值的(从最小到最大)。
— 指定通配符索引类型的关联数组不能用于foreach循环(见12.7.3)或返回索引值或值数组的数组操作方法(见7.12)。

7.8.2 String index

例如:
int array_name [ string ];
指定字符串索引的关联数组具有以下属性:
— 索引可以是字符串或任意长度的字符串字面值。其他类型是非法的,将导致类型检查错误。
— 空字符串“”索引是有效的。
— 排序是按字典顺序的(由小到大)。

7.8.3 Class index

例如:
int array_name [ some_Class ];
指定类索引的关联数组有以下属性:
— 索引可以是特定类型的对象或从该类型派生的对象。任何其他类型是非法的,将导致类型检查错误。
— 空null索引是有效的。
— 排序是确定的,但是任意的。

7.8.4 Integral index

例如:

int array_name1 [ integer ];
typedef bit signed [4:1] SNibble;
int array_name2 [ SNibble ];
typedef bit [4:1] UNibble;
int array_name3 [ UNibble ];

指定整型数据类型索引的关联数组应具有以下属性:
— 索引表达式应根据转换为索引类型来求值,除非从real或shortreal数据类型进行隐式转换是非法的。
— 包含X或Z的4状态索引表达式无效。
— 排序是有符号的还是无符号的,这取决于索引类型的符号性。

7.8.5 Other user-defined types

例如:

typedef struct {byte B; int I[*];} Unpkt;
int array_name [ Unpkt ]; 

一般来说,指定为任何类型的索引的关联数组具有以下属性:
— 声明的索引应具有为其类型合法定义的相等操作符。这包括作为合法索引类型的所有动态大小类型。但是,real或shortreal数据类型,或包含real或shortreal的类型,应该是非法的索引类型。
— 索引表达式的任何元素中包含X或Z是无效的。
— 索引表达式是或包含空值或其任何元素为空值,不会使索引无效。
— 如果关系操作符是为索引类型定义的,排序与前面的子句中定义的一样。如果没有,那么关联数组中任意两个条目的相对顺序可能会发生变化,甚至在同一工具的连续运行之间也是如此。.但是,在相同的模拟运行中,在没有添加或删除索引的情况下,相对排序应保持不变。

7.8.6 Accessing invalid indices

如果一个读操作使用具有一个或多个x或z位4-state表达式的索引,或试图读一个不存在的条目,然后会发出警告,数组类型不存在项目值返回,如表7 - 1所示(见7.4.6)。用户指定的默认值将不会发出警告并返回7.9.11中指定的值。
如果在写操作中使用了无效的索引,写操作将被忽略,并发出警告。

7.8.7 Allocating associative array elements

一个不存在的关联数组元素的项,当它被用作赋值的目标或实际的引用传递的参数时,应该被分配。有些构造函数在单个语句中同时执行读和写操作,例如递增操作。在这种情况下,不存在的元素应该在引用该元素之前被分配其默认值或用户指定的初始值。
例如:

int a[int] = '{default:1};
typedef struct { int x=1,y=2; } xy_t;
xy_t b[int];
begin
a[1]++;
b[2].x = 5;
End

Upon executing b[2].x = 5, b[2] will be allocated and b[2].x will be 1 and b[2].y will be 2. After executing the assignment, b[2].x will be updated to 5.假设在执行这些语句之前,对[1]和b[2]的引用不存在。在执行a[1]++时,[1]将被分配并初始化为1。在增量之后,[1]将为2。在执行b[2].X = 5, b[2]将被分配,b[2].X是1,b[2].Y等于2。执行赋值后,b[2].X将更新到5。

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值