继承是OOP中的一个概念,它使我们可以扩展一个类以创建另一个类,并可以从新类对象的句柄访问原始父类的所有属性和方法。 该方案背后的思想是允许开发人员在新类中添加新的属性和方法,同时仍保持对原始类成员的访问。 这使我们可以进行修改而完全不涉及基类。
例
ExtPacket被扩展,因此是Packet的子类。 作为子类,它从其父类继承属性和方法。 如果在父类和子类中都存在一个具有相同名称的函数,则其调用将取决于用于调用该函数的对象句柄的类型。 在下面的示例中,Packet和ExtPacket都具有一个名为display()的函数。 当子类句柄调用此函数时,将执行子类display()函数。 如果由父类句柄调用此函数,则将执行父类display()函数。
class Packet;
int addr;
function new (int addr);
this.addr = addr;
endfunction
function display ();
$display ("[Base] addr=0x%0h", addr);
endfunction
endclass
//使用“ extends”关键字从基类“ Packet”派生一个名为“ ExtPacket”的子类。 子类继承父类的所有变量和方法
class ExtPacket extends Packet;
//这是一个仅在子类中可用的新变量
int data;
function new (int addr, data);
super.new (addr); // Calls 'new' method of parent class
this.data = data;
endfunction
function display ();
$display ("[Child] addr=0x%0h data=0x%0h", addr, data);
endfunction
endclass
module tb;
Packet bc; // 基类Packet的变量,bc
ExtPacket sc; //子类变量ExtPacket的变量,sc
initial begin
bc = new (32'hface_cafe);
bc.display ();
sc = new (32'hfeed_feed, 32'h1234_5678);
sc.display ();
end
endmodule
Simulation Log
ncsim> run
[Base] addr=0xfacecafe
[Child] addr=0xfeedfeed data=0x12345678
ncsim: *W,RNQUIE: Simulation is complete.
参考文献:
【1】https://www.chipverify.com/systemverilog/systemverilog-inheritance