Создание массива дочерних дескрипторов в системном verilog - PullRequest
0 голосов
/ 14 сентября 2018

В SystemVerilog у меня есть базовый класс A и производный класс B, C, D.Я хотел бы создать массив типа A, который имеет дескрипторы для B, C, D.Есть ли более лаконичный способ сделать это, чем мое уродливое решение ниже?

module test; 
  A arr[3];
  B b;
  C c;
  D d;

  initial begin
    b = new();
    c = new();
    d = new();
    arr[0] = b;
    arr[1] = c;
    arr[2] = d;
  end
endmodule

1 Ответ

0 голосов
/ 14 сентября 2018

Если вы имеете в виду без использования переменных промежуточного класса, вы можете сделать

arr[0] = B::new();

Это относительно новая функция SystemVerilog, и некоторые инструменты еще не поддерживают ее. Чтобы обойти это, вы можете создать статический метод create, который вызывает для вас конструктор, который позволяет создавать объект класса в таких местах, как аргумент функции, без необходимости объявлять промежуточную переменную.

class B;
  static function C create;
     create = new;
  endfunction
endclass

arr[1] = C::create();

somefunction(C::create()); // C::new() would not work here

Если вы используете библиотеку UVM, вы получаете это бесплатно

class C extends uvm_object;
`uvm_object_utils(C)
...
endclass
arr[3] = C::type_id::create();
...