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