systemverilog中的参数传递——ref、input、output

这篇具有很好参考价值的文章主要介绍了systemverilog中的参数传递——ref、input、output。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 静态数组作为参数

sv中的静态数组、动态数组、队列都是用一块内存存放,而他们的名字作为该内存的地址,这点和c一致,但sv中没有指针的概念。

传递这种大片内存的值一般只有两种规则:

1.地址传递,函数内部修改可以改变函数调用的值。

2.值传递,将整片空间复制一份,函数内部修改不会改变函数调用的值。

但是,sv中里面关键字有三个: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
1234567

1.1 input

当函数类型为input时。

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

输出结果:1 2

具体过程如下:

1.函数调用之前,内存里只有r数组的空间

2.函数调用之后,会将r拷贝一份到a, 函数里面用的都是a这份空间

3.函数调用之后,复制后,修改的是a这份空间

4.函数返回之后,a空间会被释放掉,所以r的值并没有被修改

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

1.2 output

当函数类型为output时。

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

输出结果是:3 0

具体过程如下:

1.函数调用之前,内存里只有r数组的空间

2.函数调用 之后,会新建一份a数组,注意这里并不会把r的值传进来,函数里面用的是a这份空间

3.函数调用之后,赋值后,修改的是a这份空间

4.函数返回之后,会将r指向a空间,而原来的r指向的空间会被释放掉,所以r的值都被修改了

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

1.3 ref

当函数是ref时。

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

输出结果是: 3 2

具体过程如下:

1.函数调用前,内存里只有r数组的空间

2.函数调用之后,会将a指向r所在的空间,函数里面用的都是这份空间

3.函数调用之后,赋值后,修改的是这份空间的值,所以a和r的值都被修改啦

4.函数返回后,所以r的值只有部分被修改

因此,ref采用的是标准的地址传递,只有一份数组,函数内部和调用出都是访问该空间。

对比来看,input是将函数外面的值传递到函数里面,调用之后,函数里面的值就被丢弃了;output是将函数里面的值传递到函数外面来,调用之后,函数外面的值就被丢弃了;ref是函数内部和外部看到的是同一份值,哪里都会被修改。另外,可以看出,采用ref关键字,占用 的空间内存是最小的,因为只有一份数组,这样能提高效率。

2 动态数组或队列作为参数

如果传递的是动态数组或队列,其结果是一模一样的,不另外作说明。

3 类作为参数

下面展示一些 内联代码片

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 voidf(input /output ref c c0);
  c0.v0 =3;
 endfunction
12345678910111213141516

输出结果是:

1.input : 3 2

2.output :报null point 错误

3.ref: 3 2

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

4,解释:

以下均为个人理解,如若有所差错,实属难免。文章来源地址https://www.toymoban.com/news/detail-608928.html

把SV与C语言做对比:
SV中的句柄就是C中的指针,其本质上是一串数字,表示地址。

C中分为传址调用和传值调用,
传值调用:在SV中就对应input,是额外开辟一块内存复制该变量传入,并不会更改原来的变量。
传址调用:在SV中对应ref,表示引用原始变量,会导致该变量的改变,如果不想改变该变量,可以再加const前缀。

在调用类的时候:
调用类(句柄),句柄指向一个地址,当使用input时,不会复制一个相同的类(句柄),因为内存中的地址是唯一的,不存在相同的两个地址。

传递的是一个句柄,我们分为两种情况,
一是当该句柄已经分配一个对象(表现为句柄 指向了一个地址),这时已经有一个确定的对象了,当使用input传递该句柄时,指向一个确定的地址。 当使用input的时候,就直接调用该句柄所指向的对象, 对该变量(类)更改与ref没有区别退出函数时,仍然指向该地址
二是该句柄没有分配对象也就是一个空指针,句柄传入函数时,必须要先new,例化后分配了一个地址,这个句柄这时候指向该地址,但是函数是动态的,有生命的,当退出函数时,该句柄指向的空间自动解除分配,这时候的 指针仍然是一个空指针
当使用ref的时候,给该句柄分配了什么地址,最后就指向什么地址。

