run_test — вспомогательная глобальная функция, она вызывает функцию run_test класса uvm_root для запуска тестового примера. Есть два способа передать имя теста функции. Первый — через аргумент функции, а второй — через аргумент командной строки. Аргумент командной строки имеет приоритет над именем теста, переданным через аргумент функции.
+UVM_TESTNAME=YOUR_TEST_NAME
run_test("YOUR_TEST_NAME");
Функция run_test в uvm_root использует механизм фабрики для создания соответствующего экземпляра класса umm_test, поэтому тестовый пример должен зарегистрироваться в фабрике с помощью макроса `uvm_component_utils, чтобы механизм фабрики (create_component_by_name) функционировал.
class YOUR_TEST_NAME extends umm_test ;
// register the class with the factory
// so that run_test can find this class when the
// string test_name is passed to it.
`uvm_component_utils(YOUR_TEST_NAME)
.....
endclass
Затем функция run_test запускает uvm_phases (.., build_phase, connect_phase,...), запуская uvm-часть симуляции. До запуска run_phase не должно потребляться тактов времени, поэтому важно, чтобы случай run_test вызывался в самом начальном блоке. Также мы хотим, чтобы uvm и испытательный стенд были готовы к работе и получению данных, как только будет готов RTL, для чего важно запустить run_test как можно раньше. Любая задержка в этом вызовет ошибку.
`uvm_field_int/uvm_field_object/.. называются макросами автоматизации полей. Они не являются обязательными в определении класса и предоставляются в качестве вспомогательных макросов для облегчения использования многих общих/рутинных функций uvm_object. Примерами этих функций в uvm_object являются копирование, сравнение, упаковка, распаковка, печать и т. д., и эти макросы генерируют код для автоматического использования этих функций.
Если вы не используете общие функции uvm_object, то исключение этих макросов из определения класса не приведет к ошибкам. Если вы реализуете собственную версию общих операций, вы также можете исключить эти макросы из класса.
UVM_ALL_ON — включает все функции, такие как сравнение/копирование/... для конкретного поля.
ссылка с примерами - http://www.testbench.in/UT_04_UVM_TRANSACTION.html
Например, uvm_object имеет функцию сравнения, которая сравнивает два экземпляра одного и того же класса и возвращает true, если все переменные в классе равны.
virtual function bit do_compare( uvm_object rhs, uvm_comparer comparer );
.....
// return 1 if all the variables match
return ( super.do_compare( rhs, comparer ) &&
this.var_1 == rhs.var_1 &&
this.var_2 == rhs.var_2 &&
......
this.var_n == rhs.var_n );
endfunction: do_compare
// use in main code
if ( new_class.compare(old_classs) )
...
//instead of
if ( new_class.var1 == old_class.var1 && new_class.var2 == old_class.var2 && ... new_class.varn == old_class.varn )
...
Приведенное выше сравнение должно быть записано для каждого класса и обновлено и сохранено для каждой новой переменной, добавляемой в класс. Это может привести к ошибкам при добавлении новых переменных. Аналогичный процесс необходимо выполнить для всех стандартных функций, предоставляемых uvm_object.
Макрос автоматизации поля генерирует функцию для автоматического обращения ко всем этим функциям. Таким образом, выполнение do_print для класса с макросами распечатает все поля без явного написания кода для этого.
// compare/print/.. functions for class simpleadder_transaction are provided by using `uvm_field_int macro.
`uvm_object_utils_begin(simpleadder_transaction)
`uvm_field_int(ina, UVM_ALL_ON)
`uvm_object_utils_end
НО предостережение: использование этих макросов не рекомендуется, так как они добавляют в класс значительный объем кода.. Большинство из этих функций могут не понадобиться классу, но они генерируются по умолчанию.
person
Rahul Menon
schedule
25.07.2016