Как обновить regmodel с записью, идущей из блоков RTL

Я понимаю, что значения regmodel обновляются, как только транзакция инициируется из тестовой среды на любом из подключенных интерфейсов.

Однако рассмотрим сценарий:

  1. Регистры RTL обновляются из ПЗУ при загрузке (значение отличается от значения по умолчанию)
  2. Процессор в записи RTL для регистрации по сравнению с тестовой средой.

В этих двух случаях regmodel не обновляется/отзеркаливается с правильным значением RTL. Я хотел бы знать, какова правильная процедура обновления regmodel, если на данный момент ее нет, какой другой подход можно использовать для синхронизации этих двух?


person wisemonkey    schedule 21.02.2015    source источник


Ответы (1)


В первом случае вы должны предварительно загрузить свою модель памяти с содержимым ПЗУ в начале моделирования. В uvm_memory нет никакой инфраструктуры для этого (к сожалению), поэтому вам придется реализовать это самостоятельно.

Во втором случае вы должны использовать более «серый ящик» для проверки. Вы должны отслеживать доступ к шине, который процессор делает с периферийными устройствами, и обновлять значения регистров на основе этих транзакций. Это должно быть нормально с точки зрения ремонтопригодности, потому что архитектура вашей SoC должна быть довольно стабильной в этом смысле (вы уже решили использовать процессор, чтобы он всегда был там, но вы можете не знать, какие периферийные устройства дойдет до конца).

person Tudor Timi    schedule 21.02.2015
comment
Спасибо, я пытаюсь реализовать второй случай. Отслеживайте шину и обновляйте regmodel в правильном месте, я думаю " rel="nofollow noreferrer">verificationacademy.com/verification-methodology-reference/uvm/ является правильным способом его реализации. Однако независимо от того, что я пытаюсь, кажется, что он возвращает NULL. Я прошел через forums.accellera.org/topic/ (предполагаю, что это ваш пост) даже это не помогло - person wisemonkey; 24.02.2015
comment
поэтому get_reg_by_offset у меня не работал, вместо этого я реализовал его как register_model.map.get_registers (regs); foreach (regs[i]) if (regs[i].get_offset == (monitor_addr - base_addr)) if(write) regs[i].set (данные). Извините, форматирование в комментарии выглядело бы очень плохо, но я не хотел писать отдельный ответ. При таком подходе мне не нравится тот факт, что будет так много итераций на вызов, но я думаю, что пока останусь на нем. - person wisemonkey; 25.02.2015
comment
@wisemonkey вы, вероятно, также можете изменить свой предиктор или вставить дополнительный компонент стиля TLM FIFO, который выполняет вычитание адреса base для вас. Таким образом, вы получаете дорогие петли, которые, вероятно, испортят ваше выступление. Кроме того, я думаю, что открыл ветку на форумах UVM, посвященную смещению, где он ожидает абсолютный адрес вместо смещения в файле регистрации/карте/и т. д. Вам придется поиграть с деталями или открыть новый вопрос с точной проблемой, с которой вы столкнулись get_reg_by_offset(...). - person Tudor Timi; 25.02.2015
comment
Спасибо. Мне нужно немного больше узнать о модели регистрации из UVM, а затем задать соответствующий вопрос. - person wisemonkey; 26.02.2015