在SystemVerilog中新定义一种端口类型 "ref "传递变量地址而非变量本身。
1. 传递值

传递值是子程序传递参数的默认机制。这种传递机制将每个参数拷贝到子程序区域,如果子程序是 automatic 类型,那么子程序会在其本身的堆栈中保留一个局部的参数副本。参数在子程序内部的修改对外部不可见。

参数巨大时使用该方式传递参数是不可取的。

// 传递值的方式如下:
    function automatic int crc(bype packet[1000:1]);
        for (int i = 1; i <= 1000; i++)begin
            crc ^= packet[i];
        end
    endfunction

2. 传递引用 (ref)

ref参数类似于inout参数,只是inout参数被复制两次:一次在子程序被调用时,从外部进入子程序内部;一次在子程序返回时,从子程序内部传递到外部。 传递对象句柄也不例外,并且在作为ref或inout参数传递时具有类似的语义。 因此,除了修改对象的内容之外,对象句柄的引用还允许对对象句柄的更改(例如,分配新对象)。

没ref传递的是句柄,不能修改句柄,有ref,传递的是句柄的地址,可以修改句柄。

function void create( ref transcation tr)
         tr = new();    // 分配对象;
         tr.addr = 42;
    endfunction

通过引用进行参数传递时并不会将变量本身传递到子程序区域,而是传递原始参数的引用 (与C中的指针类似),子程序可以通过引用访问参数数据。

通过引用传递的参数应与等效数据类型匹配。

不允许进行转换(No casting)。

使用关键字 ref 声明传递参数的方式是引用而非其他。

对于具有静态生命的子程序,通过引用的方式传递参数是非法的。

语法格式如下:
        subroutine( ref type argument );

// 传递引用的方式如下:
        function automatic int crc (ref bype packet[1000:1]);
            for (int i = 1; i <= 1000; i++)begin
                crc ^= packet[i];
            end
        endfunction

当参数通过引用传递时,调用者和子程序共享参数的相同表示方式;因此,在调用者或子程序中对参数所做的任何更改都相互可见。 通过引用传递的变量赋值的语义是在子程序之外立即看到对其的更改(在子程序返回之前)。

因通过引用传递的变量可能是自动变量,故不应在任何禁止自动变量的上下文中使用ref参数。

只有以下引用传递参数是合法的

一个变量;
    一个类的属性;
    一个非打包结构的成员(unpacked structure);
    一个非打包数组的元素(unpacked array);

通过引用传递的动态数组,队列和关联数组的元素可能会从数组中删除,或者在调用子程序完成之前可能会调整数组的大小。
    通过引用传递的特定数组元素应继续存在于被调用子程序的范围内,直到它们完成。 如果在进行更改之前从阵列中删除了那些数组元素,那么被调用子程序对数组元素值所做的更改将不会在这些子程序的范围之外可见。这种引用被称为是过时的引用。

对可变大小的数组进行以下操作将导致对该数组的元素的现有引用变为过时的引用

动态数组显式或者隐式使用new[]进行数组大小的重定义;
    动态数组使用delete()方法进行删除;
    使用delete()方法删除被引用的关联数组的元素;
    包含引用元素的队列或动态数组通过赋值更新;
    使用队列方法删除引用的队列元素;

通过引用传递参数是一个唯一的参数传递限定符,不同于输入,输出或输入。 将ref与任何其他方向限定符组合应该是非法的。例如:

task automatic incr( ref input int a );   // 非法

为了保护引用传递的参数不被子程序修改,const 限定符可以与ref一起使用,表示参数虽然通过引用传递,但它是一个只读变量;
        如果引用参数使用const修饰,那么该不允许子程序修改, 子程序尝试修改时编译器报错。

task automatic show ( const ref byte data [] );
        for ( int j = 0; j < data.size ; j++ )
            $display( data[j] );    // 数据只读
    endtask

3. 参数默认值

为了处理常见情况或允许使用未使用的参数,SystemVerilog允许子程序为每个单数参数指定默认值。

语法格式:
    subroutine( [ direction ] [ type ] argument = default_expression);

task read(int j = 0, int k, int data = 1 );
    ...
endtask

// call method.
read( , 5 );     // is equivalent to read( 0, 5, 1 );
read( 2, 5 );    // is equivalent to read( 2, 5, 1 );
read( , 5, );    // is equivalent to read( 0, 5, 1 );
read( , 5, 7 );  // is equivalent to read( 0, 5, 7 );
read( 1, 5, 2 ); // is equivalent to read( 1, 5, 2 );
read( );         // error; k has no default value
read( 1, , 7 );  // error; k has no default value
————————————————
版权声明:本文为CSDN博主「254、小小黑」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/immeatea_aun/article/details/89285474

