在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 3890|回复: 4

[讨论] systemverilog中的ref相关问题

[复制链接]
发表于 2018-7-23 09:29:47 | 显示全部楼层 |阅读模式

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

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

x
systemverilog中有这样一段代码:function void create(ref Transaction tr);
    tr = new();
    tr.addr = 42;
endfunction

Transaction t;
initial begin
    create(t);
    $display(t.addr);
end

打印结果为42。即create函数更改了t的属性。但在initial begin块中并为对t进行实例化,主体中仅对t进行了声明,按理来说在主体中t还未被分配地址。而ref参数传递的是变量的指针,如此理解的话此时t的指针应该为null,传参之后tr的值也应为null,那么再在子函数中调用new实例化类之后,tr应该被分配了一个全新的地址空间吧,为什么主体还能看到更改呢?求指教,谢谢!
发表于 2018-7-25 09:16:41 | 显示全部楼层
这里的ref可以理解为inout,如果去掉ref或者改成input就是你期望的结果。
发表于 2018-7-25 11:09:14 | 显示全部楼层
因为声明了ref类型,在方法内部的修改可以被调用该方法的代码看到。
 楼主| 发表于 2018-7-26 09:25:11 | 显示全部楼层
回复 2# hover99
也就是说,传入的句柄在function内获取到新的地址后,会将该地址输出给主体的句柄,对吧
 楼主| 发表于 2018-7-26 09:30:30 | 显示全部楼层
回复 3# 静影沉璧
其实主要是在纠结为什么t和tr最后的地址会相同。如果是在主函数中对t进行了实例化,再调用create进行传参的话,这个时候是传递的地址嘛,两者指向同一个空间,function内的修改主函数中肯定是能看到的噻。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-28 04:04 , Processed in 0.019518 second(s), 6 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表