SystemVerilog学习笔记(二):数组

news2024/11/15 16:02:36

数组是元素的集合,所有元素都具有相同的类型,并使用其名称和一个或多个索引进行访问。 Verilog 2001 要求数组的下限和上限必须是数组声明的一部分。 System Verilog 引入了紧凑数组声明样式,只需给出数组大小以及数组名称声明就足够了。

下图显示了 System Verilog 中使用的不同类型的数组。

数组类型描述
压缩数组(Packed Array)先声明数组名称,后声明数组维度
非压缩数组(Unpacked Array)先声明数组维度,后声明数组名称
动态数组(Dynamic Array)内存将在运行时分配
关联数组(Associative Array)仅在使用时分配内存并且使用任何索引类型对数组进行索引
队列(Queue)它类似于 fifo,可以在运行时向队列添加和删除元素
数组的函数它由数组定位函数、数组排序函数和数组缩减函数组成

静态数组

在固定大小数组/静态数组中,数组大小在整个模拟过程中将保持不变,一旦声明数组就无需创建它。默认情况下,数组将初始化为值“0”。在这种类型的数组中,内存将在编译阶段被占用,并且我们无法在运行时重新分配内存。

静态数组有两种类型

  • 压缩数组
  • 非压缩数组

压缩数组

压缩数组(Packed Arrays)是一种在数组名称之前声明数组维度的数组。在此数组中的多个位存储在一个内存位置中。

语法: [data_type] [dimensions] [array_name];

  • 如果压缩数组被声明为带符号的,则被视为单个向量的数组应被带符号。数组的各个元素都是无符号的,除非它们是声明为有符号的命名类型。
  • 压缩数组的最大大小可以受到限制,但至少应为 65536 (2^16) 位。
  • 压缩数组是可综合的。
  • 可以由任何单个位数据类型 bit、logic 和 reg 组成。不能对压缩数组使用多位数据类型。

下图展示了二维压缩数组中数组元素的存储方式。对于位 [2:0][3:0]xyz 示例,数组元素从左到右将占用内存。

2d-packed

压缩数组的应用:

它们用于存储可以执行位选择和部分选择操作的数据包结构。

非压缩数组

非压缩数组(Unpacked Arrays)是在数组名称之后声明数组维度的数组。在此,多个位将存储在不同的存储位置中。

语法: [data_type] [array_name] [dimension];

  • 它们可以是任何数据类型。
  • 如果非压缩数组被声明为有符号,则这适用于数组的各个元素,因为整个数组不能被视为单个向量。
  • 非压缩数组可以以模拟器选择的任何方式排列在内存中——不必是连续的。
  • 它们可以是固定大小的数组、动态数组、关联数组或队列。
  • 非压缩数组是不可综合的。

下图显示了数组元素如何存储在二维非压缩数组中。对于 int abc[2][3] 示例,数组元素从左到右将占用内存。

2d-unpacked

非压缩数组的应用:

它们用于对随机存取存储器 (RAM)、只读存储器 (ROM) 和一次访问一个元素的寄存器文件进行建模。

混合多维数组

压缩数组和非压缩数组的混合称为混合多维数组。

语法: [data_type] [dimensions] [array_name] [dimensions];

示例:

logic [2:0][3:0] mixed_array [2:0][3:0];

一些注意事项:

  • 首先按从最左边到最右边的顺序引用所有非压缩数组
  • 然后按从最左边到最右边的顺序引用所有压缩数组。

在给定的示例中,将从左到右分配内存,并且对于第一个非压缩数组维度将被考虑,如下图所示,然后考虑压缩数组维度。

mixed-arrays

动态数组

动态数组(Dynamic Arrays)是非压缩的数组,其大小可以在运行时设置或更改。动态数组的空间在运行时显式创建之前并不存在。

语法: <data_type> array_name []

示例:

int abc[] = new[7];

abc[7] = '{11,12,13,14,15,16,17};

  • 未初始化的动态数组的默认大小为 0。
  • 动态数组支持所有变量数据类型作为元素类型,包括数组。
  • 动态数组中的越界访问会指向数据类型的默认值。

动态数组函数一览表

函数

示例

描述

构造函数: new [value]

abc.new[]

设置动态数组的大小并初始化其元素或在运行时更改数组的大小。如果该值为零,则数组将变为空。如果该值为负数,则表示错误。

函数: int size()

abc.size()

size() 方法返回动态数组的当前大小,如果数组尚未创建,则返回零

函数: void delete()

abc.delete()

delete() 方法清空数组,导致数组大小为零

动态数组的应用:

可以在模拟期间分配和重新调整大小的动态数组将避免这种不必要的内存分配。


