Лучший способ получить доступ к UVM config db из testbench?

Я хочу создать часы в моей верстаке верхнего уровня, период которых можно контролировать из теста. Что я сделал, так это установил период в 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. Этот задача блокируется до тех пор, пока не будет применен новый параметр конфигурации, влияющий на указанное поле.