SystemVerilog数组参数传递及引用方法总结
一、将常数数组传递给task/function
如下面的程序,将一个常数数组传递给function
module my_array_test();function array_test(int array[4]);foreach(array[i]) begin$display("array[%0d] = %0d", i, array[i]);endendfunctioninitial beginarray_test('{0:5, 3:6, 1:2, 2:9});end
endmouule
传递常量数组给function的格式如下:
'{数组索引:值, 数组索引: 值, 数组索引: 值};
运行结果如下:
二、传递关联数组给function/task
如下面的function,其参数类型为关联数组。
module my_associative_array_test();function associative_array_test(int array[bit [1:0]]);foreach(array[i]) begin$display("array[%0d] = %0d", i, array[i]);endendfunctioninitial beginassociative_array_test('{3:10});end
endmoule
备注:
关联数组,即我们通常所说的哈希(Hash),它没有顺序,只是一系列的键-值(key-value)对。如本例中所传递的Hash,他里面只有1个元素。
运行结果如下:
三、传递数组的引用给function/task
- 通关ref传递数组的引用给子函数,子函数可以修改数组的值,并且对外可见
int array[4] = '{0, 1, 2, 3}; //'function automatic ref_test(ref int array[4], input int start);foreach(array[i]) beginarray[i] = i + start;// $display("*******%d \n",start);$display("[NOW]array[%0d] = %0d", i, array[i]);endendfunctioninitial beginforeach(array[i]) begin$display("[BFE]array[%0d] = %0d", i, array[i]);end#100;ref_test(array, 4);#100;foreach(array[i]) begin$display("[AFT]array[%0d] = %0d", i, array[i]);endend
备注:
(1)在使用ref修饰函数参数时(在module/program中),需要将function/task修饰为automatic,否则xrun编译不通过,VCS可以。严谨起见,还是记得加automatic。
(2)通过ref传递参数是一个唯一的参数传递限定符,将ref与任何其他方向限定符(input/output/inout)组合应该是非法的。
(3)对于具有静态生命的子程序,通过引用的方式传递参数是非法的。
运行结果如下:
四、传递数组的引用给function/task,但不希望子函数修改数组的值
- 通关键词const修饰ref,传递常数数组给子函数,子函数就不能修改数组值
module my_ref_array_test();int array[4] = '{0, 1, 2, 3, 4}; //'function const_ref_array_test(const ref int array[5], input start);foreach(array[i]) begin//array[i] = i + start; //不允许修改,会有编译错误$display("[NOW]array[%0d] = %0d", i, array[i]);endendfunctioninitial beginforeach(array[i]) begin$display("[BFE]array[%0d] = %0d", i, array[i]);endconst_ref_array_test(array, 5);foreach(array[i]) begin$display("[AFT]array[%0d] = %0d", i, array[i]);endendendmoule
注意:
(1)当用const修饰ref之后,子函数就不能修改数组值了,如果加了修改array元素的语句,将会出现编译错误。
(2)为了保护引用传递的参数不被子程序修改,const 限定符可以与ref一起使用,表示参数虽然通过引用传递,但它是一个只读变量。
(3)如果引用参数使用const修饰,那么该不允许子程序修改, 子程序尝试修改时编译器报错。
相关文章:
SystemVerilog数组参数传递及引用方法总结
一、将常数数组传递给task/function 如下面的程序,将一个常数数组传递给function module my_array_test();function array_test(int array[4]);foreach(array[i]) begin$display("array[%0d] %0d", i, array[i]);endendfunctioninitial beginarray_tes…...
Shell脚本学习-While循环1
当型循环和直到型循环: 循环语句常用于重复执行一条指令或一组指令,直到条件不满足时停止。 在企业实际应用中,常用于守护进程或者持续运行的程序。 while语法结构: while 条件 do指令... done while循环语句对后面的条件表达…...
docker for Windows, WSL2 ,Hyper-v的关系
Hyper-v Hyper-V是由微软开发的一种虚拟化技术和虚拟机管理器。它允许在Windows操作系统上创建和运行多个虚拟机实例,每个虚拟机可以运行独立的操作系统和应用程序。属于硬件虚拟化。 WSL2 WSL2在技术上与WSL有很大的不同。在WSL2中,Windows 10引入了…...
SAS-数据集SQL水平合并
一、SQL水平合并基本语法 sql的合并有两步,step1:进行笛卡尔乘积运算,第一个表的每一行合并第二个表的每一行,即表a有3行,表b有3行,则合并后3*39行。笛卡尔过程包含源数据的所有列,相同列名会合…...
企业既要用u盘又要防止u盘泄密怎么办?
企业在日常生产生活过程中,使用u盘交换数据是最企业最常用也是最便携的方式,但是在使用u盘的同时,也给企业的数据保密工作带来了很大的挑战,往往很多情况下企业的是通过u盘进行数据泄漏的。很多企业采用一刀切的方式,直…...
汉明距离,两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目。
题记: 两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目。 给你两个整数 x 和 y,计算并返回它们之间的汉明距离。 示例 1: 输入:x 1, y 4 输出:2 解释: 1 (0 0 0 1) 4 (0 1 0 0…...
Android 之 使用 Camera 拍照
本节引言 本节给大家带来的是Android中Camera的使用,简单点说就是拍照咯,无非两种: 1.调用系统自带相机拍照,然后获取拍照后的图片 2.要么自己写个拍照页面 本节我们来写两个简单的例子体验下上面的这两种情况~ 1.调用系统自带…...
盘点7月Sui生态发展,了解Sui的近期成长历程!
自5月Sui主网上线三个月以来,7月是Sui网络进行最多次重要更新的一个月,Sui网络和生态正呈指数形式不断向上发展。为吸引更多的项目或开发者加入生态构建以及活跃用户参与生态,Sui基金会推出了Builder House、黑客松、Bullshark Quests、NFT再…...
6.物联网操作系统信号量
一。信号量的概念与应用 信号量定义 FreeRTOS信号量介绍 FreeRTOS信号量工作原理 1.信号量的定义 多任务环境下使用,用来协调多个任务正确合理使用临界资源。 2.FreeRTOS信号量介绍 Semaphore包括Binary,Count,Mutex; Mutex包…...
《向量数据库指南》——使用Milvus Cloud操作员安装Milvus Cloud独立版
Milvus cloud操作员HelmDocker Compose Milvus cloud Operator是一种解决方案,帮助您在目标Kubernetes(K8s)集群上部署和管理完整的Milvus cloud服务堆栈。该堆栈包含所有Milvus cloud组件和相关依赖项,如etcd、Pulsar和MinIO。本主题介绍如何使用Milvus cloud Operator安…...
Redis的基础知识
目录 一、什么是Redis 二、关于Redis的一些基本知识 (1)set命令 (2)get命令 三、Redis中的一些常用命令 (1)keys (2)exists (3)type (4…...
Sorting Layer与Order in Layer
就像是两个数相比,比如34与26,Sorting Layer决定的是十位,而Order in Layer决定的是个位,如果Sorting Layer的级别比较高,则可以忽略Order in Layer的比较,当比较的二者的Sorting Layer级别相同,…...
动手学深度学习—卷积神经网络(原理解释+代码详解)
目录 1. 从全连接层到卷积层2. 图像卷积2.1 互相关运算2.2 卷积层2.3 图像中目标的边缘检测2.4 学习卷积核2.5 特征映射和感受野 3. 填充和步幅3.1 填充3.2 步幅 4. 多输入多输出通道4.1 多输入通道4.2 多输出通道4.3 11卷积核 5. 汇聚层5.1 最大汇聚层和平均汇聚层5.2 填充和步…...
环球数科、BUFFALO面试(部分)
环球数科 系统复杂且需求迭代频繁,如何维护微服务之间的接口调用关系? API接口在设计的时候需要大量的需求文档,而且文档也需要不断维护。如何高效维护API文档就很重要了。以下是一些常见的API管理工具:Swagger:Swag…...
RabbitMQ快速入门
文章目录 1、RabbitMQ的概述1.1、什么是消息队列?1.2、为什么要使用消息队列?1.3、RabbitMQ的特点: 2、RabbitMQ的安装2.1 下载与安装2.2 常用命令 3、RabbitMQ消息发送和接受3.1 消息发送和接受机制3.2 AMQP的消息路由3.3 Exchange(交换机)的…...
使用Git在GitHub上部署静态页面
在GitHub中,我们可以将自己的静态页面部署到GitHub中,它会给我们提供一个地址使得我们的页面变成一个真正的网站,可以供用户访问。 一、在GitHub下创建仓库 二、将项目部署到GitHub上 1. 初始化Git仓库 2. 提交代码 3. 关联远程仓库 在Gi…...
SQL-每日一题【1084. 销售分析III】
题目 Table: Product Table: Sales 编写一个SQL查询,报告2019年春季才售出的产品。即仅在2019-01-01至2019-03-31(含)之间出售的商品。 以 任意顺序 返回结果表。 查询结果格式如下所示。 示例 1: 解题思路 前置知识 between and between…...
Redis 软件包,在 CentOS 7 中安装 Redis
Download | Redis 1. 解压 Redis 软件包。假设你的 Redis 软件包名为 redis.tar.gz,进入redis.tar.gz所在目录下 ,可以使用以下命令进行解压: tar xzf redis.tar.gz 2. 切换到 Redis 软件包的解压目录。假设解压后的目录名为 redis…...
01.Redis实现发送验证码保存功能
学习目标: 提示:学习如何利用Redis来实现发送验证码功能 学习产出: 1. 准备pom环境 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><…...
C++STL——deque容器详解
纵有疾风起,人生不言弃。本文篇幅较长,如有错误请不吝赐教,感谢支持。 💬文章目录 一.deque容器的基本概念二.deque容器常用操作①deque构造函数②deque元素操作③deque赋值操作④deque交换操作⑤deque大小操作⑥deque插入和删除…...
网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...
android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...
【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案
目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...
