SystemVerilog学习(3)——数组

news/2024/5/19 19:53:33 标签: fpga, SystemVerilog

一、定宽数组

        相比于Verilog-1995中的一维定宽数组,SV提供了更加多样的数组类型,功能上也大大增强。

1.1 定宽数组的声明与初始化

         Verliog要求在声明中必须给出数组的上下界。因为几乎所有的数组都使用0作为索引下届,所以SV允许只给出数组的宽度的便捷声明方式,这与C语言是类似的。

//定宽数组的声明
int lo_hi[0:15]    //16个整数[0]...[15]
int c_style[16]    //16个整数[0]...[15] 

        可以通过在变量名后面指定维度的方式来创建多维定宽数组。下面的代码就创建了几个二维的整数数组,大小都是8行4列,最后一个元素的值被设置为1。在Verilog-2001中就引入了多维数组,但是这种便捷的声明方式只在SV中存在。

//多维数组声明
int array2 [0:7][0:3]   //完整的声明
int array3 [8][4]       //紧凑的声明
array2[7][3] = 1;       //设置最后一个元素

         如果试图从一个越界的地址中读取数据,那么SV会返回数组元素的缺省值(例如:四值类型;logic返回X,双状态类型返回0)。

1.2 常量数组

        下面的例子展示了如何使用常量数组,即一个单引号加大括号来初始化数组。在大括号前标上重复次数可以对多个元素重复赋值,还可以为那些没有显示赋值的元素指定一个缺省值。

//初始化一个数组
int ascend[4] = '{0,1,2,3};
int descend[5];

descend = '{4,3,2,1,0};
descend[0:2] = '{5,6,7};
ascend = '{4{8}};             //四个值都是8
descend = '{9,8,default:1};   //{9,8,1,1,1}

1.3 基本的数组操作

        操作数组的常见方式是for和foreach循环。 

initial begin
    bit [31:0] src[5],dst[5];
    for(int i = 0 ; i < $size(src) ; i++)
        src[i] = i;
    foreach (dst[j])
        dst[j] = src[j] * 2;
end

二、动态数组

        我们前面介绍的基本的Verilog数组类型都是定宽数组,其宽度在编译的时候就确定了。但是如果直到程序运行之前都不知道数组的宽度呢?例如,你可能想在仿真开始的时候生成一批事务,事务的总量是随机的。如果把这些事务存放到一个定宽数组里,那这个数组的宽度就必须足以容纳最大的事务量,这就造成了资源的浪费,SV提供了动态数组类型,可以在仿真的时候分配空间或调整宽度,这样在仿真中就可以使用最小的存储量。

        动态数组在声明的时候使用空的下标[ ]。这意味着数组的宽度不在编译的时候给出,而在程序运行时再定。数组在最开始的时候是空的,所以你必须调用new[ ]操作符来分配空间,同样在方括号中传递数组宽度。可以把数组名传给new[ ]构造符,并把已有数组的值复制到新数组里。

//使用动态数组
int dyn[],d2[];                           //声明动态数组

initial begin 
    dyn = new[5];                         //分配5个元素
    foreach (dyn[j]) dyn[j] = j;          //对数组初始化
    d2 = dyn;                             //复制一个动态数组
    d2[0] = 5;                            //修改复制值
    $display(dyn[0],d2[0]);               //显示数组(0,5)
    dyn = new[20](dyn);                   //分配20个整数值并进行复制
    dyn = new[100];                       //分配100个新的整数值
                                          //旧值不存在了
    dyn.delete();                         //删除所有元素
end

三、队列 

         SystemVerilog 引进了一种新的数据类型—队列,它结合了链表和数组的优点。队列与链表相似,可以在一个队列中的任何地方增加或删除元素,这类操作在性能上的损失比动态数组小得多,因为动态数组需要分配新的数组并复制所有元素的值。队列与数组相似,可以通过索引实现对任一元素的访问,而不需要像链表那样去遍历目标元素之前的所有元素。

        队列的声明是使用带有美元符号的下标:[$]。队列元素的编号从О到$。例2.19示范了如何使用方法(method)在队列中增加和删除元素。注意队列的常量( literal)只有大括号而没有数组常量中开头的单引号。

        System Verilog 的队列类似于标准模板库(standard template library)中的双端队列。你通过增加元素来创建队列.SystemVerilog 会分配额外的空间以便你能够快速插人新元素。当元素增加到超过原有空间的容量时,SystemVerilog 会自动分配更多的空间。其结果是,你可以扩大或缩小队列,但不用像动态数组那样在性能上付出很大代价,SystemVerilog会随时记录闲置的空间。注意不要对队列使用构造函数new[]。

         可以通过内建方法push_back(val)、push_front(val)、 pop_back()和pop_front()来顺序添加或者移除并且获得数据成员; 可以通过insert(pos, val)来在指定位置插入数据成员; 可以通过delete()来删除所有数据成员。

