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

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修饰,那么该不允许子程序修改, 子程序尝试修改时编译器报错
 

http://www.lryc.cn/news/107250.html

相关文章:

  • Shell脚本学习-While循环1
  • docker for Windows, WSL2 ,Hyper-v的关系
  • SAS-数据集SQL水平合并
  • 企业既要用u盘又要防止u盘泄密怎么办?
  • 汉明距离,两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目。
  • Android 之 使用 Camera 拍照
  • 盘点7月Sui生态发展,了解Sui的近期成长历程!
  • 6.物联网操作系统信号量
  • 《向量数据库指南》——使用Milvus Cloud操作员安装Milvus Cloud独立版
  • Redis的基础知识
  • Sorting Layer与Order in Layer
  • 动手学深度学习—卷积神经网络(原理解释+代码详解)
  • 环球数科、BUFFALO面试(部分)
  • RabbitMQ快速入门
  • 使用Git在GitHub上部署静态页面
  • SQL-每日一题【1084. 销售分析III】
  • Redis 软件包,在 CentOS 7 中安装 Redis
  • 01.Redis实现发送验证码保存功能
  • C++STL——deque容器详解
  • docker 哨兵模式和集群模式安装Redis7.0.12
  • go nil 与零值
  • puppeteer监听response并封装为express服务调用
  • kubernetes之Ingress
  • 前端实现打印1 - 使用 iframe 实现 并 分页打印
  • MIAOYUN获评“2023年度一云多芯稳定安全运行优秀案例”
  • 论文代码学习—HiFi-GAN(4)——模型训练函数train文件具体解析
  • 安防视频综合管理合平台EasyCVR可支持的视频播放协议有哪些?
  • 一张表格讲明白white-space属性。html如何识别\n\r,让这些特殊换行符换行。
  • 【Linux】编写shell脚本将项目前一天打印的日志进行提取,并且单独保存
  • 快速搭建单机RocketMQ服务(开发环境)