UVM обеспечивает использование блока синхронизации

Я хочу использовать следующие концепции SystemVerilog:

  • блок синхронизации: чтобы избежать гонок между драйвером и монитором, я хочу, чтобы он располагался в центральном месте интерфейса.
  • modport: обычно (например, передача модпорта вместо интерфейса модулю) я мог бы использовать его, чтобы гарантировать, что доступ к сигналам интерфейса возможен только через блок синхронизации.

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

Мне удалось придумать только следующий (непроверенный) пример кода, однако я не уверен, есть ли лучший способ:

interface my_interface(input clk);
  logic I;
  logic O;
  
  clocking cb_drv @(posedge clk);
    output I;
    input O;
  endclocking
  
  clocking cb_mon @(posedge clk);
    input I;
    output O;
  endclocking
  
  modport drv(clocking cb_drv, output clk);
  modport mon(clocking cb_mon, input clk);
endinterface


class my_driver extends uvm_driver #(my_transaction);
  `uvm_component_utils(my_driver);
  
  virtual my_interface.drv vif;
  
  ...
  
  virtual function void build_phase(uvm_phase phase);
    virtual my_interface temp;
    super.build_phase(phase);
            
    if (!uvm_config_db#(virtual my_interface)::get(this, "", "my_interface", temp))
      `uvm_fatal(...);
    
    vif = temp.drv;
  endfunction
  
  virtual task run_phase(uvm_phase phase);
    forever begin
      seq_item_port.get_next_item(transaction);
      @(vif.cb_drv);
      vif.cb_drv.I = transaction.I;
      seq_item_port.item_done();      
    end
  endtask
  
endclass

Проблема с этим решением заключается в том, что у меня есть функции/задачи, реализованные в интерфейсе (например, функции чтения/записи), которые таким образом становятся недоступными.

Стоит ли изучать 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
0
161
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Блоки синхронизации — это лишь один из многих способов предотвратить возникновение гонок между вашим испытательным стендом и тестируемым устройством. Вы можете использовать неблокирующие назначения точно так же, как их используют дизайнеры, чтобы предотвратить гонки между их RTL-кодом. Вы можете использовать отрицательный или смещенный фронт тактовой частоты для управления и мониторинга тестируемого устройства. См. мою статью о DVCon: Недостающее звено: испытательный стенд для подключения ИУ.

Что касается использования задач и функций в интерфейсе modport, вы, безусловно, можете сделать их доступными с помощью import. Но большинство людей отказались от использования модпортов для проверки, потому что даже в показанном вами случае очень легко получить доступ ко всему интерфейсу. Вам придется разделить базу данных конфигурации для каждого модпорта.

uvm_config_db#(virtual my_interface.drv)::set(this, "*", "my_interface", itf_instance.drv)
uvm_config_db#(virtual my_interface.mon)::set(this, "*", "my_interface", itf_instance.mon)

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

Спасибо! Есть ли способ передать реализацию абстрактных классов (из вашей статьи) через config_db, например, modports в вашем примере?

G. B. 11.06.2024 13:01

Вы можете передать значение любого типа с помощью uvm_config_db. Просто параметризуйте его с помощью абстрактного типа класса. В этом примере я также использовал фабрику UVM: verificationacademy.com/forums/t/…

dave_59 11.06.2024 18:32

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