微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 微电子和IC设计 > IC验证交流 > system verilog中关于ref 的求解答

system verilog中关于ref 的求解答

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

这里简单举例解释一下,需要结合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内部这个指针指向的内容已经被改变了,这是一种非常有用保护措施)。

谢谢了,我说说我的理解,你看对不对?
ref相当c中,定义了一个指针变量,例如:
int max(int* a){
...
}
main(){
int *b
...
max(b);
}
指针变量同指向的都是同一个值。及两个指针指向同一个变量。 ref定义的变量是不是相当于指针。原理和上面的这段代码的原理差不多?
const ref 变量,就是变量的内容不能在函数里面不能修改。
我的理解不知道对不对,有什么问题请说一下。

指针指向的内容不能被子程序改变吧

2楼的讲解已经非常详细了!

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

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top