SystemVerilog中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_ref外sig的值跟随者pass_by_ref内sig的变化同时发生变化。可见,ref类似于C语言中的指针传参。那么有时候我们不期望方法对引用的参数进行修改,仅仅只能进行“只读”操作,那么应该如何实现呢?
【示例】
示例中我们在ref的基础上增加了const特性,从而可以使方法引用的数据处于一种“只读”的状态。此时如果对引用的参数在方法内进行修改,那么编译时将会报错,如上例所示。
同时,ref使用时实参类型和形参类型必须完全匹配,即使实参类型和形参类型可以自动转换也不行。
【示例】
l ref只能用于动态方法中;
l ref引用的参数,此时方法对引用的修改将会同时反应在方法之外;反之,在方法调用期间,方法体外对被引用参数的修改,也会同时反应在方法之内;
l 如果期望方法对于引用只能进行“只读”访问,那么可以在ref的基础上增加const特性;
l ref和input、output、inout不能连用;
l ref指定的形参后在方法被引用时,形参类型和实参类型必须完全匹配,即使形参类型和实参类型可以自动转换也不行;
