Verilog系列:local和protected保护类成员

SystemVerilog,如果没有特别明确的指出,那么class中的属性和方法的访问属性默认为public,其中的任何成员都可以通过该类的对象被访问.但是在有些情况下,需要对class中的部分成员进行隐蔽,class中的部分成员不能被该class以外的用户访问,这时SystemVerilog根据用户访问权限,采用不同的关键字对class成员进行声明定义,从而可以实现约束class中成员对外的可见性.

在具体编写代码的过程中,一般可以使用localprotected关键词来对成员的被访问属性进行约束,成员定义时如果没有明确这两个关键词,那么该成员的属性为public(当然SystemVerilog中并没有public这个关键词,这里仅表示成员属性公开),即访问不受任何约束.

当成员被标识为local,那么该成员只可以被该类中的方法访问,不能被该类的用户访问,也不能直接被其子类访问.当成员被标识为protected,除了该成员可以被子类能够访问外,其余特性与local标识后的属性一致.

【示例】

【仿真结果】

可见,get_obj声明时指定为local类型后,其不能被cobj的子类访问,同理如果将上例中第3行的i声明时指定为local,那么i也只能被cobj中的方法访问,不能被cobj的子类访问.

【示例】

【仿真结果】

上例中cobj中的disp被标识为protected,那么该成员除了可以被子类访问以外,其他特性与local一样,即只能被该类内部的方法访问.所以32行调用disp时将会报错,那么是不是被localprotected标识的成员只能被该类本身或者其子类访问呢?答案是否定的,实际应用中存在一种特殊情况,SystemVerilog中允许标明local或者protected的成员被同一个类引用.

【示例】

【仿真结果】

示例中,cobj例化了两个实体pp0,通过disp调用了cobj中的compare,compare的参数为cobj类型变量p,在进行比较时引用了p中的local成员i和当前类中的local成员this.i进行比较并返回比较结果.可见,22行在实例化的p中引用了实例化p0中的local成员i是允许的.

通过上述示例可以得出,在具体使用过程中,如果class中的某些成员不期望被继承,那么这些成员的用户一般只有两种:类本身和该类的用户,可以在声明或者定义时显式的标明local或者protected实现对成员被访问级别的划分,从而可以实现类中的一些成员可以被用户访问,而一些成员只能被类本身的成员访问,从而可以实现类成员可见性的不同划分.

全部评论

相关推荐

点赞 评论 收藏
分享
点赞 评论 收藏
分享
人间雪:简历最好只要一页,除非你牛逼到一页都写不下了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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