关联数组

关联数组(Associative Arrays)是一种非压缩数组数据类型。它在使用之前不会分配任何存储空间,并且用于访问元素的索引类型不限于整数。

语法: <data_type> array_name [index_type]

其中,索引类型是任何数据类型或其通配符“*”。

示例:

int abc[*];

abc = '{ 1:20, 25:22, 38:66};

string pqr[string];

pqr = '{"fruits":"mango" , "vegetables":"cucumber" , "season":"monsoon"};

一些注意事项:

  • 关联数组的元素都是非压缩的。
  • 模拟器可以将其存储为哈希(查找)表,以便极快地访问其元素。哈希表包含一组元素的数组。称为哈希函数的函数生成一个唯一键来计算该数组的索引,从中获得正确的数组元素值。
  • 关联数组中的元素的访问方式与一维数组中的元素类似。
  • 如果尝试读取无效(不存在)的关联数组条目,则模拟器将发出警告,并为 4 值整数类型返回值“x”,或为 2值整数类型返回值“0”。
  • 使用“*”这个通配符会增加模拟时间,因此在声明数组时避免使用它。

关联数组方法一览表:

函数示例描述
int num ()abc.num()返回关联数组中的条目数
int size ()abc.size()返回条目数,如果为空则返回0
void delete ([input index])abc.delete(index)指定索引时,将删除该索引处的条目,否则将删除整个数组
int exists (input index)abc.exists(index)检查指定索引处是否存在元素;如果存在则返回 1,否则返回 0
int first (ref index)abc.first(index)将第一个索引的值分配给给定的索引变量;对于空数组返回 0
int last (ref index)abc.last(index)将最后一个索引的值分配给给定的索引变量;对于空数组返回 0
int next (ref index)abc.next(index)查找值大于给定索引的最小索引
int prev (ref index)abc.prev(index)查找值小于给定索引的最大索引

关联数组的应用:

用于设计内容可寻址存储器 (CAM) 的关联数组。用于验证存储器的随机读取或写入测试可以使用关联数组来仅存储已写入地址的数据。这将比 Verilog 中通常使用的整个数组占用的内存少得多。


队列

队列是一种数据类型,用于以未压缩数组格式存储相同数据类型的可变大小有序集合,用于在数组两端插入元素和删除数组中的元素。它就像缓冲区一样,用于模拟先进先出(FIFO)和后进先出(LIFO)。

语法data_type name[$];

data_type - 队列元素的数据类型 name - 队列名称 [$] - 声明无界队列

队列有两种类型

有界队列

队列有大小限制。我们需要在声明队列时提供最大值。

语法: data_type name[$:255];

这里 $ 是第一个成员,255 是最后一个成员

无界队列

队列没有大小限制。我们不提供队列的大小,它是可变大小的队列。

语法: data_type name[$];

这里 0 是第一个成员,$ 是最后一个成员

unbounded queue

队列的函数

函数示例描述
function int size ();queue1.size();返回队列中的项目数
function void insert (input integer index, input element_t item);queue1.insert(int 0, 2);在指定索引位置插入给定项目
function void delete ( [input integer index] );queue1.delete(0);删除指定索引位置的项目
function element_t push_front (input element_t item);queue1.push_front(“yelahanka”);将给定元素插入队列的前面
function element_t push_back (input element_t item);queue1.push_back(“udupi”);将给定元素插入到队列末尾
function void pop_front ();queue1.pop_front()删除并返回队列的第一个元素
function void pop_back ();queue1.pop_back()删除并返回队列的最后一个元素

数组的优点和缺点

数组类型优点缺点
固定大小的数组1) 可以在运行时之前预先计算大小。 2) 内存在内存 bss 部分的 ROM 中分配,与非压缩数组相比,模拟时间更少。1) 大小是固定的,我们无法扩展数组。 2) 内存浪费
动态数组1) 连续内存分配 2) 我们可以使用循环从一个内存位置跳转到另一个内存位置。 3) 由于有序,我们可以轻松地在数组中移动 4) 与队列相比,执行时间更短1) 我们无法在特定索引位置插入和删除值 2) 内存分配在堆内存中,因此与固定数组相比,模拟时间更长
关联数组1) 内存友好 2) 任何数据类型都可用于索引 3) 我们可以在特定索引处插入和删除值1) 内存分配不连续 2) 索引之间没有固定关系,因此遍历数组很困难 3) 跳转到数组中其他内存位置需要索引号或者键
队列1) 我们可以插入和删除特定索引处的值 2) 我们可以在现有元素之间插入元素 3) 海量数据可轻松高效管理 4) 推入和弹出操作可以轻松执行,比关联数组更好1) 与动态数组相比,执行时间更长 2) 与动态数组相比,它有点复杂,因为它会扩展/增加

