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