Oop 系统Verilog中的类类型,不能作为子类构造和扩展
我已经用Virtual关键字创建了系统Verilog类。 将虚拟关键字作为前缀添加到类abc后,它将成为抽象类,无法使用new()构造函数为其创建对象。若这样做,用户将获得编译错误 虚拟课堂; ........ 末级 但同时,没有其他类可以从abc类扩展为子类。i、 e.abc类不能扩展为子类 SV是否支持不能使用new()构造函数(如抽象类)创建且不能扩展到子类的任何此类类类型。 如果system verilog支持任何此类类类型,那么在什么情况下定义此类将很有帮助Oop 系统Verilog中的类类型,不能作为子类构造和扩展,oop,abstract-class,subclass,system-verilog,Oop,Abstract Class,Subclass,System Verilog,我已经用Virtual关键字创建了系统Verilog类。 将虚拟关键字作为前缀添加到类abc后,它将成为抽象类,无法使用new()构造函数为其创建对象。若这样做,用户将获得编译错误 虚拟课堂; ........ 末级 但同时,没有其他类可以从abc类扩展为子类。i、 e.abc类不能扩展为子类 SV是否支持不能使用new()构造函数(如抽象类)创建且不能扩展到子类的任何此类类类型。 如果system verilog支持任何此类类类型,那么在什么情况下定义此类将很有帮助 任何输入都会有很大帮助。我
任何输入都会有很大帮助。我不完全理解你的意思。是的,您可以声明一个抽象(虚拟)类,您可以将其扩展到任何其他类中。你为什么说你不能 下面是一个简单的例子:
virtual class X;
function new();
endfunction
function print();
$display("hello world");
endfunction
endclass
class Y extends X;
endclass
module A();
Y y;
X x;
initial begin
y = new();
x = y;
x.print();
end
endmodule
Y
是一个派生类,您可以通过扩展类X
轻松做到这一点,但不能扩展虚拟/抽象类的说法是错误的。必须扩展它才能将其构造为派生子类。如果您试图构造一个虚拟类,您将得到一个错误
SystemVerilog没有阻止您扩展任何类的机制,但它确实可以通过将构造函数声明为local
来阻止您构建类的任何扩展。如果这样做,则必须提供其他静态方法来调用本地构造函数。这是典型的单例模式
现在,
A
的构造函数只能调用一次,并且您不能构造A
的扩展子类。它的构造函数需要调用super.new(),这已被定为非法。我猜您只想将该类用于静态
方法
正如@dave_59已经说过的,您可以声明构造函数local
:
class some_class;
local function new();
// intentionally empty
endfunction
endclass
class some_subclass extends some_class;
// even if we don't explicitly declare a constructor, the following is added
// automatically
//
// function new();
// super.new(); // leads to compile error
// endfunction
endclass
当您尝试实例化它时,这将导致编译错误:
some_class obj = new(); // leads to compile error
如果扩展该类,还将导致编译错误。这是因为任何子类都会隐式调用super.new()
,这是非法的,因为super.new
是local
:
class some_class;
local function new();
// intentionally empty
endfunction
endclass
class some_subclass extends some_class;
// even if we don't explicitly declare a constructor, the following is added
// automatically
//
// function new();
// super.new(); // leads to compile error
// endfunction
endclass
感谢@dave_59的澄清,我一直在寻找本地函数new,但无法将查询转化为文字。感谢Tudor Timi澄清本地函数new在基类中的工作,以及非法的super.new()在其扩展类中的工作。在发布的查询中,我想了解,在SV中,用户是否可以声明一个类,只创建一次对象,当尝试将其扩展到任何子类时,都会出错。dave_59和Tudor Timi回答并澄清了我对本地函数new及其使用的理解。谢谢你的意见@Serge