问题
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