本文介绍了 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
具体过程如下:

  1. 函数调用之前,内存里只有 r 数组的空间
  2. 函数调用之后,会将 r 拷贝一份到 a,函数里面用的都是 a 这份空间
  3. 函数调用之后,赋值后,修改的是 a 这份空间的值
  4. 函数返回之后,a 空间会被释放掉,所以 r 的值并没有修改

因此,input 是标准的值传递。

加 output 的情况

function void f(output int a[2]);a[0] = 3;
endfunction

输出结果是:3 0

  1. 函数调用之前,内存里只有 r 数组的空间
  2. 函数调用之后,会新建一份 a 数组,注意这里并不会把 r 的值传进来,函数里面用的都是 a 这份空间
  3. 函数调用之后,赋值后,修改的是 a 这份空间的值
  4. 函数返回之后,会将 r 指向 a 空间,而原来 r 指向的空间会被释放掉,所以 r 的值都被修改了

因此,加 output,采用的是地址传递,确切的说是反向的地址传递,数组共有两份,函数内部看到的是新建的一份,并传递给函数调用处,因此,函数调用前看到的是第一份,函数调用后看到的是新建的那份。

加 ref 的情况

function void f(ref int a[2]);a[0] = 3;
endfunction

输出结果是:3 2
具体过程如下:

  1. 函数调用之前,内存里只有 r 数组的空间
  2. 函数调用之后,会将 a 指向 r 所在的空间,函数里面用的都是这份空间
  3. 函数调用之后,赋值后,修改的是这份空间的值,所以 r 和 a 都修改了
  4. 函数返回之后,所以 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

结果是:

  1. input:3 2
  2. output:报 null point 错误
  3. ref:3 2

可以看出,如果是传递类的话,使用 input 和 ref 是一样的,都是地址传递,而 output 和数组的结果是一样的。

其他

system verilog中关于ref 的求解答

system verilog中的参数传递——ref,input,output相关推荐

  1. (136)System Verilog覆盖组参数传递实例

    (136)System Verilog覆盖组参数传递实例 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog覆盖组参数传递实例 5)结语 ...

  2. System Verilog中的automatic

    System Verilog中的automatic automatic 仿真测试 1.子程序均为静态存储的情况 2.在静态存储子程序中加入automatic的中间变量 3.修改module test为 ...

  3. Angular中父子组件传值@Input @Output @ViewChild最全面最简单的总结

    父组件传递给子组件: 值传递方式:@Input既可以传递数据也可以传递方法 传递数据(不举例了) 传递方法 // 父组件定义方法 parentRun(){alert('这是父组件的 run 方法'); ...

  4. system verilog中的$sformatf()/$sformat()

    转载自https://zhuanlan.zhihu.com/p/279618353 字符串在验证平台中是经常被使用的,今天我们来说说在SystemVerilog中非常重要和常用的sformatf()/ ...

  5. sv_labs学习笔记——sv_lab4(System Verilog)

    sv_labs学习笔记--sv_lab4(System Verilog) lab4 OOP encapsulation 实验概述 任务代码解析 Packat实现与理解 语法点解析 randomize( ...

  6. sv_labs学习笔记——sv_lab3(System Verilog)

    这里我们在前两个lab的基础上继续完善,搭建一个数据接受的功能.在lab2 中我们实现了相关发送信息的打印,选择发送接受的端口,完善发送时序,在这一小节中将实现对端口发送数据的回收,然后进行比较发送的 ...

  7. System Verilog——任务和函数 Part-I

    System Verilog 可以说是Verilog+C的结合,在Verilog的基础上,引入了面向对象的思想,使得更有利于实现对电路的验证.因此很多时候需要对比Verilog,结合C,对比SV(Sy ...

  8. 再说System Verilog 与 Verilog 的关系

    System Verilog 与 Verilog 的关系 标准 当前的System Verilog标准是由IEEE(国际电子电气工程师协会)和Accellera(基于工业的标准协会)两个国际组织制定的 ...

  9. System Verilog自学笔记专栏概述博文目录

    本文用于梳理学习笔记目录下的博文笔记,概述会有笔者的System Verilog的学习反思以及相关随笔,望有同学发现问题及时提出~感谢 概述随笔 了解基本的概念,框架后,开始使用例子进行学习语言.需要 ...

最新文章

  1. Generics and Linq demo
  2. 5月16日 | 硬核突破,应用革新!阿里云数据库线下活动-北京站开启
  3. 关闭应用程序的几种方法
  4. html5 客户端数据缓存机制,深入理解HTML5离线缓存机制
  5. cookie分号后面没有值_浏览器Cookie介绍
  6. 路由器三种口令的设置
  7. 大家有没有发现,女生带上口罩后,感觉颜值升高了,尤其眼睛好看?
  8. linux下搭建DNS子域及相关授权详解
  9. 凝思6.0.60操作系统编译安装sqliteman(版本1.2.2)
  10. 最优控制理论 八、CasADi求解路径约束轨迹优化的多重打靶法
  11. 洛谷P1433 吃奶酪--Java解法(货郎担问题)
  12. 一个让我感到 细思极恐 的开源项目!
  13. SpringBoot参数校验
  14. java实验上机实验4机动车
  15. 网络摄像头海思开发板_海思HI3518EV、200wifi摄像头完美解决方案
  16. 【编译原理】实验四:Yacc 分析程序生成器
  17. 普通exe文件、Python脚本、.Net项目写进win系统服务方法总结
  18. php在线dwg,CAD文件怎么在线进行版本的转换
  19. linux posix 消息队列,实现posix消息队列示例分享
  20. 世界各国的标准用电电压频率是多少

热门文章

  1. 程序员的基础和解决问题的思维很重要
  2. 解决ifconfig没有网卡问题
  3. mysql连接报java.math.BigInteger cannot be cast to java.lang.Long异常
  4. ios系统微信浏览器、safari浏览器中h5页面上拉下滑导致悬浮层脱离窗口的解决方法
  5. Python的__init__和self是做什么的?
  6. Java的“ for each”循环如何工作?
  7. slam 无人车 融合imu 后手动调整小车位姿,不受里程计影响
  8. 更改项目project名称,与项目名称;
  9. 根据文法画出语法树_输入语法推断的强化学习
  10. mysql数据库工程师考证题_100道MySQL常见面试题总结