0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

SystemVerilog中的关联数组

芯片验证工程师 来源:芯片验证工程师 作者:芯片验证工程师 2022-10-31 10:12 次阅读

关联数组实际上是一种查找表,内存空间直到被使用时才会分配,每个数据项都会有一个特定的“键(索引)”,索引的类型不局限于整型。

相对于一般的数组,关联数组的内存空间利用会更加充分,因为它是稀疏的,无需一开始就分配很大的内存空间。

当变量集合的大小未知或数据空间稀疏时,关联数组是比动态数组更好的选择。例如只需要使用到地址0和地址FF,关联数组可以只分配2个地址空间,而动态数组则需要分配256个地址空间。

打个比方,如果动态数组时内存,那么关联数组更像是一个具有“tag”的cache。

关联数组也是一种unpacked数组。

 data_type array_id [index_type];

其中data_type是数组元素的数据类型。array_id是数组的名称。index_type是索引(或键)的数据类型。各种数据类型的索引示例如下:

//wildcard index. Can be indexed by any integral type
 int myArray[ * ];
 
 //Array that stores 'bit [31:0]' at string type index.
 bit [31:0] myArray[ string ];
 
 //Array that stores 'string' at string type index.
 string myArray [ string ];
 
 // Array that stores 'int' at Class type index
 int myArray [ class ];
 
 //Array that stores 'logic' type at integer type index
 logic myArray[ integer ];
 
 typedef bit signed [7:0] mByte;
 int myArray [mByte]; //'bit signed' index
 

比较特别的是以class作为索引类型的联合数组。

module assoc_arr;
 class AB;
    int a;
    int b;
 endclass
 
 int arr[AB]; //Associative array 'arr' with class 'AB' as index
 AB obj, obj1;
 initial begin
    obj = new();
    obj1= new();
    arr[obj]=20; //Store 20 at the object handle index 'obj'
    $display("%0d",arr[obj]);
    arr[obj1]=10; //Store 10 at the object handle index 'obj1'
    $display("%0d",arr[obj1]);
 end
 endmodule

仿真log:

20
10
 V C S S i m u l a t i o n R e p o r t

声明类“AB”,并使用它作为关联数组中的索引

int arr[AB]

声明两个AB类型的对象(obj和obj1),并实例化,赋值以这两个对象为索引的联合数组值。

arr[obj] = 20; 
arr[obj1] = 10;

String Index– Example

下面是一个以字符串为索引类型的联合数组示例:

module assoc_arr;
integer St [string] = '{"Peter":26, "Paul":24, "Mary":22};
integer data;
initial
begin
   $display("St=",St);
   $display("data stored at Peter = %0d",St["Peter"]);
   $display("data stored at Paul = %0d",St["Paul"]);
   $display("data stored at Mary = %0d",St["Mary"]);
   St["mike"] = 20; //new data stored at new index "mike"
   data = St["mike"]; //retrieve data stored at index "mike"
   $display("data stored at mike = %0d",data);
   $display("St=",St);
end
endmodule

仿真log:

run -all;
# KERNEL: St='{"Mary":22, "Paul":24, "Peter":26}
# KERNEL: data stored at Peter = 26
# KERNEL: data stored at Paul = 24
# KERNEL: data stored at Mary = 22
# KERNEL: data stored at mike = 20
# KERNEL: St='{"Mary":22, "Paul":24, "Peter":26, "mike":20}
# KERNEL: Simulation has fnished.

声明关联数组“St”,并对其进行初始化:

integer St [string] = '{"Peter":26, "Paul":24, "Mary":22};

意味着将26存储在索引“Peter”中,24存储在索引中
“Paul”,22存储在索引“Mary”中。
2. 分别打印数组。
3. 在新索引“mike”中添加新数据。注意,这个数据项的内存此时才开始分配。

Associative Array Methods

下面是关联数组提供的一些方法。

ee25bb46-56cc-11ed-a3b6-dac502259ad0.png

