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

Я хочу создать часы в своем тестовом банке верхнего уровня, чей период можно контролировать из теста. То, что я сделал, было установлено на период времени в uvm_config_db и вернуть его в testbench. Мне пришлось поставить # 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?

Ответ 1

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

Ответ 2

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