Specman: как получить значения var, которые хранятся в другом var

Я сохранил имя переменной в другой переменной и хочу получить значения из исходной переменной.

например:

var var_A: list of uint = {1,3,2};
var var_A_str:string = "var_A";

//Теперь я хочу напечатать список значений var_A, используя var_A_str. Как я могу это сделать?

print $var_A_str;

person Dan    schedule 26.07.2010    source источник


Ответы (1)


Это называется самоанализом или рефлексией. Вы должны использовать Specman's rf_manager. Ищите его в документах. Однако документы не показывают вам все методы, которые есть у этого модуля. Если вы действительно хотите увидеть все методы, запустите этот фрагмент кода:

extend sys {
    run() is also {
        var rf_man : rf_struct = rf_manager.get_exact_subtype_of_instance(rf_manager);
        out(" RF Manager:");
        for each (meth) in rf_man.get_declared_methods() {
            print meth;
        };
    };
};

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

extend sys {

    A : list of uint;
    keep A == {1;3;2};
    run() is also {

        var variable_name := "A";
        var rf_obj: rf_struct = rf_manager.get_exact_subtype_of_instance(sys);
        var rf_i : rf_field =  rf_obj.get_field(variable_name);
        print rf_i;
        var rf_rf_i := rf_manager.get_exact_subtype_of_instance(rf_i);
        out ( "#\n# RF_RFI\n#");
        for each (meth) in rf_rf_i.get_declared_methods() {
            print meth;
        }; 
    };
};    

In my version ( 8.2 ) this prints:

    Starting the test ...
    Running the test ...
      rf_i = rf_field 'A', line 7 in @rf_test4
    #
    # RF_RFI
    #
      meth = rf_method 'get_type', Specman's private modules
      meth = rf_method 'is_physical', Specman's private modules
      meth = rf_method 'get_svtp_pack', Specman's private modules
      meth = rf_method 'set_svtp_pack', Specman's private modules
      meth = rf_method 'is_ungenerated', Specman's private modules
      meth = rf_method 'is_const', Specman's private modules
      meth = rf_method 'is_unit_instance', Specman's private modules
      meth = rf_method 'is_port_instance', Specman's private modules
      meth = rf_method 'is_reference', Specman's private modules
      meth = rf_method 'get_constrained_types', Specman's private modules
      meth = rf_method 'get_deep_copy_attr', Specman's private modules
      meth = rf_method 'get_value', Specman's private modules
      meth = rf_method 'set_value', Specman's private modules
      meth = rf_method 'get_value_unsafe', Specman's private modules
      meth = rf_method 'get_all_when_value_unsafe', Specman's private modules
      meth = rf_method 'set_value_unsafe', Specman's private modules
      meth = rf_method 'set_value_const_reassign_unsafe', Specman's private modules
      meth = rf_method 'get_interface_port_prefix', Specman's private modules
      meth = rf_method 'get_interface_port_suffix', Specman's private modules
      meth = rf_method 'is_gen_intelligen', Specman's private modules
      meth = rf_method 'get_long_name', Specman's private modules
      meth = rf_method 'get_implicit_constraints', Specman's private modules
      meth = rf_method 'make_path', Specman's private modules
      meth = rf_method 'make_element', Specman's private modules
      meth = rf_method 'make_list_size_path', Specman's private modules
      meth = rf_method 'is_unit_reference', Specman's private modules
      meth = rf_method 'get_id_name_for_port_type', Specman's private modules
      meth = rf_method 'get_list_upper_bound', Specman's private modules
      meth = rf_method 'get_sv_typename', Specman's private modules
      meth = rf_method 'get_sv_name_under_when', Specman's private modules
      meth = rf_method 'get_sv_size', Specman's private modules
      meth = rf_method 'sv_add_encode_lines', Specman's private modules
      meth = rf_method 'sv_get_decode_function_local_var_name', Specman's private modules
      meth = rf_method 'sv_get_decode_function_local_var_decl', Specman's private modules
      meth = rf_method 'sv_add_decode_lines', Specman's private modules
      meth = rf_method 'get_sv_field_name', Specman's private modules
      meth = rf_method 'get_sv_field', Specman's private modules
      meth = rf_method 'sv_must_be_protected_field', Specman's private modules
      meth = rf_method 'sv_add_get_set_field_functions', Specman's private modules
      meth = rf_method 'sv_add_get_set_field_function_decs', Specman's private modules
      meth = rf_method 'is_sv_exported_field', Specman's private modules
      meth = rf_method 'is_sv_determinant_field', Specman's private modules
      meth = rf_method 'field_configured_to_svtp_pack', Specman's private modules
      meth = rf_method 'get_ovm_field_macro', Specman's private modules
      meth = rf_method 'is_internal', Specman's private modules
      meth = rf_method 'get', Specman's private modules
      meth = rf_method 'eanalyze_lnt', Specman's private modules
    No actual running requested.
    Checking the test ...

Checking is complete - 0 DUT errors, 0 DUT warnings.

Я уверен, что есть способ сделать то, что вы хотите, но может быть очень сложно использовать интерфейс отражения Specman.

Веселого взлома!

person Ross Rogers    schedule 26.07.2010
comment
привет Росс, спасибо за ваш ответ, но с печатью rf_i; оператор, печатает ли он все значения списка, хранящиеся в A? - person Dan; 27.07.2010
comment
Нет, rf_i — это ссылка на объект отражения для поля A. Вам нужно выяснить, как извлечь данные из этого поля отражения. Интерфейс отражения Specman — настоящая боль. Не похоже на простоту работы с самоанализом Python. - person Ross Rogers; 27.07.2010