数组的函数

在 System Verilog 中,数组操作方法是用于搜索和排序的内置方法。数组操作方法迭代每个数组元素以计算 with 子句给出的表达式。对于某些方法来说,with 子句是必须的,而对于某些方法来说,with 子句是可选的。 “with”是指对现有数组进行条件评估。下图是数组操作方法的流程图

Array Manipulation Method

数组操作函数一览表

非破坏性:其输出存储在另一个数组中的数组不会影响原始数组

函数示例描述
find() with condition();array.find(check) with (check >=“oldtown”)返回满足给定表达式的所有元素
find_index() with condition();array.find_index(check) with (check ==“yelahanka”);返回满足给定表达式的所有元素的索引
find_first() with condition();array.find_first(check) with (check < “yelahanka” & check >= “newton” );返回满足给定表达式的第一个元素
find_first_index() with condition();array.find_first_index(check) with (check < “yelahanka”);返回满足给定表达式的第一个元素的索引
find_last() with condition();array.find_last(check) with (check < “oldtown”);返回满足给定表达式的最后一个元素
find_last_index() with condition();array.find_last_index(check) with (check < “oldtown”);返回满足给定表达式的最后一个元素的索引
function max();array.max();返回值为最大值的元素
function min();array.min();返回值为最小值的元素
function unique();array.unique();返回作为唯一值的所有元素
function unique_index();array.unique_index();返回作为唯一值的所有索引位置
function sum();array.sum();返回所有元素的总和
function product();array.product();回所有元素的乘积
function and();array.and();回所有元素的按位与(&)
function or();array.or();返回数组中所有元素的按位或
function xor();array.xor();返回数组中所有元素的按位 XOR(^)

破坏性:其输出直接影响原始数组的数组

函数示例描述
function reverse();array.reverse();反转数组元素的顺序
function sort();array.sort();升序对数组元素进行排序
function rsort();array.rsort();按降序对数组元素进行排序
function shuffle();array.shuffle();对数组元素进行混洗,使索引值按随机顺序排列

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2240936.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

批量从Excel某一列中找到符合要求的值并提取其对应数据

本文介绍在Excel中&#xff0c;从某一列数据中找到与已知数据对应的字段&#xff0c;并提取这个字段对应数值的方法。 首先&#xff0c;来明确一下我们的需求。现在已知一个Excel数据&#xff0c;假设其中W列包含了上海市全部社区的名称&#xff0c;而其后的Y列则是这些社区对应…

握手协议是如何在SSL VPN中发挥作用的?

SSL握手协议&#xff1a;客户端和服务器通过握手协议建立一个会话。会话包含一组参数&#xff0c;主要有会话ID、对方的证书、加密算法列表&#xff08;包括密钥交换算法、数据加密算法和MAC算法&#xff09;、压缩算法以及主密钥。SSL会话可以被多个连接共享&#xff0c;以减少…

数字化转型:基于价值流的业务架构战略解析

在当前数字化浪潮下&#xff0c;企业纷纷转向数字化转型&#xff0c;以适应市场需求的快速变化和技术革新。数字化转型不仅仅是技术层面的变革&#xff0c;更是对企业业务模式、文化以及价值创造方式的全面重新思考和重塑。《价值流&#xff08;Value Streams&#xff09;》为企…

Mac终端字体高亮、提示插件

一、安装配置“oh my zsh” 1.1 安装brew /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" 按照步骤安装即可&#xff0c;安装完成查看版本 brew -v 1.2 安装zsh brew install zsh 安装完成后查看版本 zsh --version 1.3 …

什么是CRM系统?

越来越多的企业意识到&#xff1a;如何有效管理与客户的关系、提升客户满意度&#xff0c;并通过这些提升推动销售增长&#xff0c;已经成为许多公司亟待解决的问题。为此&#xff0c;客户关系管理&#xff08;Customer Relationship Management&#xff0c;简称CRM&#xff09…

Ilya Sutskever AI行业将进入一个新的“探索时代”

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

MySQL(5)【数据类型 —— 字符串类型】

阅读导航 引言一、char&#x1f3af;基本语法&#x1f3af;使用示例 二、varchar&#x1f3af;基本语法&#x1f3af;使用示例 三、char 和 varchar 比较四、日期和时间类型1. 基本概念2. 使用示例 五、enum 和 set&#x1f3af;基本语法 引言 之前我们聊过MySQL中的数值类型&…

湾区聚力 开源启智 | 2024 CCF中国开源大会暨第五届OpenI/O启智开发者大会闪耀深圳

