Лучший способ получить доступ к uvm_config_db из тестового стенда?

Я хочу создать часы в своем тестовом стенде высшего уровня, период которого можно контролировать из теста. То, что я сделал, это установил период в uvm_config_db и вернул его обратно в тестовую среду. Мне пришлось поставить #1, чтобы убедиться, что фаза сборки завершена, иначе get вернул неправильное значение:

module testbench_top;
  int clk_period;

  bit clk = 0;

  initial begin
    #1;    
    void'(uvm_config_db #(int) ::get(null, "uvm_test_top.env", "clk_period", clk_period));
    // Create clk
    forever begin
      #(clk_period/2) clk = !clk;
    end
  end

Я раздражен #1. Есть ли лучший способ проверить, что конфиг был установлен? Могу ли я как-то заблокировать, пока start_of_simulation_phase?

2 ответа

Решение

Я нашел это скрытым в справочнике классов: Вы можете получить доступ к глобальным одноэлементным версиям каждой фазы с помощью <phase name>_ph, Тогда я могу использовать wait_for_state функция для блокировки до начала фазы моделирования. Имитация и похоже на работу:

module testbench_top;
  int clk_period;

  bit clk = 0;

  initial begin
    start_of_simulation_ph.wait_for_state(UVM_PHASE_STARTED);    
    if(!uvm_config_db #(int) ::get(null, "uvm_test_top.env", "clk_period", clk_period))
      `uvm_fatal("CONFIG", "clk_period not set");
    // Create clk
    forever begin
      #(clk_period/2) clk = !clk;
    end
  end

Еще одна альтернатива, которая может помочь, это функция wait_modified uvm_config_db... Вот выдержка из справочного руководства uvm

wait_modified:

static task wait_modified(uvm_component cntxt,
                          string  inst_name,
                          string  field_name)

Дождитесь установки параметра конфигурации для field_namein cntxtand inst_name. Задача блокируется, пока не будет применен новый параметр конфигурации, который влияет на указанное поле.

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