为什么在systemverilog中需要抽象类?

时间:2018-08-08 06:20:44

标签: system-verilog

在谷歌搜索时,我在systemverilog中遇到了abstract class

但是我不确定为什么我们需要在systemverilog中使用抽象类。

所以,请您帮我了解系统Verilog中的抽象类吗?我们为什么需要它,何时需要它。

1 个答案:

答案 0 :(得分:0)

一个抽象类被设计为可扩展且无法实例化。除了提供可重用或覆盖的现有功能之外,抽象类对于定义扩展类的约定(即扩展类必须实现特定功能)很有用。纯虚函数在抽象类中未实现,但必须在扩展类中(形成合同)实现。

示例:

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,则uvm_subscriber是抽象类的SystemVerilog示例(必须在扩展类中实现写函数)。