У меня есть ситуация, когда у меня есть около 100000 регистров в uvm_reg_block. У меня есть три драйвера, которые могут вести транзакции в эти регистры. Насколько я понимаю, в соответствии со стандартной методологией UVM RAL нам нужны три отдельных карты uvm_reg_map, подключенных к трем секвенсорам и дисководу. Проблема заключается в дублировании регистров во всех трех uvm_reg_maps, которые потребляют время процессора для запуска. Даже для входа в фазу данных требуется один час. Можете ли вы помочь мне решить это? Есть ли способ подключить все три секвенсора к одному uvm_reg_map и как-то на основе аргумента решить, какой физический секвенсор он должен подобрать?
заранее спасибо
Я имел в виду, что добавление 100000 регистров к более чем одному uvm_reg_map занимает много времени. Поэтому хотел знать, могу ли я сделать так, чтобы одна uvm_reg_map содержала несколько секвенсоров вместо нескольких uvm_reg_map, содержащих один секвенсор.
Насколько я знаю, вы не можете. Если одна reg-карта может быть подключена к более чем одному секвенсору, то как потом можно выбрать, какой секвенсор запускать? Кроме того, для каждой добавленной карты reg ее дескриптор будет храниться внутри массива m_maps uvm_reg с помощью map.add_reg(). Каждая карта не будет создавать свои собственные регистры, поэтому регистры не будут дублироваться.
uvm_reg_map
может работать только с одним секвенсором.
Вы упомянули, что создание нескольких reg-карт слишком медленное, потому что add_reg(...)
. Возможно, удастся отделить аспект спецификации карты регистров (по каким адресам находятся регистры) от аспекта секвенсора. Для этого вам понадобится один uvm_reg_map
экземпляр, на котором вы делаете свои add_reg(...)
звонки. Назовем это карта спецификации. Для каждого секвенсора, к которому вы хотите управлять доступом к регистрам, вам понадобится еще один uvm_reg_map
(подкласс), который каким-то образом указывает на карта спецификации. Назовем их карты вождения.
На данный момент у меня нет кода, как это сделать. Нужно посмотреть, как uvm_reg_map
вызывается другим кодом, и переопределить эти функции. Вместо того, чтобы вызывать реализации в uvm_reg_map
, которые имеют дело с собственным хранилищем регистров, они будут указывать на карта спецификации и опрашивать его с помощью get_reg(...)
и так далее. Это может не сработать, если функции не объявлены virtual
в uvm_reg_map
. UVM имеет тенденцию делать расширение невозможным, потому что код опирается на реализации, а не на абстракции.
Другой способ — создать драйвер, который использует все эти 3 секвенсора/агента (назовем его reg_driver). reg_driver будет иметь один секвенсор, который получает общий reg. транзакции. Из заданного переключателя времени выполнения выберите последовательность регистрации интерфейса для управления конкретной транзакцией внутри reg_driver.
Что означает дубликат в данном контексте? Вы должны иметь возможность добавить регистр на несколько карт.