3

我已将 var 名称存储在另一个 var 中,我想从原始 var 中检索值。

例如:

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

//现在我想使用 var_A_str 打印 var_A 值列表。我怎样才能做到这一点?

print $var_A_str;
4

1 回答 1

2

这称为内省或反思。您必须使用 Specman 的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;
        }; 
    };
};    

在我的版本( 8.2 )中打印:

    开始测试...
    运行测试...
      rf_i = rf_field 'A',@rf_test4 中的第 7 行
    #
    #RF_RFI
    #
      meth = rf_method 'get_type',Specman 的私有模块
      meth = rf_method 'is_physical',Specman 的私有模块
      meth = rf_method 'get_svtp_pack',Specman 的私有模块
      meth = rf_method 'set_svtp_pack',Specman 的私有模块
      meth = rf_method 'is_ungenerated',Specman 的私有模块
      meth = rf_method 'is_const',Specman 的私有模块
      meth = rf_method 'is_unit_instance',Specman 的私有模块
      meth = rf_method 'is_port_instance',Specman 的私有模块
      meth = rf_method 'is_reference',Specman 的私有模块
      meth = rf_method 'get_constrained_types',Specman 的私有模块
      meth = rf_method 'get_deep_copy_attr',Specman 的私有模块
      meth = rf_method 'get_value',Specman 的私有模块
      meth = rf_method 'set_value',Specman 的私有模块
      meth = rf_method 'get_value_unsafe',Specman 的私有模块
      meth = rf_method 'get_all_when_value_unsafe',Specman 的私有模块
      meth = rf_method 'set_value_unsafe',Specman 的私有模块
      meth = rf_method 'set_value_const_reassign_unsafe',Specman 的私有模块
      meth = rf_method 'get_interface_port_prefix',Specman 的私有模块
      meth = rf_method 'get_interface_port_suffix',Specman 的私有模块
      meth = rf_method 'is_gen_intelligen',Specman 的私有模块
      meth = rf_method 'get_long_name',Specman 的私有模块
      meth = rf_method 'get_implicit_constraints',Specman 的私有模块
      meth = rf_method 'make_path',Specman 的私有模块
      meth = rf_method 'make_element',Specman 的私有模块
      meth = rf_method 'make_list_size_path',Specman 的私有模块
      meth = rf_method 'is_unit_reference',Specman 的私有模块
      meth = rf_method 'get_id_name_for_port_type',Specman 的私有模块
      meth = rf_method 'get_list_upper_bound',Specman 的私有模块
      meth = rf_method 'get_sv_typename',Specman 的私有模块
      meth = rf_method 'get_sv_name_under_when',Specman 的私有模块
      meth = rf_method 'get_sv_size',Specman 的私有模块
      meth = rf_method 'sv_add_encode_lines',Specman 的私有模块
      meth = rf_method 'sv_get_decode_function_local_var_name',Specman 的私有模块
      meth = rf_method 'sv_get_decode_function_local_var_decl',Specman 的私有模块
      meth = rf_method 'sv_add_decode_lines',Specman 的私有模块
      meth = rf_method 'get_sv_field_name',Specman 的私有模块
      meth = rf_method 'get_sv_field',Specman 的私有模块
      meth = rf_method 'sv_must_be_protected_field',Specman 的私有模块
      meth = rf_method 'sv_add_get_set_field_functions',Specman 的私有模块
      meth = rf_method 'sv_add_get_set_field_function_decs',Specman 的私有模块
      meth = rf_method 'is_sv_exported_field',Specman 的私有模块
      meth = rf_method 'is_sv_determinant_field',Specman 的私有模块
      meth = rf_method 'field_configured_to_svtp_pack',Specman 的私有模块
      meth = rf_method 'get_ovm_field_macro',Specman 的私有模块
      meth = rf_method 'is_internal',Specman 的私有模块
      meth = rf_method 'get',Specman 的私有模块
      meth = rf_method 'eanalyze_lnt',Specman 的私有模块
    没有实际运行请求。
    检查测试...

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

我确信有一种方法可以做你想做的事,但是使用 Specman 的反射接口可能非常困难。

快乐黑客!

于 2010-07-26T20:47:48.383 回答