当前位置: 首页 > news >正文

SV学习笔记——数组、队列


一、定宽数组

定宽数组是静态变量,编译时便已经确定其大小,其可以分为压缩定宽数组和非压缩定宽数组:压缩数组是定义在类型后面,名字前面;非压缩数组定义在名字后面。Bit [7:0][3:0] name; bit[7:0] name [3:0];

1.1定宽数组声明

数组的声明有两种方式:

int array1 [15:0];//完整声明,表示array1[0]…array1[15]
int array2 [16];>//紧凑声明,表示array2[0]…array2[15]

多维数组的声明:

 //多维数组如果位宽都在变量名的右边,那么左边的是高纬度而右边的是低维度。
//如下例所示,[7:0]表示的是高纬度,[3:0]表示的是低纬度。
int array3 [7:0] [3:0];//完整声明
int array4 [8] [4];  //紧凑声明

1.2定宽数组初始化

``

int array5[4] = '{0,1,2,3};//对4个元素初始化
int array6[5];
array6 = '{4,3,2,1,0};
array5 = '{4{8}};//四个值全部都是8
array6 = '{9,8,default:-1};//{9,8,-1,-1,-1}

1.3合并型数组和非合并型数组`

向量数组会分为两种数组,一种是合并型数组,另一种是非合并型数组,示例如下:

bit [3:0] [7:0] pack;//合并型数组,[3:0]是高纬度,而[7:0]是低维度
bit [7:0] unpack [3:0];//非合并型数组,[3:0]是高纬度,而[7:0]是低维度

合并型数组占用的存储空间如下:
在这里插入图片描述
非合并型数组占用的存储空间如下:
在这里插入图片描述
上图表示合并型数组pack占用了1个word的存储空间,而非合并型数组占用了4个word的存储空间。

1.4数组的基本操作(foreach循环)

在SV中引入了新的循环方式foreach,比for循环更加简洁。
代码示例:

bit [3:0] a1[5];
bit [4:0] a2[5];initial beginfor(int i = 0; i < $size(a1); i++)begin //$size(a1)=5a1[i] = i;$display("a1[%0d] = %0d",i,a1[i]);endforeach(a2[j])begina2[j] = a1[j] * 2; $display("a2[%0d] = %0d",j,a2[j]);end
end

其中 s i z e ( ) 是系统函数,可以得到括号内的维度,默认是最高维度,想得到第二个维度的话就需要写成 size()是系统函数,可以得到括号内的维度,默认是最高维度,想得到第二个维度的话就需要写成 size()是系统函数,可以得到括号内的维度,默认是最高维度,想得到第二个维度的话就需要写成size(src,2),而对于 s i z e ( a 1 ) 的 a 1 而言,这是一个非合并型数组,所以右边的 5 是高纬度,因此 size(a1)的a1而言,这是一个非合并型数组,所以右边的5是高纬度,因此 size(a1)a1而言,这是一个非合并型数组,所以右边的5是高纬度,因此size(a1)=5。

仿真结果

a1[0] = 0
a1[1] = 1
a1[2] = 2
a1[3] = 3
a1[4] = 4
a2[0] = 0
a2[1] = 2
a2[2] = 4
a2[3] = 6
a2[4] = 8

二、动态数组

2.1动态数组声明

定宽数组是固定了存储空间的一种数组类型,如果需要在程序运行的过程中对存储空间进行改变就需要动态数组。

动态数组在最开始的声明时,需要使用’[]'来表示,此时存储空间为0,而在后面程序运行过程中需要使用’new[]'来分配存储空间给数组使用。

代码示例:

int dynamic_array1[];//动态数组的声明initial begindynamic_array1 = new[5];//给动态数组分配了5个元素的存储空间
end

2.2动态数组初始化

在分配完存储空间后,还需要对动态数组赋初值。

代码示例

int dynamic_array2[];//动态数组的声明initial begindynamic_array2 = new[5];//给动态数组分配了5个元素的存储空间foreach(dynamic_array2[i])begindynamic_array2[i] = i;//对元素初始化,即{0,1,2,3,4}$display("dynamic_array2[%0d] = %0d",i,dynamic_array2[i]);end
end

仿真结果:

在仿真开始前,动态数组里面的元素为空,即没有元素

在这里插入图片描述

在仿真开始后,对动态数组的初始化完成,{0,1,2,3,4}。

dynamic_array2[0] = 0
dynamic_array2[1] = 1
dynamic_array2[2] = 2
dynamic_array2[3] = 3
dynamic_array2[4] = 4

2.3动态数组操作(复制,删除)

代码示例:

int dynamic_array3[];//动态数组的声明
int dynamic_array4[];//动态数组的声明initial begindynamic_array3 = new[5];//给动态数组分配了5个元素的存储空间foreach(dynamic_array3[i])begindynamic_array3[i] = i;//对元素初始化,即{0,1,2,3,4}$display("@1:dynamic_array3[%0d] = %0d",i,dynamic_array3[i]);enddynamic_array4 = dynamic_array3;//将dynamic_array3复制给dynamic_array4foreach(dynamic_array4[j])begin$display("@2:dynamic_array4[%0d] = %0d",j,dynamic_array4[j]);enddynamic_array3 = new[7](dynamic_array3);//重新分配了7个数值,并将旧的5个元素复制给新的foreach(dynamic_array3[k])begin$display("@3:dynamic_array3[%0d] = %0d",k,dynamic_array3[k]);enddynamic_array3 = new[9];//重新分配9个数值,而旧值不存在foreach(dynamic_array3[l])begin$display("@4:dynamic_array3[%0d] = %0d",l,dynamic_array3[l]);enddynamic_array3.delete();//删除所有元素foreach(dynamic_array3[m])begin$display("@5:dynamic_array3[%0d] = %0d",m,dynamic_array3[m]);end
end

仿真结果:

@1:dynamic_array3[0] = 0
@1:dynamic_array3[1] = 1
@1:dynamic_array3[2] = 2
@1:dynamic_array3[3] = 3
@1:dynamic_array3[4] = 4
@2:dynamic_array4[0] = 0
@2:dynamic_array4[1] = 1
@2:dynamic_array4[2] = 2
@2:dynamic_array4[3] = 3
@2:dynamic_array4[4] = 4
@3:dynamic_array3[0] = 0
@3:dynamic_array3[1] = 1
@3:dynamic_array3[2] = 2
@3:dynamic_array3[3] = 3
@3:dynamic_array3[4] = 4
@3:dynamic_array3[5] = 0
@3:dynamic_array3[6] = 0
@4:dynamic_array3[0] = 0
@4:dynamic_array3[1] = 0
@4:dynamic_array3[2] = 0
@4:dynamic_array3[3] = 0
@4:dynamic_array3[4] = 0
@4:dynamic_array3[5] = 0
@4:dynamic_array3[6] = 0
@4:dynamic_array3[7] = 0
@4:dynamic_array3[8] = 0

三、队列

3.1队列的声明

队列可以在任何地方添加或者删除元素,这是数组无法做到的事情。

队列的声明是使用 符号,即 [ 符号,即[ 符号,即[],队列元素的索引是从0到$。队列也不需要new[]来创建空间,可以直接增加或者减少元素空间。

对于队列的一个简单使用就是通过其操作push_back()和pop_front()来实现FIFO,可以在仿真中模拟FIFO行为。

代码示例:

int queue1[$];

3.2队列的初始化

对队列进行初始化或者赋值时,不需要用到’。注意:在仿真开始之前,队列里是没有元素的,是仿真开始后,才会给队列分配存储空间。

代码示例:

int queue1[$] = {3,5,7};initial beginfor(int i = 0;i < 3; i++)begin$display("queue1[%0d] = %0d",i,queue1[i]);end
end

仿真结果:

queue1[0] = 3
queue1[1] = 5
queue1[2] = 7

3.3队列的基本操作

代码示例:

int j = 4;
int queue1[$] = {3,5,8};initial beginqueue1.insert(1,j);//{3,4,5,8}for(int i = 0; i<$size(queue1); i++)begin$display("@1:queue1[%0d] = %0d",i,queue1[i]);end queue1.delete(1);//{3,5,8}for(int i = 0; i<$size(queue1); i++)begin$display("@2:queue1[%0d] = %0d",i,queue1[i]);end queue1.push_front(2);//{2,3,5,8}for(int i = 0; i<$size(queue1); i++)begin$display("@3:queue1[%0d] = %0d",i,queue1[i]);end   j = queue1.pop_back();//{2,3,5}for(int i = 0; i<$size(queue1); i++)begin$display("@4:queue1[%0d] = %0d",i,queue1[i]);end   queue1.push_back(8);//{2,3,5,8}for(int i = 0; i<$size(queue1); i++)begin$display("@5:queue1[%0d] = %0d",i,queue1[i]);end   j = queue1.pop_front();//{3,5,8}for(int i = 0; i<$size(queue1); i++)begin$display("@6:queue1[%0d] = %0d",i,queue1[i]);end   
end

仿真结果:

@1:queue1[0] = 3
@1:queue1[1] = 4
@1:queue1[2] = 5
@1:queue1[3] = 8
@2:queue1[0] = 3
@2:queue1[1] = 5
@2:queue1[2] = 8
@3:queue1[0] = 2
@3:queue1[1] = 3
@3:queue1[2] = 5
@3:queue1[3] = 8## @4:queue1[0] = 2@4:queue1[1] = 3
@4:queue1[2] = 5
@5:queue1[0] = 2
@5:queue1[1] = 3
@5:queue1[2] = 5
@5:queue1[3] = 8
@6:queue1[0] = 3
@6:queue1[1] = 5
@6:queue1[2] = 8

四、关联数组

4.1关联数组的声明

当需要创建超大容量的数组时,可以用关联数组来完成,相比于动态数组,动态数组在创建大容量时需要在最开始就确定存储空间,即使是没有使用到的内存,也会分配空间,而关联数组则可以只对需要的内存分配存储空间,这样可以节省占用内存空间。
代码示例:

bit [63:0] associate_array [int];//声明关联数组

4.2关联数组的初始化

代码示例:

bit [63:0] associate_array[int];
bit [63:0] index = 1;initial beginrepeat(64)beginassociate_array[index] = index;index = index <<1;endforeach(associate_array[i])$display("associate_array[%0d] = %0d",i,associate_array[i]);
end

仿真结果(部分):

associate_array[1] = 1
associate_array[2] = 2
associate_array[4] = 4
associate_array[8] = 8
associate_array[16] = 16
associate_array[32] = 32
associate_array[64] = 64
associate_array[128] = 128
associate_array[256] = 256
associate_array[512] = 512
associate_array[1024] = 1024
associate_array[2048] = 2048
associate_array[4096] = 4096

相关文章:

SV学习笔记——数组、队列

一、定宽数组 定宽数组是静态变量&#xff0c;编译时便已经确定其大小&#xff0c;其可以分为压缩定宽数组和非压缩定宽数组:压缩数组是定义在类型后面&#xff0c;名字前面;非压缩数组定义在名字后面。Bit [7:0][3:0] name; bit[7:0] name [3:0]; 1.1定宽数组声明 数组的声…...

API调试工具的无解困境:白名单、动态IP与平台设计问题

引言 你是否曾经在开发中遇到过这样的尴尬情形&#xff1a;你打开了平台的API调试工具&#xff0c;准备一番操作&#xff0c;结果却发现根本无法连接到平台&#xff1f;别急&#xff0c;问题出在调试工具本身。今天我们要吐槽的就是那些神奇的开放平台API调试工具&#xff0c;…...

Git清理本地残留的、但已经在服务器上被删除的分支

要筛选出已经被服务器删除的本地分支&#xff0c;并在本地删除这些分支&#xff0c;可以按照以下步骤进行操作&#xff1a; 步骤 1: 获取远程分支信息&#xff0c;确保本地的远程分支信息是最新的&#xff1a; git fetch -p步骤 2: 列出本地分支和远程分支&#xff1a; git …...

HTTPS实现内容加密的逻辑

加密过程 使用非对称加密&#xff0c;网站生成公钥和私钥浏览器获取到网站公钥&#xff08;通过验证和解析CA证书&#xff09;&#xff0c;随即生成一串字符串&#xff0c;然后使用公钥加密&#xff0c;发送给网站。网站用私钥将加密内容解析&#xff0c;然后使用这串字符串对…...

使用vue3.0+electron搭建桌面应用并打包exe

使用vue3.0electron搭建桌面应用并打包exe_如何使用electron将vue3vite开发完的项目打包成exe应用程序-CSDN博客...

JSAR 基础 1.2.1 基础概念_空间小程序

JSAR 基础 1.2.1 基础概念_空间小程序 空间空间自由度可嵌入空间空间小程序 最新的技术进展表明&#xff0c;官网之前的文档准备废除了&#xff0c;基于xsml的开发将退出历史舞台&#xff0c;three.js和普通web结合的技术将成为主导。所以后续学习请移步three.js学习路径&#…...

mysql练习

创建数据库db_ck&#xff0c;再创建表t_hero&#xff0c;将四大名著中的主要人物都插入这个表中&#xff0c;将实现过程中sql提交上上来 1、创建数据库db_ck mysql> create database db_ck; 2、创建表t_hero mysql> use db_ck Database changed mysql> create table …...

2025年2月平价旗舰手机性能对比

1、荣耀Magic7 点评&#xff1a;缺席潜望式长焦&#xff0c;3X直立长焦体验还行。兼顾性能、游戏、屏幕、影像、续航、快充等诸多方面&#xff0c;且外围配置比较齐全。 2、vivo x200 点评&#xff1a;潜望式长焦相机&#xff0c;拍照效果好&#xff0c;30W无线充电着实鸡肋&a…...

基于Spring Boot的扶贫助农系统的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…...

物联网中如何增加其可扩展性 协议 网络 设备 还包括软件层面上的

物联网(IoT)系统的可扩展性是指系统能够随着设备数量、数据流量和业务需求的增长而灵活扩展的能力。为了增加物联网的可扩展性,需要从协议、网络、设备和软件等多个层面进行优化和设计。以下是一些具体的策略和方法: 1. 协议层面的可扩展性 1.1 采用轻量级协议 轻量级协议…...

基于DeepSeek与搜索引擎构建智能搜索摘要工具

基于DeepSeek与搜索引擎构建智能搜索摘要工具 1. 项目概述 本项目通过整合DuckDuckGo搜索引擎与DeepSeek大语言模型,实现了一个智能搜索摘要生成工具。系统可自动执行以下流程: 输入查询语句进行全网搜索获取并解析搜索结果调用AI模型生成结构化摘要输出带来源标注的专业级…...

SQL 简介

SQL 简介 引言 结构化查询语言&#xff08;Structured Query Language&#xff0c;简称 SQL&#xff09;是一种用于数据库管理和操作的标准查询语言。它广泛应用于各个领域的数据库管理系统&#xff08;DBMS&#xff09;中&#xff0c;用于存储、检索和管理数据。SQL 不仅是数…...

BLUEM2引擎源码2025最新版

BLUE 引擎解析&#xff1a;传奇私服圈中的热门引擎 一、BLUE 引擎简介 BLUE 引擎是传奇私服圈子中较为知名的一款游戏引擎&#xff0c;它在传统的传奇引擎基础上进行了优化和扩展&#xff0c;使得私服开发者可以更加方便地搭建和管理服务器。相比于早期的 GEE、LEG、Hero 等引…...

pytest结合allure

Allure 一、文档二、指令三、装饰器3.1 allure.step装饰器3.2 allure.description装饰器3.3 allure.title装饰器3.4 allure.link、allure.issue 和 allure.testcase装饰器3.5 allure.epic、allure.feature 和 allure.story装饰器3.6 allure.severity装饰器 一、文档 allure文档…...

【渗透测试】基于时间的盲注(Time-Based Blind SQL Injection)

发生ERROR日志告警 查看系统日志如下&#xff1a; java.lang.IllegalArgumentException: Illegal character in query at index 203: https://api.weixin.qq.com/sns/jscode2session?access_token90_Vap5zo5UTJS4jbuvneMkyS1LHwHAgrofaX8bnIfW8EHXA71IRZwsqzJam9bo1m3zRcSrb…...

Gateway:网关路由与登录鉴权

在微服务架构中&#xff0c;用户登录和身份校验的处理方式确实与单体应用有所不同。在单体架构中&#xff0c;一旦用户通过身份验证&#xff0c;其会话信息可以在整个应用范围内共享&#xff0c;所有模块都能访问到用户信息。然而&#xff0c;在微服务架构下&#xff0c;每个服…...

本地部署DeepSeek R1大数据模型知识库

DeepSeek-V3 的综合能力 DeepSeek-V3 在推理速度上相较历史模型有了大幅提升。在目前大模型主流榜单中&#xff0c;DeepSeek-V3 在开源模型中位列榜首&#xff0c;与世界上最先进OpenAI 闭源模型不分伯仲。 1、下载Ollama运行大数据库 Ollama支持 Llama 3.3, DeepSeek-R1, Phi-…...

使用 Python 开发的简单招聘信息采集系统

以下是一个使用 Python 开发的简单招聘信息采集系统,它包含用户登录、招聘信息收集和前后端交互的基本功能。我们将使用 Flask 作为后端框架,HTML 作为前端页面。 项目结构 recruitment_system/ ├── app.py ├── templates/ │ ├── login.html │ ├── index…...

【jstack查询线程信息】1.对比下arthas的thread 和jvm指令

1)jps拿到进程号 2)jstack <pid> > <xxx.txt> // jstack作用:分析线程信息,死循环,死锁 jstack 23647 > 23647.txt Found 1 deadlock 3)对比:arthas查看线程信息 [arthas68751]$ thread -n 10 "MainWorker" Id69 cpuUsage72.29% deltaTime156ms …...

苦瓜书盘官网,免费pdf/mobi电子书下载网站

苦瓜书盘&#xff08;kgbook&#xff09;是一个专注于提供6英寸PDF和MOBI格式电子书的免费下载平台&#xff0c;专为电子阅读器用户设计。该平台为用户提供了丰富的电子书资源&#xff0c;涵盖文学、历史、科学、技术等多个领域&#xff0c;旨在打造一个全面的电子书资源库。用…...

从零开始!DeepSeek-R1-Distill-Qwen-1.5B完整部署流程详解

从零开始&#xff01;DeepSeek-R1-Distill-Qwen-1.5B完整部署流程详解 1. 模型简介与核心优势 1.1 什么是DeepSeek-R1-Distill-Qwen-1.5B&#xff1f; DeepSeek-R1-Distill-Qwen-1.5B是一款经过知识蒸馏优化的轻量级语言模型&#xff0c;由DeepSeek团队基于Qwen-1.5B架构开发…...

不会画画也能创作!梦幻动漫魔法工坊新手入门全攻略

不会画画也能创作&#xff01;梦幻动漫魔法工坊新手入门全攻略 1. 为什么你需要这个工具 你是否曾经有过这样的经历&#xff1a;脑海中浮现出一个绝妙的动漫角色形象&#xff0c;却因为不会画画而无法将它呈现出来&#xff1f;或者想为社交媒体创作独特的二次元头像&#xff…...

半导体器件入门:金半接触的5个关键概念解析(附手稿能带图)

半导体器件入门&#xff1a;金半接触的5个关键概念解析&#xff08;附手稿能带图&#xff09; 第一次翻开半导体物理教材时&#xff0c;金半接触那一章总是让人既兴奋又困惑。那些弯曲的能带图、费米能级的移动、神秘的势垒高度&#xff0c;就像一道通往微电子世界的大门。本文…...

LangFlow零代码AI应用搭建:5分钟可视化构建智能问答机器人

LangFlow零代码AI应用搭建&#xff1a;5分钟可视化构建智能问答机器人 1. LangFlow简介&#xff1a;零代码AI应用构建利器 LangFlow是一款革命性的可视化AI应用构建工具&#xff0c;它让不懂编程的用户也能轻松搭建智能问答机器人。想象一下&#xff0c;你只需要像搭积木一样…...

显卡驱动深度清理指南:用DDU解决驱动残留难题

显卡驱动深度清理指南&#xff1a;用DDU解决驱动残留难题 【免费下载链接】display-drivers-uninstaller Display Driver Uninstaller (DDU) a driver removal utility / cleaner utility 项目地址: https://gitcode.com/gh_mirrors/di/display-drivers-uninstaller 你是…...

UniApp跨平台开发入门:用现有Vue代码快速生成小程序/App(2023最新版)

UniApp跨平台开发实战&#xff1a;2023年Vue代码高效迁移指南 移动互联网时代&#xff0c;开发者常面临一个核心挑战&#xff1a;如何用最小成本将Web应用扩展到移动端。如果你手头已有成熟的Vue项目&#xff0c;UniApp可能是最经济的跨平台解决方案——它允许你复用80%以上的现…...

别再死记硬背了!用Python可视化理解L-smooth函数与梯度Lipschitz连续

别再死记硬背了&#xff01;用Python可视化理解L-smooth函数与梯度Lipschitz连续 第一次接触L-smooth这个概念时&#xff0c;我盯着数学公式看了整整一个下午——梯度Lipschitz连续、二次上界、等价性证明&#xff0c;每个词都认识&#xff0c;连起来却像天书。直到我用Python画…...

Pixel Epic效果展示:支持Markdown+LaTeX混合输出的学术论文初稿生成案例

Pixel Epic效果展示&#xff1a;支持MarkdownLaTeX混合输出的学术论文初稿生成案例 1. 像素史诗&#xff1a;科研写作的新范式 在传统学术写作工具普遍沉闷单调的背景下&#xff0c;Pixel Epic带来了一场视觉与功能双重革新的科研体验。这款基于AgentCPM-Report大模型的智能终…...

Qwen3.5-9B实战案例:用128K上下文做法律合同比对与风险提示

Qwen3.5-9B实战案例&#xff1a;用128K上下文做法律合同比对与风险提示 1. 项目概述 Qwen3.5-9B是一款拥有90亿参数的开源大语言模型&#xff0c;在专业领域的逻辑推理和长文本处理方面表现出色。本文将重点展示如何利用其128K tokens的超长上下文能力&#xff0c;实现法律合…...

终极指南:5分钟掌握Piper鼠标地图组件与SVG渲染核心技术

终极指南&#xff1a;5分钟掌握Piper鼠标地图组件与SVG渲染核心技术 【免费下载链接】piper GTK application to configure gaming devices 项目地址: https://gitcode.com/gh_mirrors/pip/piper Piper是一款功能强大的GTK应用程序&#xff0c;专为配置游戏设备而设计。…...