2016-11-30 7 views
0

Я пытаюсь написать пакет, который включает некоторые общие задачи и функции для использования тестовой среды. Например,получить виртуальный интерфейс один раз в пакете

package test_misc_pkg; 
`include "uvm_macros.svh" 
import uvm_pkg::*; 

task wait_rest(); 
    virtual test_if test_vif; 
    if (!uvm_config_db #(virtual test_if)::get(null, "uvm_test_top.env", "test_vif", test_vif)) 
    `uvm_fatal("NOVIF", "virtual interface should be set") 

    @(posedge test_vif.clk); 
    //do something... 
endtask 

endpackage : test_misc_pkg 

Затем тест окр может просто вызвать wait_rest() после импорта test_misc_pkg.

Но, если есть другая задача, используйте те же test_vif, мне все равно нужно получить db в начале каждого задания. Мой вопрос: можем ли мы просто получить uvm_config_db один раз в пакете, пусть все задачи могут напрямую использовать test_vif?

Или, лучший способ сделать это?

Спасибо.

ответ

0

Если вы пытаетесь уменьшить накладные расходы при вызове uvm_config_db::get(), вы можете проверить, что он равен нулю, а затем сделать get.

task wait_rest(); 
    virtual test_if test_vif; // this is a static variable 
    if (test_vif == null) begin 
    if (!uvm_config_db #(virtual test_if)::get(null, "uvm_test_top.env", "test_vif", test_vif)) 
    `uvm_fatal("NOVIF", "virtual interface should be set") 
end 
    @(posedge test_vif.clk); 
    //do something... 
endtask 
+0

Да, я пытаюсь уменьшить ненужный uvm_config_db :: get() и сохранить код чистым. Возможно, я могу написать подзадачу для проверки переменной null или нет и поместить ее в каждую задачу перед использованием. Спасибо за ваш комментарий. – DexterH

1

Вы могли бы сделать вас виртуальный интерфейс глобальной переменной:

package test_misc_pkg; 
    `include "uvm_macros.svh" 
    import uvm_pkg::*; 

    virtual test_if test_vif; 

    function void set_vif(); 
    if (!uvm_config_db #(virtual test_if)::get(null, "uvm_test_top.env", "test_vif", test_vif)) 
     `uvm_fatal("NOVIF", "virtual interface should be set") 
    endfunction 

    task wait_rest(); 
    @(posedge test_vif.clk); 
    //do something... 
    endtask 

endpackage : test_misc_pkg 

и написать функцию (например, set_vif()), чтобы дать глобальную виртуальный интерфейс значение. Вы могли бы затем вызвать эту функцию в connect_phase, например. Однако все это кажется немного нетрадиционным.

+0

Это нетрадиционный, но мне этот метод – noobuntu

+0

Он должен работать, я попробую. Благодарю. Кстати, что является обычным или обычным способом для общего пакета задач? – DexterH

 Смежные вопросы

  • Нет связанных вопросов^_^