Тестовый стенд UVM - Каким способом UVM можно подключить два разных драйвера к одному интерфейсу?

В моем Testbench у меня есть интерфейс, которым мне нужно управлять. Интерфейс может работать в 2 различных режимах, каждый из которых имеет собственный протокол драйвера и тип транзакции.

До сих пор я проектировал оба uvm_agent отдельно. Теперь мне нужен способ поменять местами один или другой, в зависимости от тестового набора, который я запускаю. Я также хочу сделать это так, чтобы это лучше соответствовало философии UVM.

Мой лучший метод, который я мог придумать, это: в моем uvm_env получить параметр uvm_db_config из теста, который говорит либо «ModeA», либо «ModeB», и на основе этого установить is_active для агентов на «UVM_ACTIVE» и «UVM_PASSIVE». "соответственно.

Хотелось бы узнать мнение об этом методе.

Мне был предложен способ сохранить общий uvm_agent и создать экземпляр uvm_driver / uvm_sequencer на основе конфигурации. Не слишком уверен в этом методе, так как он выглядит неаккуратно.


person noobuntu    schedule 27.05.2014    source источник


Ответы (2)


Я бы также предложил, как и Тюдор, использовать только один агент. Но тогда я бы использовал наследование, объявив base_driver и base_sequencer (которые могут иметь общие функции от драйверов ModeA или ModeB и / или секвенсоров), а модули ModeA и ModeB расширили бы эти базовые. Затем в агенте и с помощью флага в uvm_config_db, установленном в каждом тесте, вы должны выбрать между созданием одного или другого экземпляра:

Базовый драйвер:

class my_proj_base_driver extends uvm_driver#(my_proj_tr);
[...]

Драйвер ModeA:

class my_proj_ModeA_driver extends my_proj_base_driver;
[...]

Драйвер ModeB:

class my_proj_ModeB_driver extends my_proj_base_driver;
[...]

В агенте:

[...]

my_proj_base_driver driver;
bit modeAorB // 0 for A, 1 for B

[...]

if (!uvm_config_db#(bit)::get(this,"","modeAorB", modeAorB))
  `uvm_fatal("NOMODE","No mode set for this agent")

if(!modeAorB)
  driver = my_proj_ModeA_driver::type_id::create(.name("driver"), .parent(this));
else
  driver = my_proj_ModeB_driver::type_id::create(.name("driver"), .parent(this));

То же самое и с секвенсором.

person eSedano    schedule 28.05.2014

Я бы предпочел иметь общий класс агента и один конкретный класс для каждого режима, а затем выполнять переопределение типа на основе теста, который я запускаю. Таким образом, ясно, что с этим интерфейсом работает только один агент (а не 2, из которых один настроен на пассивный, когда он вообще не используется). Один класс агента создает экземпляры набора драйверов / секвенсоров, а другой класс агента создает экземпляры остальных. Таким образом, вам нужно установить только один тип переопределения (для агента), а не 2 (для драйвера и секвенсора).

Если в обоих режимах вы используете один и тот же монитор, то было бы лучше использовать подход с одним агентом, потому что вам нужно только подключить свою таблицу результатов к одному монитору, а не к одному в агенте A или другому в агенте B в зависимости от на режиме.

Ваш подход тоже работает, и я не думаю, что в этом случае есть стандартный способ UVM. У меня был коллега, который сделал нечто подобное для интерфейса GPIO, и он работал нормально.

person Tudor Timi    schedule 28.05.2014