ET创芯网论坛(EETOP)

找回密码

  登录   注册  

电动/混动汽车、48V系统、汽车功能安全等技术资料合集
查看: 4196|回复: 11

[讨论] system verilog中关于ref 的求解答

[复制链接]
发表于 2012-9-27 15:10:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册

x
各位兄弟姐妹,小弟在看system verilog的时候,看到这样ref有些不明白,求教一下大家。
   1  SystemVerilog也允许通过传值的方式来传递数组参数,这样数组将被整体复制,
  这将消耗一定的内存和操作时间。而使用ref传递,只是获取该数组的入口地址 (句柄/指
  针),操作速度快,减少内存使用。当然,在这个例子里面,我们使用到了const。const关
  键字可以防止一个函数或者任务改变一个通过ref类型传递的变量。
     最后一句话,”const关
     键字可以防止一个函数或者任务改变一个通过ref类型传递的变量“ 怎么理解,我有点不明白啊。请教大家一下。
是不是在函数内部修改了ref型变量的值,外边的变量不变化,只有函数里面的变量发生了变化? 加上const 后,就变成的常变量了。我的理解对不对?

    2 ”在子程序修改ref参数变量的时候,其变化对于外部是立即可见的“是不是相当于函数里面和函数外面使用的是同一个变量?

请教大家了。
发表于 2012-9-28 21:47:23 | 显示全部楼层
这里简单举例解释一下,需要结合C的指针概念理解:
    task/function xxxxx(ref logic arguments);
    endtask/endfunction
上面的task/function,其“形参”是:ref logic arguments,
ref的意思你自己已经看过了,那么,这个task/function被调用的时候发生了什么呢?
那就是logic型变量arguments的指针被复制并传递至task/function内部,在task/function内部的一切
对arguments的操作,都是对变量arguments对应的指针,所指向的内容做操作。这和c语言的指针是一个概念。也就是说task/function参数是复制一份送入task/function的,这个行为是没有改变的,加了ref,那么参数的指针被复制,不加ref则参数本身被复制,当你对arguments操作的时候,你改变的,是指针所指向地址的内容而非指针本身。(这就是所谓的:在子程序修改ref参数变量的时候,其变化对于外部是立即可见的,因为指针指向的地址没变而该地址本身指向的内容可能改变了。如果sv允许修改指针本身,那么,这句话立刻就不成立了,但是sv限制了对指针本身的修改。)
const限定符限定了指针指向的内容是不可修改的,这个限定符可以防止在task/function内部修改了某个参数,引起意外错误(比如,在其他地方也用了这个指针指向的内容,但他不知道在task/function内部这个指针指向的内容已经被改变了,这是一种非常有用保护措施)。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-9-29 16:36:48 | 显示全部楼层
回复 2# remnant


    谢谢了,我说说我的理解,你看对不对?
    ref相当c中,定义了一个指针变量,例如:
            int max(int* a){
                ...

               }

               main(){
             int *b
            ...
             max(b);

               }
         指针变量同指向的都是同一个值。及两个指针指向同一个变量。 ref定义的变量是不是相当于指针。原理和上面的这段代码的原理差不多?
        const ref 变量,就是变量的内容不能在函数里面不能修改。

      我的理解不知道对不对,有什么问题请说一下。
回复 支持 反对

使用道具 举报

发表于 2013-5-19 21:35:55 | 显示全部楼层
指针指向的内容不能被子程序改变吧
回复 支持 反对

使用道具 举报

发表于 2013-5-23 10:23:53 | 显示全部楼层
2楼的讲解已经非常详细了!
回复 支持 反对

使用道具 举报

发表于 2013-6-27 17:40:27 | 显示全部楼层
语言这种东西最好不要仅仅从概念解释上理解。所有这些表述形式都只是编译实现的需要。
所有语言的数据结构,其实都是存储器中的bit,只有两类语义,地址和数据,这都地球人全知道。
所谓的多态、引用、集成、指针、静态、以及这里提到的ref等等,都只不过是一些翻译词汇,用来描述针对某地址的数据进行了某些读写操作。
比如ref ,大白话讲:就是说你一加这东西,你程序操作的目标数据,都是存储器中同一片地址数据,这样凡是用到这片数据的程序,都会牵一发动全身。
回复 支持 反对

使用道具 举报

发表于 2018-3-19 19:57:58 | 显示全部楼层
不错!
回复 支持 反对

使用道具 举报

发表于 2018-12-14 14:37:34 | 显示全部楼层
6楼说的有道理
回复 支持 反对

使用道具 举报

发表于 2019-1-26 16:12:12 | 显示全部楼层
回复 2# remnant


   学习了
回复 支持 反对

使用道具 举报

发表于 2019-6-10 17:47:00 | 显示全部楼层
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /2 下一条

关于我们|联系我们|ET创芯网 ( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2019-8-23 17:07 , Processed in 0.107403 second(s), 12 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表