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