system verilog中的参数传递——ref,input,output
本文介绍了 system verilog 中静态数组、动态数组、队列作为函数参数传递的规则,以及 input、output、ref关键字的规则。
system verilog中的参数传递——ref,input,output
- 加 input 的情况
- 加 output 的情况
- 加 ref 的情况
- 其他
先说明,sv 中的静态数组、动态数组、队列都是用一块内存存放,而他们的名字作为该内存的地址,这点应该和 c 一致,但 sv 里面没有指针的概念。
传递这种大片内存的值一般只有两种规则
- 地址传递,函数内部修改可以改变函数调用的值。
- 值传递,将整片空间复制一份,函数内部修改不会改变函数调用的值。
但是 system verilog 里面关键字有三个,input、output、ref。具体哪个对应哪个,我们来试一下。以静态数组作为模板来试。
function void run();int r[2];r[0] = 1;r[1] = 2;f(r);$display("%0x %0x",r[0],r[1]);
endfunction
加 input 的情况
function void f(input int a[2]);a[0] = 3;
endfunction
输出结果是:1 2
具体过程如下:
- 函数调用之前,内存里只有 r 数组的空间
- 函数调用之后,会将 r 拷贝一份到 a,函数里面用的都是 a 这份空间
- 函数调用之后,赋值后,修改的是 a 这份空间的值
- 函数返回之后,a 空间会被释放掉,所以 r 的值并没有修改
因此,input 是标准的值传递。
加 output 的情况
function void f(output int a[2]);a[0] = 3;
endfunction
输出结果是:3 0
- 函数调用之前,内存里只有 r 数组的空间
- 函数调用之后,会新建一份 a 数组,注意这里并不会把 r 的值传进来,函数里面用的都是 a 这份空间
- 函数调用之后,赋值后,修改的是 a 这份空间的值
- 函数返回之后,会将 r 指向 a 空间,而原来 r 指向的空间会被释放掉,所以 r 的值都被修改了
因此,加 output,采用的是地址传递,确切的说是反向的地址传递,数组共有两份,函数内部看到的是新建的一份,并传递给函数调用处,因此,函数调用前看到的是第一份,函数调用后看到的是新建的那份。
加 ref 的情况
function void f(ref int a[2]);a[0] = 3;
endfunction
输出结果是:3 2
具体过程如下:
- 函数调用之前,内存里只有 r 数组的空间
- 函数调用之后,会将 a 指向 r 所在的空间,函数里面用的都是这份空间
- 函数调用之后,赋值后,修改的是这份空间的值,所以 r 和 a 都修改了
- 函数返回之后,所以 r 的值只有部分修改
因此,加 ref,采用的是标准的地址传递,只有一份数组,函数内部和调用处都是访问该空间。
对比来看,input 是将函数外面的值传递到函数里面,调用结束之后,函数里面的值就被丢弃了;out 是将函数里面的值传递到函数外面来,调用结束之后,函数外面的值就丢了;ref 是函数内部和外部看到的是同一份值,哪里改都会改。
另外,可以看出,采用 ref 关键字是占用内存最小的,因为只有一份数组,这样能提高效率。
动态数组或队列作为参数
如果传递的是动态数组或者队列,其结果是一模一样的,不另外作说明。
类作为参数
但是!!如果传递的是类,则会有点不一样。
class c;int v0;int v1;
endclass
function void run();c c0;c0 = new();c0.v0 = 1;c0.v1 = 2;f(c0);$display("%0x %0x",c0.v0,c0.v1);
endfunction
function void f(input/output/ref c c0);c0.v0 = 3;
endfunction
结果是:
- input:
3 2
- output:报 null point 错误
- ref:
3 2
可以看出,如果是传递类的话,使用 input 和 ref 是一样的,都是地址传递,而 output 和数组的结果是一样的。
其他
system verilog中关于ref 的求解答
system verilog中的参数传递——ref,input,output相关推荐
- (136)System Verilog覆盖组参数传递实例
(136)System Verilog覆盖组参数传递实例 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog覆盖组参数传递实例 5)结语 ...
- System Verilog中的automatic
System Verilog中的automatic automatic 仿真测试 1.子程序均为静态存储的情况 2.在静态存储子程序中加入automatic的中间变量 3.修改module test为 ...
- Angular中父子组件传值@Input @Output @ViewChild最全面最简单的总结
父组件传递给子组件: 值传递方式:@Input既可以传递数据也可以传递方法 传递数据(不举例了) 传递方法 // 父组件定义方法 parentRun(){alert('这是父组件的 run 方法'); ...
- system verilog中的$sformatf()/$sformat()
转载自https://zhuanlan.zhihu.com/p/279618353 字符串在验证平台中是经常被使用的,今天我们来说说在SystemVerilog中非常重要和常用的sformatf()/ ...
- sv_labs学习笔记——sv_lab4(System Verilog)
sv_labs学习笔记--sv_lab4(System Verilog) lab4 OOP encapsulation 实验概述 任务代码解析 Packat实现与理解 语法点解析 randomize( ...
- sv_labs学习笔记——sv_lab3(System Verilog)
这里我们在前两个lab的基础上继续完善,搭建一个数据接受的功能.在lab2 中我们实现了相关发送信息的打印,选择发送接受的端口,完善发送时序,在这一小节中将实现对端口发送数据的回收,然后进行比较发送的 ...
- System Verilog——任务和函数 Part-I
System Verilog 可以说是Verilog+C的结合,在Verilog的基础上,引入了面向对象的思想,使得更有利于实现对电路的验证.因此很多时候需要对比Verilog,结合C,对比SV(Sy ...
- 再说System Verilog 与 Verilog 的关系
System Verilog 与 Verilog 的关系 标准 当前的System Verilog标准是由IEEE(国际电子电气工程师协会)和Accellera(基于工业的标准协会)两个国际组织制定的 ...
- System Verilog自学笔记专栏概述博文目录
本文用于梳理学习笔记目录下的博文笔记,概述会有笔者的System Verilog的学习反思以及相关随笔,望有同学发现问题及时提出~感谢 概述随笔 了解基本的概念,框架后,开始使用例子进行学习语言.需要 ...
最新文章
- Generics and Linq demo
- 5月16日 | 硬核突破,应用革新!阿里云数据库线下活动-北京站开启
- 关闭应用程序的几种方法
- html5 客户端数据缓存机制,深入理解HTML5离线缓存机制
- cookie分号后面没有值_浏览器Cookie介绍
- 路由器三种口令的设置
- 大家有没有发现,女生带上口罩后,感觉颜值升高了,尤其眼睛好看?
- linux下搭建DNS子域及相关授权详解
- 凝思6.0.60操作系统编译安装sqliteman(版本1.2.2)
- 最优控制理论 八、CasADi求解路径约束轨迹优化的多重打靶法
- 洛谷P1433 吃奶酪--Java解法(货郎担问题)
- 一个让我感到 细思极恐 的开源项目!
- SpringBoot参数校验
- java实验上机实验4机动车
- 网络摄像头海思开发板_海思HI3518EV、200wifi摄像头完美解决方案
- 【编译原理】实验四:Yacc 分析程序生成器
- 普通exe文件、Python脚本、.Net项目写进win系统服务方法总结
- php在线dwg,CAD文件怎么在线进行版本的转换
- linux posix 消息队列,实现posix消息队列示例分享
- 世界各国的标准用电电压频率是多少
热门文章
- 程序员的基础和解决问题的思维很重要
- 解决ifconfig没有网卡问题
- mysql连接报java.math.BigInteger cannot be cast to java.lang.Long异常
- ios系统微信浏览器、safari浏览器中h5页面上拉下滑导致悬浮层脱离窗口的解决方法
- Python的__init__和self是做什么的?
- Java的“ for each”循环如何工作?
- slam 无人车 融合imu 后手动调整小车位姿,不受里程计影响
- 更改项目project名称,与项目名称;
- 根据文法画出语法树_输入语法推断的强化学习
- mysql数据库工程师考证题_100道MySQL常见面试题总结