【问题标题】:Specman: how to retrieve values of var which is stored in another varSpecman:如何检索存储在另一个 var 中的 var 值
【发布时间】:2010-07-26 00:43:56
【问题描述】:

我已将 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;

【问题讨论】:

    标签: specman


    【解决方案1】:

    这称为内省或反思。您必须使用 Specman 的 rf_manager。在文档中搜索它。但是,文档并没有向您展示该单元具有的所有方法。如果您真的想查看所有方法,请运行以下 sn-p 代码:

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

    我不确定如何遍历列表元素,但您可以使用这个 sn-p 查看对 对象的 实例成员(不是子例程的变量)的引用的方法.

    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 的反射接口可能非常困难。

    黑客攻击愉快!

    【讨论】:

    • 嗨,罗斯,感谢您的回答,但使用“print rf_i;”语句,是否打印存储在 A 中的所有列表值?
    • 不,rf_i 是对字段 A 的反射对象的引用。您必须弄清楚如何从该反射字段中梳理出数据。 Specman 的反射界面是一个真正的痛苦。不像使用 Python 的自省那么容易。
    猜你喜欢
    • 1970-01-01
    • 2012-06-19
    • 1970-01-01
    • 2014-08-31
    • 1970-01-01
    • 1970-01-01
    • 2013-09-02
    • 1970-01-01
    • 2020-10-15
    相关资源
    最近更新 更多