当下&#xff0c;全球数字化浪潮席卷而来&#xff0c;开源技术已成为科技创新和产业升级的关键驱动力。11月9-10日&#xff0c;以“湾区聚力 开源启智”为主题的2024 CCF中国开源大会在深圳隆重举行。本届大会由中国计算机学会主办&#xff0c;CCF开源发展委员会、鹏城实验室、…

Linux基本指令(中)(2)

文章目录 前言一、echo二、cat三、more四、less五、head六、tail七、date八、cal九、find十、whoami十一、clear总结 前言 承上启下&#xff0c;我们再来看看另外一些常用的基础指令吧&#xff01; 一、echo 语法&#xff1a;echo [选项] [字符串] 功能&#xff1a;在终端设备上…

MYSQL中JDBC的使用

一、JDBC基础概念 JDBC 是Java 中的一组API&#xff0c;用于执行SQL 操作&#xff08;例如CRUD 操作&#xff1a;增、删、改、关系&#xff09;&#xff0c;同时可以和各种类型的数据库类型进行连接&#xff08;MySQL、Oracle、SQL Server 等&#xff09;。 JDBC是Java标准库的…

UnixBench和Geekbench进行服务器跑分

1 概述 服务器的基准测试&#xff0c;常见的测试工具有UnixBench、Geekbench、sysbench等。本文主要介绍UnixBench和Geekbench。 1.1 UnixBench UnixBench是一款开源的测试UNIX系统基本性能的工具&#xff08;https://github.com/kdlucas/byte-unixbench&#xff09;&#x…

基于Java Springboot人力资源管理系统

一、作品包含 源码数据库设计文档万字全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA 数据库&#xff1a;MySQL8.0…

使用OpenCV(C++)通过鼠标点击操作获取图像的像素坐标和像素值

使用OpenCV&#xff08;C&#xff09;通过鼠标点击操作获取图像的像素坐标和像素值 在这篇博客中&#xff0c;我们将介绍如何使用OpenCV库在C中实现鼠标点击操作&#xff0c;以获取图像的像素坐标和像素值。代码分为两个部分&#xff1a;一个是鼠标事件处理的回调函数&#xff…

Windows VSCode .NET CORE WebAPI Debug配置

1.安装C#插件 全名C# for Visual Studio Code&#xff0c;选择微软的 2. 安装C# Dev Kit插件 全名C# Dev Kit for Visual Studio Code&#xff0c;同样是选择微软的 3.安装Debugger for Unity 4.配置launch.json 文件 {"version": "0.2.0","config…

AI斩获6枚金牌!华为Kaggle大师级智能体诞生,自主解决数据科学难题

继 OpenAI o1 成为首个达到 Kaggle 特级大师的人工智能&#xff08;AI&#xff09;模型后&#xff0c;另一个 Kaggle 大师级 AI 也诞生了。 根据 Kaggle 的晋级系统&#xff0c;由华为诺亚方舟实验室和伦敦大学学院团队联合推出的端到端自主数据科学智能体&#xff08;agent&a…

[Mysql基础] 表的操作

一、创建表 1.1 语法 CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校验规则 engine 存储引擎; 说明&#xff1a; field 表示列名 datatype 表示列的类型 character set 字符集&#xff0c;如果没有指定字符集…

04 简单神经网络推导及实现(C++/C)

简单神经网络推导及实现&#xff08;C/C&#xff09; 代码见A simple neural network - stock price prediction as an example(C/C) 1. 主要模块 Neuron.h&#xff1a;用于声明神经元类和构造函数。Layer.h&#xff1a;用于声明网络层类和构造函数。NNet.h&#xff1a;用于…

Mybatis配置文件的增删改查功能

Mybatis配置文件的增删改查功能 查询—条件查询 //resources里面的org.example.mapper中的BrandMapper.xml文件 <?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://…

【2024软考架构案例题】你知道什么是 RESTful 风格吗?

&#x1f449;博主介绍&#xff1a; 博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家&#xff0c;WEB架构师&#xff0c;阿里云专家博主&#xff0c;华为云云享专家&#xff0c;51CTO 专家博主 ⛪️ 个人社区&#x…

51单片机应用开发---LCD1602显示应用

实现目标 1、了解LCD1602液晶屏&#xff1b; 2、掌握驱动程序的编写&#xff1b; 3. 具体目标&#xff1a;在屏幕上显示字符。 一、LCD1206概述 1.1 定义 LCD1602(Liquid Crystal Display)液晶显示屏是一种字符型液晶显示模块,可以显示ASCII码的标准字符和其它的一些内置…