SystemVerilog中如何避免函数隐藏以访问父类同名无参方法
SystemVerilog 解决类继承中方法隐藏的方案
你遇到的是SystemVerilog中同名方法的隐藏问题:当子类定义了和父类同名、但参数列表不同的方法时,父类的同名方法会被完全隐藏,默认无法通过子类句柄直接调用。
常见的解决方法有三种:
方法1:使用super关键字显式调用父类方法(适合子类内部调用场景)
如果是在子类的方法内部需要调用父类的无参get(),直接用super.get()即可,也可以额外封装一个外部可用的调用接口:
class B extends A; task get(int a,int b); $display("%d %d",a,b); endtask // 封装父类方法的调用接口,外部可直接调用 task get_parent(); super.get(); endtask endclass
之后你就可以通过b.get_parent()调用父类的无参get()。
方法2:向上类型转换为父类句柄调用(适合外部直接调用场景)
SystemVerilog支持子类句柄向上赋值给父类类型的句柄,通过父类句柄就可以访问到父类定义的无参get():
initial begin B b = new(); A a = b; // 向上类型转换 a.get(); // 正常输出"A" b.get(1,2); // 正常调用子类的带参方法 end
方法3:在子类中导入父类的同名方法(类似C++的using语法,最贴合需求)
SystemVerilog提供了和C++using功能几乎一致的语法,你只需要在子类中导入父类的同名方法,就能让两个版本的get()在子类中同时可见:
class B extends A; import A::get; // 导入父类的get方法,避免隐藏 task get(int a,int b); $display("%d %d",a,b); endtask endclass
修改后你就可以直接通过子类句柄调用两个版本的方法:
initial begin B b = new(); b.get(); // 正常输出"A",调用父类无参方法 b.get(1,2); // 正常输出"1 2",调用子类带参方法 end
这个方法的行为和C++的using A::get完全一致,是最便捷的解决方案。
内容的提问来源于stack exchange,提问作者Jack Reacher
相关产品推荐
相关产品推荐