到了这里,关于systemverilog中的参数传递——ref、input、output的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 优雅地处理参数传递:Spring Boot中的技巧

    目录 一:四种传参方式 1.1:在 URL 中传递参数 1.2:PathVariable 传递参数(Restful 风格) 1.3:在请求体中传递参数 1.4:在请求头中传递参数  二:文件上传接口测试  2.1 : test.java  三、@RequestParam 3.1 多个参数  3.2 单个参数  四、@PathVariable 4.1  单个参数  4.2  多个参数 五、@

    2024年02月05日
    浏览(52)
  • element UI 中的 el-tree 实现 checkbox 单选框功能,及 bus 传递参数的方法

    el-tree 单选功能 在日常项目开发中,会经常遇到,树形结构的查询方式,为了快速方便开发,常常会使用到快捷的ui组件去快速搭树形结构,这里我用的是 element ui 中的 el-tree 。第一次接触这种功能的时候也是各种网站查询,虽然也都能实现功能,但是都会有一些小问题,就

    2024年04月10日
    浏览(51)
  • 首页搜索框传递参数,并在搜索页面中的搜索框中进行显示,搜索框绑定回车键进行搜索

    1.写出搜索条件和搜索框 2.添加scss样式 页面 3.搜索框选择条件,在搜索框中输入内容,然后进行页面跳转 在搜索框中输入内容,然后进行页面跳转 4.页面跳转后从地址栏中获取相关数据,搜索条件和搜索框中的内容 从地址栏中获取到相关数据searchText和selectSearch的值

    2024年02月10日
    浏览(98)
  • systemverilog中的bind

    最早接触 bind 是在assertion 当中,将assertion 与 dut 进行绑定连接,如下例子: 来看下面一个将 interface bind 到 module 的例子: 可以看到,包含断言的 interface , 其端口信号的方向均为 input ,也就是说 property 中包含的信号都是从 interface 的外部给进来的; 实际上, bind 不

    2024年02月10日
    浏览(37)
  • SystemVerilog中的切片操作

    在硬件描述语言中,信号切片操作是指对信号中的某个或某几个位进行访问或操作 其中, signal_name 是要进行切片操作的信号名, start_index 是切片的起始位置, length 是切片的长度。 例如,如果有一个32位的信号 my_signal ,需要获取该信号的第16到第23个位(包括第16和第23个位

    2024年02月02日
    浏览(43)
  • Python 中的 TypeError: an integer is required 错误通常是由于我们在代码中使用整数(integer)参数的地方实际上传递

    Python 中的 TypeError: an integer is required 错误通常是由于我们在代码中使用整数(integer)参数的地方实际上传递了非整数类型的参数,例如字符串(string)或浮点数(float)。这个错误可以在编写 Python 程序时遇到,但也可能是在编写 Python 脚本时遇到。 下面是解决 TypeError: an i

    2024年02月15日
    浏览(43)
  • Vue + el-ui table 内嵌 input 调用 focus 方法无效;this.$refs.xxx.focus()方法无效

    1、先说需求 a.在表格编辑态的时候,可以在①处敲击“回车键”,光标能跳转到②处 b.表格可以在浏览态和编辑态切换,用v-show来实现的编辑和浏览 2、代码片段(这种方式不生效)         页面显示代码: methods方法: 3、页面效果 如图,当在第一行 9999 处敲击回车之后

    2024年02月05日
    浏览(42)
  • c# ref和out参数修饰符

    ref:把值类型变成引用类型传递,形参的值改变了实参的值也会改变 out:使方法可以有多个返回值

    2024年01月16日
    浏览(45)
  • C#out、ref和params参数

    out参数用于传递一个方法的输出值。它表示在方法内部,该参数没有被初始化,而是由方法赋值。方法结束后,该参数会被赋予一个值。 在使用out参数时,调用方法时必须指定该参数,并且不需先进行初始化。 out参数可以在方法内部定义,并且可以定义多个。 ref参数用于在

    2024年02月13日
    浏览(45)
  • postman进行post、get参数传递及中文乱码和各类型参数传递和json格式传参和日期型参数传递和响应数据传回

    postman是一种测试工具 用postman直接在其上输入参数名和参数值就行,不用区分post和get请求方法,当然java代码要改变一点,在响应注解的方法里面添加和postman中输入的参数名一样的形参 get请求: 代码:注意在响应注解的方法里面新添加了形参,其就对应着上面图片中的参数

    2024年02月07日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包