Как напечатать всю очередь / массив с помощью служебных функций UVM?

Для объектов UVM, использующих `uvm_field_queue_int служебный макрос, UVM не выводит всю очередь при вызове my_object.print()

# -----------------------------------------
# Name Type Size Value
# -----------------------------------------
# my_object my_object - @443
# data_q da(integral) 16 -
# [0] integral 32 'h203f922b
# [1] integral 32 'he4b3cd56
# [2] integral 32 'hd7477801
# [3] integral 32 'h3a55c481
# [4] integral 32 'h2abf98c4
# ... ... ... ...
# [11] integral 32 'hac0d672b
# [12] integral 32 'h3ba2cb5d
# [13] integral 32 'hbe924197
# [14] integral 32 'h3cc6d490
# [15] integral 32 'h69ae79da
# -----------------------------------------

Какой лучший способ сделать UVM-печать всей очереди?

Пример кода на детской площадке EDA: http://www.edaplayground.com/x/rS

1 ответ

Решение

Полная информация об этом сообщении на форуме: http://forums.accellera.org/topic/1002-uvm-print-with-array-objects/

УВМ print() принимает uvm_printer аргумент. Создать новый uvm_table_printer объект (ребенок uvm_printer), измените значения ручек и передайте их print() метод.

uvm_table_printer printer;
my_uvm_object m;

// ...

printer = new();
m = my_uvm_object::type_id::create("my_uvm_object");

printer.knobs.begin_elements = -1; // this indicates to print all
m.print(printer);

//Optionally you can specify numbers for begin/end
printer.knobs.begin_elements = 10; // prints the first 10; default: 5
printer.knobs.end_elements = 2; // also print the last 2; default: 5
m.print(printer);

Это полезно, когда вы хотите повлиять на uvm_object можно сделать масштабируемым путем переопределения do_print() метод.

В качестве альтернативы, если изменение предназначено для глобального использования, существует принтер по умолчанию, который автоматически создается в корневом каталоге, и который называется uvm_default_printer, Изменение значений ручек этого принтера изменит поведение печати всех отпечатков по умолчанию.

uvm_default_printer.knobs.begin_elements=-1; // this indicates to print all
m.print(); // will print all elements

//Optionally you can specify numbers for begin/end
uvm_default_printer.knobs.begin_elements = 2; // prints the first 2; default: 5
uvm_default_printer.knobs.end_elements = 3; // also print the last 3; default: 5
m.print(); // will print the first 2 and last 3 elements

рабочий пример: http://www.edaplayground.com/x/Ze

Другие вопросы по тегам