UVM- запустить тест() в верхнем блоке и макросах

Я читаю следующее руководство: https://colorlesscube.com/uvm-guide-for-beginners/chapter-3-top-block/

В строке 24- run_test(); кода 3.2 я понял, что он должен выполнить тест, но как он узнает, какой тест и как, и почему я должен писать его в верхнем блоке.

В строках 11–14 кода 4.1 (https://colorlesscube.com/uvm-guide-for-beginners/chapter-4-transactions-sequences-and-sequencers/):

`uvm_object_utils_begin(simpleadder_transaction)
`uvm_field_int(ina, UVM_ALL_ON)
`uvm_field_int(inb, UVM_ALL_ON)
`uvm_field_int(out, UVM_ALL_ON)
`uvm_object_utils_end

Зачем мне добавлять «uvm_field_int», что произойдет, если я их не добавлю, и что такое «UVM_ALL_ON»?


person sara8d    schedule 25.07.2016    source источник


Ответы (2)


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

run_test определен в документации (ссылка) так как:

virtual task run_test (
        string      test_name    =      ""
)

Так что, в принципе, вы можете указать там имя теста в виде строки. Но что обычно делается, так это передать его в командной строке вашего симулятора, используя аргумент: +UVM_TESTNAME=TEST_NAME

Макросы uvm_object немного сложнее. Они генерируют несколько методов и, что более важно, регистрируют объект в фабрике UVM, что делает их необходимыми (по крайней мере, если вы используете фабрику для их создания). Со ссылкой на справочную документацию по классу UVM (раздел 20.2 Компоненты и объекты Макросы):

Простые (непараметризованные) объекты используют версии uvm_object_utils*, которые делают следующее:

  • Реализует функцию get_type_name, которая возвращает TYPE в виде строки.
  • Реализует create, который выделяет объект типа TYPE, вызывая его конструктор без аргументов. Конструктор TYPE, если он определен, должен иметь значения по умолчанию для всех своих аргументов.
  • Регистрирует TYPE в фабрике, используя строку TYPE в качестве строки поиска фабрики для типа.
  • Реализует статический метод get_type(), который возвращает фабричный прокси-объект для типа.
  • Реализует виртуальный метод get_object_type(), который работает так же, как статический метод get_type(), но работает с уже выделенным объектом.
person jonasoide    schedule 25.07.2016