module assoc_arr;
int temp, imem[int];
integer St [string] = '{"Peter":20, "Paul":22, "Mary":23};
initial
begin
   if(St.exists( "Peter") ) $display(" Index Peter exists ");
   //Assign data to imem[int]
   imem[ 2'd3 ] = 1;
   imem[ 16'hffff ] = 2;
   imem[ 4'b1000 ] = 3;
   $display( " imem has %0d entries", imem.num );
   if(imem.exists( 4'b1000))       $display("Index 4b'1000 
exist)");
   imem.delete(4'b1000);
if(imem.exists( 4'b1000))  $display("Index 4b'1000 
exists)");
else $display(" Index 4b'1000 does not exist");
   imem[ 4'b1000 ] = 3;
if(imem.first(temp)) $display(" First entry is at index 
%0d ",temp);
if(imem.next(temp)) $display(" Next entry is at index 
%0b ",temp);
if(imem.last(temp)) $display(" Last entry is at index 
%0h",temp);
   imem.delete( ); //delete all entries
   $display(" imem has %0d entries", imem.num );
    $display(" imem = %p", imem);
end
endmodule

仿真log:

Index Peter exists
imem has 3 entries
Index 4b'1000 exists
Index 4b'1000 does not exist
First entry is at index 3
Next entry is at index 1000
Last entry is at index ffff
imem has 0 entries
imem = '{}
 V C S   Simulation  Report

声明了两个关联数组

int imem[int];
integer St [string] = '{"Peter":20, "Paul":22, "Mary":23};

使用.exists()判断某个索引对应的数据元素是否存在。

使用.num(),获取该联合数组具有的元素个数

使用.delete()删除特定索引对应的元素。如果不指定索引,则所有的元素都会被删除。

使用方法first()、next()和last()访问某个联合数组元素

First entry is at index 3
Next entry is at index 1000
Last entry is at index ffff

Associative Array– Default Value

可以在关联数组声明时为其指定默认值。

module assoc_arr;
 string words [int] = '{default: "hello"};
 initial begin
    $display("words = %p", words['hffff]); //default
    $display("words = %p", words[0]); //default
    $display("words = %p", words[1000]); //default
 words['hffff] = "goodbye";
    $display("words = %p", words);
    $display("words = %p", words[100]); //default
 end
 endmodule

仿真log:

words = "hello"

words = "hello"
words = "hello"
words = '{0xffff:"goodbye"}
words = "hello"
V C S S i m u l a t i o n R e p o r t

数组“words”的初始化默认值是“hello”,当我们访问索引“hffff”、“0”和“1000”时,都会打印默认值“hello”。

我们为index ' hffff分配一个字符串值" goodbye "。

Creating aDynamic Array ofAssociative Arrays

关联数组也可以是动态数组中的元素,如下示例:

module assoc_arr;
//Create a dynamic array whose elements are associative arrays
int games [ ] [string];
initial begin
   //Create a dynamic array with size of 3 elements
   games = new [3];
   //Initialize the associative array  inside each dynamic
//array element
   games [0] = '{ "football" : 10,"baseball" : 20,"hututu":70 };
   games [1] = '{ "cricket" : 30, "ice hockey" : 40 };
   games [2] = '{ "soccer" : 50, "rugby" : 60 };
   // Iterate through each element of dynamic array
   foreach (games[element])
   // Iterate through each index of the    current element in
   // dynamic array
   foreach (games[element][index])
       $display ("games[%0d][%s] = %0d", element, index, 
   games[element][index]);
end
endmodule

仿真log:

games[0][baseball] = 20
games[0][football] = 10
games[0][hututu] = 70
games[1][cricket] = 30
games[1][ice hockey] = 40
games[2][rugby] = 60
games[2][soccer] = 50
 V C S S i m u l a t i o n R e p o r t

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Verilog
    +关注

    关注

    28

    文章

    1345

    浏览量

    110025
  • System
    +关注

    关注

    0

    文章

    165

    浏览量

    36901
  • 数组
    +关注

    关注

    1

    文章

    416

    浏览量

    25929

原文标题:SystemVerilog中的关联数组

文章出处:【微信号:芯片验证工程师,微信公众号:芯片验证工程师】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    转一篇Systemverilog的一个牛人总结

    () ;//释放空间l 队列在队列增加或删除元素比较方便。l 关联数组当你需要建立一个超大容量的数组关联数组,存放稀疏矩阵的值。表示方
    发表于 08-27 14:50

    求职宝典:寒武纪2019笔试题

    。(2)动态数组:可以在仿真时分配空间或者调整宽度,这样在仿真中就可以使用最小的存储量。在声明时,其下标为空[ ],使用new[ ]操作符来分配空间。(3)关联数组SystemVerilog提供
    发表于 12-24 11:55

    PHP数组排序

    数组排序(6个) sort() - 以升序对数组排序rsort() - 以降序对数组排序 reversal sort)asort() - 根据值,以升序对关联数组进行排序(associ
    发表于 11-04 07:48

    基于社交网络和关联数据的服务网络构建方法

    网络可用服务的急剧增加对面向服务计算威廉希尔官方网站 的发展起到了极大的推动作用。针对服务的规模和利用率远没有达到预期,以及服务之间交互关系的复杂性问题,提出基于社交网络和关联数据的服务网络构建方法。首先,结合
    发表于 12-06 13:50 0次下载
    基于社交网络和<b class='flag-5'>关联数</b>据的服务网络构建方法

    基于本体的软件工程关联数据的自动构建

    针对目前在分布异构的大规模软件开发难以高效地知晓信息和发现知识的问题,将语义网引入软件工程领域,对多源异构数据进行细粒度语义关联,提出本体构建、关联抽取和发现的方法,实现基于本体的软件工程
    发表于 12-22 17:03 0次下载
    基于本体的软件工程<b class='flag-5'>关联数</b>据的自动构建

    SystemVerilog数组的赋值、索引和切片

    数组可以作为参数传递给子程序,当数组作为值传递给子程序时,会将这个数组复制一份传递给子程序。
    的头像 发表于 10-20 10:13 5249次阅读

    SystemVerilog动态数组的大小更改展示

    需要使用" new "操作符实例化一个动态数组,使用[]表示。在实例化过程,会设置动态数组的大小。
    的头像 发表于 10-21 09:43 1409次阅读

    SystemVerilog的操作方法

    SystemVerilog提供了几个内置方法来支持数组搜索、排序等功能。
    的头像 发表于 10-31 10:10 2750次阅读

    SystemVerilog可以嵌套的数据结构

    SystemVerilog除了数组、队列和关联数组等数据结构,这些数据结构还可以嵌套。
    的头像 发表于 11-03 09:59 1572次阅读

    网络和变量的未压缩数组

    SystemVerilog有两种类型的数组:压缩数组和非压缩数组。压缩数组是连续存储的位的集合,通常称为向量。非压缩
    的头像 发表于 02-09 14:50 691次阅读
    网络和变量的未压缩<b class='flag-5'>数组</b>

    使用SystemVerilog解决数组问题

    数独是一种非常流行的游戏,数独本质上也是一个约束问题,所以我们可以让SystemVerilog的约束求解器来帮助我们解决。 约束求解器的精妙之处就是,我们只描述约束限制,繁重的数值生成工作由工具来帮我们完成。 你只需“既要...又要...”,其他的让下人干吧。
    的头像 发表于 03-08 14:06 1546次阅读

    一些有趣的数组相关的SystemVerilog约束

    我们在工作中常常会针对数组施加各式的约束,下面列举一下有趣的Systemverilog数组约束示例。
    的头像 发表于 03-08 13:12 939次阅读

    一些有趣的数组相关的SystemVerilog约束

    我们在工作中常常会针对数组施加各式的约束,下面列举一下有趣的**Systemverilog数组约束**示例
    的头像 发表于 05-30 11:13 768次阅读

    带你了解SystemVerilog关联数组

    SystemVerilog,我们知道可以使用动态数组实现数组元素个数的动态分配,即随用随分
    的头像 发表于 06-09 09:46 7372次阅读
    带你了解<b class='flag-5'>SystemVerilog</b><b class='flag-5'>中</b>的<b class='flag-5'>关联数组</b>

    随机抽取SV数组的一个元素方法实现

    如果想从一个关联数组随机选取一个元素,需要逐个访问它之前的元素,原因是没办法能够直接访问到第N个元素。上面的程序示范了如何从一个以整数值作为索引**的关联数组随机选取一个元素。
    的头像 发表于 03-21 10:11 941次阅读
    随机抽取SV<b class='flag-5'>数组</b><b class='flag-5'>中</b>的一个元素方法实现