Нужно ли избегать кода OOMR (ссылка вне модуля) в UVM?

Я настраиваю новый код UVM и хочу сделать код OOMR в своем коде uvm. Нужно ли мне избегать концепции кода OOMR (Out Of Module Reference) в UVM? Если это не нужно, что я должен проверить до кода OOMR и после?

Пример

tb.top.env.dut.a = 1;
a = tb.top.env.dut.b    

Если вы видите ссылку, там какое-то сообщение об ошибке после запуска.

    a=u_sub.b; 
            |
ncvlog: *E,ILLHIN (add.sv,6|12): illegal location for a hierarchical name (in a package).

Чтобы предотвратить эту проблему, я думаю, что должен избегать такого стиля кода. Но я не уверен, что хорошо понимаю эту проблему.

Не уверен, но, насколько я знаю, некоторые инструменты EDA поддерживают эту проблему. Например, cadence($xm_mirror), Mentor, VCS...

Поэтому я хочу знать, нужно ли мне избегать этого стиля кода OOMR? или Должен ли я использовать только подсказки инструмента EDA. Как решить эту проблему, когда я получил аналогичную ошибку в огромных сложных кодах uvm?

Я не очень понимаю ваш вопрос. Вам не нужно избегать этого, нет, но вы обнаружите, что вы не можем используете (я бы назвал это) иерархические ссылки Verilog в пакетах (что ясно видно из сообщения об ошибке в вашем примере EDA Playground). Что ты спрашиваешь?

Matthew Taylor 26.06.2019 13:55

@MatthewTaylor, но вы обнаружите, что не можете использовать (я бы назвал) иерархические ссылки Verilog в пакетах, которые я бы назвал OOMR. Да, это то, что я хочу знать. Что делать, если у меня возникла аналогичная проблема, что я должен проверить в первую очередь?

al01 26.06.2019 14:02

@MatthewTaylor Могу ли я использовать «интерфейс» для решения «иерархических ссылок Verilog» в пакетах с этой проблемой?

al01 26.06.2019 14:14
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
1 795
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Использование иерархических ссылок Verilog или OOMR в пакете SystemVerilog является незаконным. Это связано с тем, что пакеты SystemVerilog компилируются первыми, а не остальной код SystemVerilog.

Как правило, вы будете помещать свои классы в пакет. Поэтому вам следует избегать использования Verilog Hierarchical References или OOMR в классах.

Очевидно, вы захотите подключить код класса к портам ИУ (например, драйверам и мониторам), а также, возможно, захотите проверить внутренние сигналы ИУ. Решение этих проблем различно для каждого случая.

Для подключения к портам DUT большинство людей используют SystemVerilog интерфейс. Вы создаете экземпляр интерфейса на том же уровне иерархии, что и DUT, и каким-то образом подключаете элементы интерфейса к DUT, например, используя иерархические ссылки Verilog или OOMR), например:

interface TB_hook (input bit clk);
  logic Stim, Resp;
  ...
endinterface

module harness;
  bit clk;
  TB_hook DUT_intf (.clk);
  Sys_Top DUT (
    .clk  (clk), 
    .Stim (DUT_intf.Stim),
    .Resp (DUT_intf.Resp), 
    ...

Затем в каком-то классе (драйвере, мониторе или агенте) вы можете использовать SystemVerilog виртуальный интерфейс для подключения к экземпляру интерфейса. Виртуальный интерфейс — это особый тип переменной SystemVerilog, которая может хранить иерархическую ссылку Verilog или OOMR на экземпляр интерфейса или модпорт. Поскольку вам нужно присвоить это значение во время выполнения, виртуальный интерфейс может быть скомпилирован в пакете (но код, который присваивает значение, не может быть в пакете), например:

class driver;
  virtual TB_hook V;
  task drive (input bit data);
    V.Stim <= data;

Затем в каком-нибудь Verilog module (вероятно, в модуле верхнего уровня) вы бы присвоили значение переменной виртуального интерфейса. Вы можете сделать это напрямую, например:

module TB_top;
  top_env env;
  ...
  initial begin
    ...
    env.agent.driver.V = harness.DUT_intf;

но большинство людей будут использовать базу данных конфигурации UVM:

module TB_top;
  top_env env;
  ...
  initial begin
    ...
    uvm_config_db #(virtual TB_hook)::set(null, "*", "DUT_intf", harness.DUT_intf);

class driver;
  virtual TB_hook V;
  ...
  function void connect_phase(uvm_phase phase);
    ...
    ok = uvm_config_db#(virtual TB_hook)::get(this, "", "DUT_intf", V);

Вы можете улучшить эту технику, используя модпорты и/или блоки синхронизации.

Для проверки внутренних сигналов тестируемого устройства имеются средства, предоставляемые уровнем регистра UVM. Для этого есть набор функций/задач:

  • uvm_hdl_check_path — проверяет, существует ли путь HDL
  • uvm_hdl_deposit — вносит значение в RTL
  • uvm_hdl_force — вставляет значение в RTL
  • uvm_hdl_force_time — форсирует значение на указанную продолжительность
  • uvm_hdl_release — освобождает принудительное значение
  • uvm_hdl_release_and_read — освобождает принудительное значение и считывает новое значение
  • uvm_hdl_read– считывает значение RTL

Другие вопросы по теме