SystemVerilog数组参数传递及引用方法总结

news2024/9/25 9:33:36

一、将常数数组传递给task/function

如下面的程序,将一个常数数组传递给function

module my_array_test();
 
  function array_test(int array[4]);
    foreach(array[i]) begin
      $display("array[%0d] = %0d", i, array[i]);
    end
  endfunction
  initial begin
    array_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]);
    end
  endfunction
  initial begin
    associative_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]) begin
      array[i] = i + start;
	 // $display("*******%d  \n",start);
	  
      $display("[NOW]array[%0d] = %0d", i, array[i]);
    end
  endfunction
  
  
  initial begin
    foreach(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]);
    end
  end

备注:

(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]);
    end
  endfunction
  initial begin
    foreach(array[i]) begin
      $display("[BFE]array[%0d] = %0d", i, array[i]);
    end
 
    const_ref_array_test(array, 5);
 
    foreach(array[i]) begin
      $display("[AFT]array[%0d] = %0d", i, array[i]);
    end
  end
 
endmoule

注意:

(1)当用const修饰ref之后,子函数就不能修改数组值了,如果加了修改array元素的语句,将会出现编译错误
(2)为了保护引用传递的参数不被子程序修改,const 限定符可以与ref一起使用,表示参数虽然通过引用传递,但它是一个只读变量
(3)如果引用参数使用const修饰,那么该不允许子程序修改, 子程序尝试修改时编译器报错
 

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

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

相关文章

@Transactional详解(作用、失效场景与解决方法)

一、了解Transactional注解,先要知道事务是什么,但既然知道了这个注解,不知道事务是什么,那就重新再去学习一遍数据库吧,这里讲解开发中代码实现事务的方式 1、编程式事务(开发用的很少了) 基于…

【火炬之光-召唤装备】

头部胸甲手套鞋子武器盾牌项链戒指腰带神格备注*邪龙头冠无限要塞/血抗血抗血抗***终焉复临任意攻速单手武器/黑峡烬盾1召唤等级血抗*原点的寒冬1召唤等级1.刷钢铁炼境监视者-无垢之墙升级。2.不能用典狱官的胸针参考视频机械领主无限要塞––***终焉复临––求生之欲––参考视…

Zoho CRM有哪些功能?使用体验如何?

市场上有很多CRM品牌,但是Zoho CRM是比较亮眼的存在,不仅屡获CRM国际大奖,更是连续十一年入选Gartner魔力象限。不论是功能、价格还是使用体验,都备受用户青睐。下面我们就来说说,Zoho CRM的使用体验评价。 Zoho CRM有…

Codeforces Round 888 (Div. 3)F题题解

