SystemVerilog Associative array

Associative arrays

动态数组用于处理数量动态变化的连续变量集合。当集合的大小未知或数据空间稀疏时,关联数组是更好的选择。关联数组在使用之前不分配任何存储,索引表达式不限于整型表达式,可以是任何类型的。关联数组实现了声明其类型元素的查找表。作为索引的数据类型会被强制排序并用于查找的关键词。
声明关联数组的语法如下:

data_type array_id [ index_type ];
//其中,data_type 为数组元素的数据类型。可以允许使用任何类型固定大小的数组
//     array_id为要声明的数组的名称
//	   index_type是要用作索引的数据类型,或者是*。如果指定了*,
//	   则数组被任意大小的整数表达式索引。索引类型将索引表达式限制为特定类型。index_type声明类型是非法的。

关联数组声明的例子如下:

integer i_array[*];			 // associative array of integer (unspecified
							// index)
bit [20:0] array_b[string]; // associative array of 21-bit vector, 
							// indexed by string
event ev_array[myClass]; 	// associative array of event indexed by class
							// myClass

1.声明
通过方括号中放置数据类型实现 int data_as[bit [31:0]] : int为存储数据类型,bit[63:0]为寻址的类型.
2.初始化
关联数组初始化时使用 : '{
   
   };在大括号内写入键值对的信息,键值对用:连接;
data_as = '{
   
   1:20,2:21,3:22};

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

1、通配符索引类型

例如:

int array_name [*]; 

指定通配符索引类型的关联数组具有以下属性:

  • 数组可以用任何整数表达式建立索引。因为索引表达式的大小可能不同,所以相同的数值可以有多个表示,每个表示的大小不同。SystemVerilog通过删除前导零并计算最小长度并使用该值表示来解决这种模糊性。
  • 非整数索引值是非法的,会导致错误。
  • 包含X或Z的4状态索引值无效
  • 自定索引表达式被视为无符号类型。
  • 字符串索引会自动转换为大小相等的位向量。
  • 排序是数字的(从最小到最大)。
  • 对于返回索引值或值数组的数组操作方法,不应在foreach循环中使用指定通配符索引类型的关联数组。指定通配符索引类型的关联数组不应在foreach循环中使用,也不应与返回索引值或值数组的数组操作方法一起使用。

2、字符串索引

例如:


                
### SystemVerilog数组的用法 #### 数组类型概述 SystemVerilog 提供了多种类型的数组来满足不同的设计需求。主要包括静态数组、动态数组、关联数组以及队列(queue)。每种数组都有其特定的应用场景和操作方法。 - **静态数组 (Static Arrays)** 是在声明时就定义好大小的数组,无法改变尺寸。这种数组类似于传统硬件描述语言中的数组形式[^1]。 ```verilog bit [7:0] static_array[4]; // 定义了一个8位宽、长度为4的静态数组 ``` - **动态数组 (Dynamic Arrays)** 可以在其生命周期内的任意时间调整大小,但是它们必须先被分配内存空间才能使用。这提供了更大的灵活性相比静态数组而言。 ```verilog int dynamic_array[]; initial begin dynamic_array = new[5]; // 动态创建一个整数型数组,初始容量为5 end ``` - **关联数组 (Associative Arrays)** 使用键值对的形式存储数据,其中键可以是整数或者字符串类型。它非常适合用于查找表之类的结构中。 ```verilog logic [7:0] assoc_array[string]; assoc_array["key"] = 8'hFF; ``` - **队列 (Queue)** 类似于动态数组,但它支持在一端插入而在另一端删除的操作模式,即先进先出(FIFO) 或者后进先出(LIFO)[^1]。 ```verilog byte queue[$]; initial begin queue.push_back(8'd25); queue.insert(0, 8'd100); // 插入到开头位置 end ``` #### 示例程序展示内置队列方法 下面给出一个小例子展示了如何利用上述提到的一些基本概念来进行编程实践: ```verilog program automatic test_queue_methods; int myQueue [$]; initial begin $display("Initial size=%d",myQueue.size()); // Add elements to the back of the queue. foreach(myQueue[i]) begin : add_elements_loop if(i<3)begin myQueue.push_back((i+1)*10); end else break add_elements_loop; end $display("After adding three items:"); foreach(myQueue[j]) $write("%d ",myQueue[j]); $display("\nSize now is %d.",myQueue.size()); // Remove an element from front. void'(myQueue.pop_front()); $display("Removed one item from front."); foreach(myQueue[k]) $write("%d ",myQueue[k]); $display(""); // Delete all contents by setting null pointer reference. delete myQueue; $display("Deleted entire content.Size after deletion:%d",myQueue.size()); end endprogram :test_queue_methods ``` 此代码片段演示了如何初始化队列、向队列添加元素、移除队列前端的一个项目以及清空整个队列等功能。 #### 关于逻辑运算符的选择 当涉及到单比特信号处理时,在 VerilogSystemVerilog 中都可以选用按位 OR (`|`) 运算符或者是逻辑 OR (`||`), 因为此处仅涉及单一比特所以两者效果相同[^2]。 #### Xilinx Vivado 库与帮助文档资源介绍 对于基于Xilinx平台的设计工作来说,熟悉并有效运用Vivado集成开发环境所提供的详尽的帮助文档是非常重要的。这些资料按照清晰分类整理而成,极大地方便了用户的查阅过程;相比之下某些其他品牌如Altera/Intel FPGA可能存在的问题是官方技术支持不够及时更新维护等问题[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值