SystemVerilog继承

继承是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

发布了124 篇原创文章 · 获赞 8 · 访问量 6701

猜你喜欢

转载自blog.csdn.net/qq_43042339/article/details/104491252