System verilog 为什么我需要systemverilog中的抽象类?

System verilog 为什么我需要systemverilog中的抽象类?,system-verilog,System Verilog,我在谷歌搜索时,在systemverilog中偶然发现 但我不明白为什么我们需要systemverilog中的抽象类 所以你们能帮我理解一下系统verilog中的抽象类吗?为什么我们需要它,什么时候我们需要它。抽象类被设计为可扩展的,不能被实例化。除了提供可重用或重写的现有功能外,抽象类还可用于定义扩展类的契约(即扩展类必须实现特定的功能)。纯虚函数在抽象类中未实现,但必须在扩展类中实现(形成契约) 例如: virtual class animal; // Implemented funct

我在谷歌搜索时,在systemverilog中偶然发现

但我不明白为什么我们需要systemverilog中的抽象类


所以你们能帮我理解一下系统verilog中的抽象类吗?为什么我们需要它,什么时候我们需要它。

抽象类被设计为可扩展的,不能被实例化。除了提供可重用或重写的现有功能外,抽象类还可用于定义扩展类的契约(即扩展类必须实现特定的功能)。纯虚函数在抽象类中未实现,但必须在扩展类中实现(形成契约)

例如:

virtual class animal;
  // Implemented functionality that can be overridden in extended classes or used as-is
  virtual function int get_legs();
    return 4;
  endfunction

  // Functions that must be implemented by extended classes 
  pure virtual function string get_sound();
  pure virtual function string get_name();
endclass

class cat extends animal;
  virtual function string get_sound();
    return "meow";
  endfunction

  virtual function string get_name();
    return "Mog";
  endfunction
endclass

class dog extends animal;
  virtual function string get_sound();
    return "woof";
  endfunction

  virtual function string get_name();
    return "Rover";
  endfunction
endclass

class duck extends animal;
  // override default functionality
  virtual function int get_legs();
    return 2;
  endfunction

  virtual function string get_sound();
    return "quack";
  endfunction

  virtual function string get_name();
    return "Feathers";
  endfunction
endclass

module my_module;
  initial begin
    animal animals[$];
    cat c;
    dog d;
    duck du;

    c = new();
    d = new();
    du = new();

    animals.push_back(c);
    animals.push_back(d);
    animals.push_back(du);

    foreach(animals[a])
    begin
      $display("%s has %0d legs and makes the sound %s",
               animals[a].get_name(), animals[a].get_legs(), animals[a].get_sound());
    end
  end
endmodule
如果您使用的是UVM,则是一个抽象类的SystemVerilog示例(其中写入函数必须在扩展类中实现)