文章目录 [Lisa and the Martians](https://codeforces.com/contest/1851/problem/F)问题建模问题分析1.分析给定的运算操作2.方法1使用Trie树来查找最符合的数代码 方法2通过性质,排序后找运算的最大值代码 证明 Lisa and the Martians 问题建模 ​ 给定n个数和k&…

如何搭建一个口才培训的网站?需要具备哪些条件?

论文题目:如何搭建一个口才培训的网站及所需条件 摘要: 本文探讨了如何搭建一个口才培训的网站,并详细分析了所需的关键条件。口才培训作为一种重要的社交技能,能够帮助人们提升自信和影响力,因此具有广阔的市场前景。…

【yolov5训练报错Wandb wandb.errors.UsageError: api_key not configured (no-tty).】

跑yolov5训练官方代码出现下面的问题,第一个方法就是关闭代理网络vpn,直接运行,阻止数据上传。 D:\anaconda\envs\yolov5\python.exe C:\Users\ljx\Desktop\yoloair-main\yoloair-main\yolov7\train.py YOLOR 2022-11-8 torch 1.8.1cu111…

Nginx 高性能内存池 ----【学习笔记】

跟着这篇文章学习: c代码实现一个高性能内存池(超详细版本)_c 内存池库_linux大本营的博客-CSDN博客https://blog.csdn.net/qq_40989769/article/details/130874660以及这个视频学习: nginx的内存池_哔哩哔哩_bilibilihttps://w…

TikTok马来西亚站变动,指定物流服务商!

8月2日,据TechinAsia报道,TikTok已将百世快递在马来西亚的子公司BestExpressMalaysia,指定为其在马来西亚的物流服务商。目前,百世快递已在越南、泰国与TikTok展开类似合作。 合作后,百世马来子公司将为TikTokShop卖家…

js去除字符串中特殊字符并将数据转为数组格式

let str今-天-空-气-很-清-新;let liststr.split(-);console.log(list)使用split将特殊字符去除并将数据转为数组

解决vite+vue3项目npm装包失败

报错如下: Failed to remove some directories [ npm WARN cleanup [ npm WARN cleanup D:\\V3Work\\v3project\\node_modules\\vue, npm WARN cleanup [Error: EPERM: operation not permitted, rmdir D:\V3Work\v3project\node_modules\vue\reactivity\…

Spring @Scheduled单线程单实例的坑

文章目录 前言背景验证解决方案 前言 在 Java Spring 项目中经常会用 Scheduled 来实现一些定时任务的场景,有必要了解一些它使用时的问题和内部实现机制。本文是偶然间发现的一个问题,刷新了我的认知,分享给大家。 其他相关文章&#xff1…

Pytorch深度学习-----神经网络之Sequential的详细使用及实战详解

系列文章目录 PyTorch深度学习——Anaconda和PyTorch安装 Pytorch深度学习-----数据模块Dataset类 Pytorch深度学习------TensorBoard的使用 Pytorch深度学习------Torchvision中Transforms的使用(ToTensor,Normalize,Resize ,Co…

产品经理之路:从C端到B端的崭新旅程

理解C端和B端 在我们开始探讨从C端产品经理到B端产品经理的转变之前,我们首先需要理解C端和B端是什么,以及它们之间有什么区别。 C端产品与B端产品的基本区别 C端产品(Consumer端产品)是面向普通消费者的产品,如社交…

大数据课程F4——HIve的其他操作

文章作者邮箱:yugongshiyesina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 掌握HIve的join; ⚪ 掌握HIve的查询和排序 ⚪ 掌握HIve的beeline ⚪ 掌握HIve的文件格式 ⚪ 掌握HIve的基本架构 ⚪ 掌握HIve的优化; 一、jo…

一个对象的内存图,两个对象使用同一个方法的内存图

一个对象的内存图 public class Phone {String brand; //品牌double price; //价格String color; //颜色public void call(String who) {System.out.println("给" who "打电话");}public void sendMessage() {System.out.println("群发短信");…

【第一阶段】kotlin的range表达式

range:范围:从哪里到哪里的意思 in:表示在 !in:表示不在 … :表示range表达式 代码示例: fun main() {var num:Int20if(num in 0..9){println("差劲")}else if(num in 10..59){println("不及格")}else if(num in 60..89…

2023年自动化测试已成为标配?一篇彻底打通自动化测试...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 首先我们从招聘岗…

CompletableFuture原理与实践

文章目录 1 为何需要并行加载2 并行加载的实现方式2.1 同步模型2.2 NIO异步模型2.3 为什么会选择CompletableFuture? 3 CompletableFuture使用与原理3.1 CompletableFuture的背景和定义3.1.1 CompletableFuture解决的问题3.1.2 CompletableFuture的定义 3.2 Complet…

Shell脚本学习-for循环结构1

for循环语句主要用于执行次数有限的循环,而不是用于守护进程和无限循环。 语法结构: for 变量名 in 变量取值列表 do指令... done 提示:in 变量值列表 可以省略,省略就相当于 in "$",也就是使用for i in &…

企业大数据可视化案例专题分享-入门

一、什么是数据可视化? 基本概念:数据可视化是以图示或图形格式表示的数据。让决策者可以看到以直观方式呈现的分析,以便他们可以掌握困难的概念或识别新的模式。借助交互式可视化,可以使用技术深入挖掘图表和图形以获取更多详细…