Заводской переопределенный параметризованный класс в UVM - PullRequest
4 голосов
/ 14 февраля 2020

У меня есть параметризованный seq_item, как показано ниже

class seq_item#(int A = 64) extends uvm_sequence_item;
  `uvm_object_param_utils(seq_item#(A))
  rand logic [A-1:0] v;
  constraint v_c {
    v inside {[0:1000]};
  }
endclass : seq_item

class extended_seq_item#(int A = 64) extends seq_item#(A);
  `uvm_object_param_utils(extended_seq_item#(A))
  constraint extended_v_c {
    v inside {[10:50]};
  }
endclass : extended_seq_item

class reg_adapter#(int A = 100) extends uvm_reg_adapter;
  `uvm_object_param_utils(reg_adapter#(A))
  typedef seq_item#(A) seq_item_t;
  function new(string name = "reg_adapter")
    seq_item_t req;
    req = seq_item_t::type_id::create("req");
  endfunction
endclass : reg_adapter

class test extends uvm_test;
  `uvm_component_utils(test)
  reg_adapter#(10) adapter;
  function void build_phase(uvm_phase phase);
    seq_item#(10)::type_id::set_type_override(extended_seq_item#(10)::get_type());
    super.build_phase(phase);
    adapter = reg_adapter::type_id::create("adapter");
  endfunction : build_phase
endclass : test

В моем UVM TB мне необходимо переопределить все экземпляры seq_item с помощью extended_seq_item. Разные экземпляры будут иметь разные значения параметров A. Как мне фабрично переопределить это?

Проблема в том, что seq_item из общего обеспечения, которое имеет обобщенное ограничение c для переменной rand v, которое подходит для всех IP-адресов. Для моего IP мне нужно добавить дополнительное ограничение для v, как указано в extended_seq_item. Мой IP-адрес использует reg_adapter, который, как ожидается, будет принимать extended_seq_item с добавленными дополнительными ограничениями

Спасибо и С уважением, Киран

1 Ответ

2 голосов
/ 14 февраля 2020

К сожалению, параметризованные классы с различными значениями параметров ( специализации - это терминология LRM) обрабатываются как отдельные типы классов, поэтому вам необходимо предоставить переопределение для каждого значения параметра.

seq_item#(10)::type_id::set_type_override(extended_seq_item#(10)::get_type());
seq_item#(20)::type_id::set_type_override(extended_seq_item#(20)::get_type());
seq_item#(30)::type_id::set_type_override(extended_seq_item#(30)::get_type());

Если вы можете получить этот код в месте, где A уже параметризован, как в build_phase параметризованного env или агента, то это может быть не так болезненно, как описано выше.


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

adapter = reg_adapter::type_id::create("adapter");

должно быть записано как

adapter = reg_adapter#(10)::type_id::create("adapter");
...