【转载】SystemVerilog中子程序调用与参数传递(ref关键字)相关推荐

  1. java web 调用hadoop_Java及Web程序调用hadoop2.6

    1. hadoop集群: 1.1 系统及硬件配置: hadoop版本:2.6 :三台虚拟机:node101(192.168.0.101).node102(192.168.0.102).node103( ...

  2. C#程序调用cmd执行命令

    酷小孩 原文 C#程序调用cmd执行命令 对于C#通过程序来调用cmd命令的操作,网上有很多类似的文章,但很多都不行,竟是漫天的拷贝.我自己测试整理了一下. 代码: string str = Cons ...

  3. C#程序调用外部程序

    /* *编程语言:VisualStudio.NetC#(Beta2) *作者:迪泊威 *功能:通过C#程序调用Windows记事本程序编辑一个 *名为test.txt的文本文件. * *在整个程序中S ...

  4. [转载]Linux从程序到进程

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 计算机如何执行进程呢?这是计算机运行的核心问题.即使已经编写好程序,但程序是死的. ...

  5. 桌面程序调用Web Service应用实例

    作者:朱金灿 来源:blog.csdn.net/clever101 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com ...

  6. 小程序调用微信支付返回错误

    小程序调用wx.requestPayment(OBJECT)这个方法发起微信支付,返回"调用支付JSAPI缺少参数:total_fee"这个错误.查看控制台发现预支付订单id为空( ...

  7. GO程序调用C及C++库的实现方式

    还有这个: https://blog.csdn.net/zdy0_2004/article/details/79124269 https://blog.csdn.net/boshuzhang/arti ...

  8. [转]mpvue中的小程序调用系统自带查看图片的功能

    mpvue中的小程序调用系统自带查看图片的功能 这里举个栗子: <template><div class="keting"><div class=&q ...

  9. 【ASP.NET Web API教程】3.3 通过WPF应用程序调用Web API(C#)

    注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本博客文章,请先看前面的内容. 3.3 Calling a Web API From a WPF Application ...

最新文章

  1. 5秒手机猫片也能重建猫咪3D模型,Meta提出新算法为变形物体建模 | CVPR 2022
  2. 又一数据库高危漏洞爆出,数据安全如何有效保障?
  3. 卢伟冰称天玑9000调校顺利 Redmi K50系列要来了
  4. 关于钥匙串中所有证书签名无效的问题解决纪录
  5. 谁是“顶会狂魔”?周明、张潼等上榜,清华第四,北大第六 | 2018 ML和NLP顶会论文统计出炉...
  6. 你需要的不是大数据 而是正确的数据~
  7. VirtualBox安装debian无法启动,正确的解决办法
  8. JS-13-jquery
  9. 用什么计算机演奏音乐,用这个你可以用自己的电脑弹奏美妙的音乐.
  10. Java实现文件上传和下载
  11. 记录向 | 爬虫 | 裁判文书爬取(java)
  12. c语言5个同学三门成绩,求助:c语言 求5个同学语数外三门功课的总分与均分。大家看我错在哪了...
  13. 域名防红直连防封怎么布置?
  14. Could not open the editor: URLDecoder: Illegal hex characters in escape (%) pattern - For input stri
  15. 开发者大会优先谈云,对于微软Win10还重要吗
  16. 参加这些学术会议,还怕发不了SCI?
  17. Google Earth Engine (GEE)——awesome-gee-community-catalog
  18. 基于EasyDarwin云视频平台的幼儿园视频直播(手机直播/微信直播)解决方案
  19. Java调用Mysql
  20. Linux命令之ifconfig命令

热门文章

  1. 【笔记】嵌入式C语言随堂笔记
  2. [@vue/compiler-sfc] defineProps is a compiler macro and no longer needs to be imported
  3. 一文了解 Go time 包的时间常用操作
  4. 测试域名是否可用命令
  5. 如何清理占用计算机内存,win10如何清理电脑内存占用高怎么办
  6. MySQL牛客网刷题3
  7. Nginx集成GeoIP2模块实现地区识别与屏蔽
  8. 《C#零基础入门之百识百例》(九十一)预处理器指令 -- 代码示例
  9. 2019年浙江宁波宁海县下属事业单位第二批招聘教师公告(97人)
  10. OSPF高级特性 —— 管理距离(优先级)修改 + 外部路由的metric值的修改