四、其他 

        关于数组类型,还有关于关联数组,链表,数组方法,数组排序的相关内容,这里不做过多展开。 


http://www.niftyadmin.cn/n/5109475.html

相关文章

编写后台登录滑动成功获取验证码 人机验证

vue-puzzle-vcode Vue 纯前端的拼图人机验证、右滑拼图验证 安装vue-puzzle-vcode npm install vue-puzzle-vcode --save使用vue-puzzle-vcode import Vcode from "vue-puzzle-vcode";<Vcode :show"isShow" success"onSuccess" close"…

AUTOSAR AP 硬核知识点梳理(3)AUTOSAR AP 方法论和开发流程的最佳实践

一 Adaptive AUTOSAR 方法论 AUTOSAR AP开发方法论包括三个主要阶段,分别是: 1、架构和设计阶段: 在这个阶段,您需要确定系统的需求、功能和服务,并将它们分配到合适的Machine上。 根据个人习惯使用一些建模工具,例如[Simulink]、[ProVision]或[RTA-VRTE SDK]自带的DS…

【Linux07-进程间通信】侧重 管道 和 SystemV 的进程间通信讲解

今天&#xff0c;带来Linux下的进程间通信讲解。文中不足错漏之处望请斧正&#xff01; 是什么 进程间通信&#xff0c;Inter-Process Communication(IPC)&#xff1a; 进程间通过访问同一块内存空间来进行数据的交流。 为什么 为什么要有IPC&#xff0c;它的作用是什么&am…

2020年江西省职业院校技能大赛高职组“信息安全管理与评估”赛项任务书样题

2020年江西省职业院校技能大赛高职组 “信息安全管理与评估”赛项任务书 样题 赛项时间 9:00-12:00&#xff0c;共计3小时。 赛项信息 赛项内容 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 第一阶段 平台搭建与安全设备配置防护 任务1 网络平台搭建 9:00-12:00 1…

【探索Linux】文件描述符 | 重定向 | 基础IO —— 强大的命令行工具 P.12

阅读导航 前言一、open()函数返回值二、文件描述符fd1. 文件描述符的分配规则2. 文件描述符0、1、2 三、重定向1. 重定向的本质⭕图解 2. dup2 系统调用函数 温馨提示 前言 前面我们讲了C语言的基础知识&#xff0c;也了解了一些数据结构&#xff0c;并且讲了有关C的一些知识&…

设置Oracle环境变量

打开系统变量 1.ORACLE_HOME&#xff1a; 新建一个变量home&#xff0c;再在path中添加&#xff1a;%ORACLE_HOME%\BIN 变量名&#xff1a; ORACLE_HOME 变量值&#xff1a; D:\app\chenzhi\product\11.2.0\dbhome_2&#xff08;自己的存放地址&#xff09; 2.NLS_LANG&am…

css3实现图片瀑布流,根据屏幕大小列可变和不可变的的瀑布流

前提是每张图片宽度要设置成一样,准备15张图测试 <div class"img-main"><div><img src"/assets/images/sq/1.jpg" alt"" title"1"></div><div><img src"/assets/images/sq/2.jpg" alt&quo…

el-input无法输入的问题和表单验证失败问题(亲测有效)-开发bug总结4

大部分无法输入的问题&#xff1a;基本都是没有进行v-model双向数据绑定&#xff0c;这个很好解决。 本人项目中遇到的bug问题如下&#xff1a; 点击添加&#xff0c;表单内可输入用户名 和 用户姓名&#xff0c;但有时会偶发出现无法这两个input框里面无法输入内容。 原因&a…