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学习笔记——数组、队列
一、定宽数组 定宽数组是静态变量,编译时便已经确定其大小,其可以分为压缩定宽数组和非压缩定宽数组:压缩数组是定义在类型后面,名字前面;非压缩数组定义在名字后面。Bit [7:0][3:0] name; bit[7:0] name [3:0]; 1.1定宽数组声明 数组的声…...

API调试工具的无解困境:白名单、动态IP与平台设计问题
引言 你是否曾经在开发中遇到过这样的尴尬情形:你打开了平台的API调试工具,准备一番操作,结果却发现根本无法连接到平台?别急,问题出在调试工具本身。今天我们要吐槽的就是那些神奇的开放平台API调试工具,…...
Git清理本地残留的、但已经在服务器上被删除的分支
要筛选出已经被服务器删除的本地分支,并在本地删除这些分支,可以按照以下步骤进行操作: 步骤 1: 获取远程分支信息,确保本地的远程分支信息是最新的: git fetch -p步骤 2: 列出本地分支和远程分支: git …...
HTTPS实现内容加密的逻辑
加密过程 使用非对称加密,网站生成公钥和私钥浏览器获取到网站公钥(通过验证和解析CA证书),随即生成一串字符串,然后使用公钥加密,发送给网站。网站用私钥将加密内容解析,然后使用这串字符串对…...
使用vue3.0+electron搭建桌面应用并打包exe
使用vue3.0electron搭建桌面应用并打包exe_如何使用electron将vue3vite开发完的项目打包成exe应用程序-CSDN博客...

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

mysql练习
创建数据库db_ck,再创建表t_hero,将四大名著中的主要人物都插入这个表中,将实现过程中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 点评:缺席潜望式长焦,3X直立长焦体验还行。兼顾性能、游戏、屏幕、影像、续航、快充等诸多方面,且外围配置比较齐全。 2、vivo x200 点评:潜望式长焦相机,拍照效果好,30W无线充电着实鸡肋&a…...

基于Spring Boot的扶贫助农系统的设计与实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
物联网中如何增加其可扩展性 协议 网络 设备 还包括软件层面上的
物联网(IoT)系统的可扩展性是指系统能够随着设备数量、数据流量和业务需求的增长而灵活扩展的能力。为了增加物联网的可扩展性,需要从协议、网络、设备和软件等多个层面进行优化和设计。以下是一些具体的策略和方法: 1. 协议层面的可扩展性 1.1 采用轻量级协议 轻量级协议…...
基于DeepSeek与搜索引擎构建智能搜索摘要工具
基于DeepSeek与搜索引擎构建智能搜索摘要工具 1. 项目概述 本项目通过整合DuckDuckGo搜索引擎与DeepSeek大语言模型,实现了一个智能搜索摘要生成工具。系统可自动执行以下流程: 输入查询语句进行全网搜索获取并解析搜索结果调用AI模型生成结构化摘要输出带来源标注的专业级…...
SQL 简介
SQL 简介 引言 结构化查询语言(Structured Query Language,简称 SQL)是一种用于数据库管理和操作的标准查询语言。它广泛应用于各个领域的数据库管理系统(DBMS)中,用于存储、检索和管理数据。SQL 不仅是数…...

BLUEM2引擎源码2025最新版
BLUE 引擎解析:传奇私服圈中的热门引擎 一、BLUE 引擎简介 BLUE 引擎是传奇私服圈子中较为知名的一款游戏引擎,它在传统的传奇引擎基础上进行了优化和扩展,使得私服开发者可以更加方便地搭建和管理服务器。相比于早期的 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日志告警 查看系统日志如下: java.lang.IllegalArgumentException: Illegal character in query at index 203: https://api.weixin.qq.com/sns/jscode2session?access_token90_Vap5zo5UTJS4jbuvneMkyS1LHwHAgrofaX8bnIfW8EHXA71IRZwsqzJam9bo1m3zRcSrb…...

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

本地部署DeepSeek R1大数据模型知识库
DeepSeek-V3 的综合能力 DeepSeek-V3 在推理速度上相较历史模型有了大幅提升。在目前大模型主流榜单中,DeepSeek-V3 在开源模型中位列榜首,与世界上最先进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电子书下载网站
苦瓜书盘(kgbook)是一个专注于提供6英寸PDF和MOBI格式电子书的免费下载平台,专为电子阅读器用户设计。该平台为用户提供了丰富的电子书资源,涵盖文学、历史、科学、技术等多个领域,旨在打造一个全面的电子书资源库。用…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...

如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

LabVIEW双光子成像系统技术
双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制,展现出显著的技术优势: 深层组织穿透能力:适用于活体组织深度成像 高分辨率观测性能:满足微观结构的精细研究需求 低光毒性特点:减少对样本的损伤…...
如何配置一个sql server使得其它用户可以通过excel odbc获取数据
要让其他用户通过 Excel 使用 ODBC 连接到 SQL Server 获取数据,你需要完成以下配置步骤: ✅ 一、在 SQL Server 端配置(服务器设置) 1. 启用 TCP/IP 协议 打开 “SQL Server 配置管理器”。导航到:SQL Server 网络配…...