Specman: how to retrieve values of var which is stored in another var

浪尽此生 提交于 2019-12-23 18:00:23

问题


I have stored var name in another var and I want to retrieve values from original var.

for ex:

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

//Now i want to print var_A list of values using var_A_str. How can i do that?

print $var_A_str;

回答1:


This is called introspection or reflection. You have to use Specman's rf_manager. Search for it in the docs. However, the docs don't show you all the methods that this unit has. If you really want to see all the methods, run this snippet of code:

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;
        };
    };
};

I'm not sure how to iterate through the list elements, but you can use this snippet to look at the methods on a reference to an object's instance members ( not a subroutine's variable).

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.

I'm sure there's a way to do what you want, but it can be very difficult to use Specman's reflection interface.

Merry hacking!



来源:https://stackoverflow.com/questions/3331627/specman-how-to-retrieve-values-of-var-which-is-stored-in-another-var

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!