SystemVerilog中ref不是想用就能用

SystemVerilog构建测试平台时,经常会用到task或者function(这里我们统称为方法),在这些方法中可以像module一样使用inputoutputinoutref声明变量传递的方向,这其中的ref与其他三种类型不同,其他三种均属于值传递,效率相对ref比较低,所有的数据需要在每次方法调用的时候被复制。ref传递参数时,不会将参数复制给方法,而是将对参数的引用传递给方法,这样方法对引用的修改就会同时反应在方法体外。本文将示例ref的几种常用用法和注意事项。

1 ref

【示例】 

【仿真结果】

编译不通过!这是为什么呢?在IEEE1800-2012中规定,ref只能用于动态方法中,即要声明方法automatic,如果没有特定指明那么任务默认都是static,所以示例编译时错误。对上例修改如下。

【示例】

【仿真结果】 

示例中,在pass_by_ref之外的sig发生变化时,方法内的显示任务也读取到了sig的变化,所以在对应的时刻输出的信息可以观测到sig的变化。当然,此时方法内如果对引用的参数进行修改,也会引发方法外部变量的变化。

【示例】 

【仿真结果】 

示例中,sig通过ref传入到方法pass_by_ref内,在pass_by_ref内对sig进行了修改。同时在pass_by_ref外通过while(1)对读取sig的值并输出,通过仿真结果可以看到,方法pass_by_refsig的值跟随者pass_by_refsig的变化同时发生变化。可见,ref类似于C语言中的指针传参。那么有时候我们不期望方法对引用的参数进行修改,仅仅只能进行“只读”操作,那么应该如何实现呢?

【示例】 

【仿真结果】 

示例中我们在ref的基础上增加了const特性,从而可以使方法引用的数据处于一种“只读”的状态。此时如果对引用的参数在方法内进行修改,那么编译时将会报错,如上例所示。

同时,ref使用时实参类型和形参类型必须完全匹配,即使实参类型和形参类型可以自动转换也不行。

【示例】

【仿真结果】
 
综上述示例,ref不是想用就能随便用的,我们在方法中使用ref时需要注意以下几点:

ref只能用于动态方法中;

ref引用的参数,此时方法对引用的修改将会同时反应在方法之外;反之,在方法调用期间,方法体外对被引用参数的修改,也会同时反应在方法之内;

如果期望方法对于引用只能进行“只读”访问,那么可以在ref的基础上增加const特性;

refinputoutputinout不能连用;

ref指定的形参后在方法被引用时,形参类型和实参类型必须完全匹配,即使形参类型和实参类型可以自动转换也不行;

 


全部评论

相关推荐

鱼专:别投了,我看到有人点了第二个链接投递,还没退出界面,不合适的邮件就发过来了
点赞 评论 收藏
分享
饼子吃到撑:学院本是这样的,找工作拼运气,你技术再好人家筛选学历照样沉入海底,海投就行了
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务